无忧启动论坛

标题: 从补丁文件获取系统版本,怎么只取最后一个值?(已解决) [打印本页]

作者: 窄口牛    时间: 2022-3-13 19:06
标题: 从补丁文件获取系统版本,怎么只取最后一个值?(已解决)
本帖最后由 窄口牛 于 2022-3-14 07:24 编辑
  1. for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  2.     if exist %%i:\windows\winsxs\*_microsoft-windows-servicingstack_31bf3856ad364e35_* (
  3.         if defined oslist (
  4.             set "oslist=!oslist! %%i"
  5.         ) else (
  6.             set "oslist=%%i"
  7.         )
  8.         for /f "tokens=4 delims=_" %%a in ('dir /b /d %%i:\windows\winsxs\*_microsoft-windows-servicingstack_31bf3856ad364e35_* /on^|find "serv"') do (
  9.             set "winver_%%i=%%a"
  10.         )
  11.     )
  12. )

  13. if defined oslist for %%a in (!oslist!) do (
  14.     for %%b in (!winver_%%a!) do (
  15.         echo;%%a    %%b
  16.     )
  17. )
  18. pause
复制代码
xp也会有winsxs,所以必须比较完整的路径判断。
作者: nttwqz    时间: 2022-3-13 19:37
遍历完了自动就是最后一个值,for执行很快的。

话说,最好将if移出来。记得版本号貌似可以直接if判断
作者: nttwqz    时间: 2022-3-13 20:50
那你这不叫取最后一个值,这叫取最大值
作者: nttwqz    时间: 2022-3-13 21:57
本帖最后由 nttwqz 于 2022-3-13 23:58 编辑
窄口牛 发表于 2022-3-13 20:54
dir就排序了,最大的肯定是最后一个(每个分区的)。


总感觉之前为谁写过,忘记了。

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  4.     if exist %%i:\windows\winsxs (
  5.         if defined oslist (
  6.             set "oslist=!oslist! %%i"
  7.         ) else (
  8.             set "oslist=%%i"
  9.         )
  10.         for /f "tokens=4 delims=_" %%a in ('dir /b /d %%i:\windows\winsxs\*_microsoft-windows-servicingstack_31bf3856ad364e35_* /on^|find "serv"') do (
  11.             set "winver_%%i=%%a"
  12.         )
  13.     )
  14. )

  15. if defined oslist for %%a in (!oslist!) do (
  16.     for %%b in (!winver_%%a!) do (
  17.         echo;%%a    %%b
  18.     )
  19. )
  20. pause
复制代码

作者: nttwqz    时间: 2022-3-13 22:38
窄口牛 发表于 2022-3-13 22:35
不对,这就成了最后一个分区的最大补丁得值了,把其它分区的都丢了。看得我头晕,改都不会改。

你试过了?

我这单系统不便测试。。。
作者: nttwqz    时间: 2022-3-14 00:00
有个地方复制粘贴错了,已经改正。。。
作者: 窄口牛    时间: 2022-3-14 07:19
本帖最后由 窄口牛 于 2022-3-14 07:25 编辑

可以了。for一套就晕了。应该没有写过,这种判断方法未见有人公开过。
作者: nttwqz    时间: 2022-3-14 10:29
本帖最后由 nttwqz 于 2022-3-14 10:42 编辑
窄口牛 发表于 2022-3-14 07:19
可以了。for一套就晕了。应该没有写过,这种判断方法未见有人公开过。

  1. for %%a in (c d e) do (
  2.     echo %%a
  3.     for %%a in (1 2 3) do echo %%a
  4. )
  5. pause
复制代码



这么写,估计你能看明白,for是从外到内,从c开始会将do后面()内的执行一遍,然后是d,再将do后面()内的执行一遍,最后是e,即使是用了相同的变量%%a也是如此。文本文件也是如此,是一行文本do后面()的就会执行一遍,并不是一行代码将整个文本遍历一遍,然后再第二行代码。

遇到嵌套的for,从c开始这个嵌套for执行完再d,最后是e。如过是三重嵌套,那就是c,1,第三重for;d,2,第三重for。。。
作者: 窄口牛    时间: 2022-3-14 10:35
这个知道,主要是不会控制执行次数,也就是要组合还是只排列。
作者: 黑中见白    时间: 2022-3-14 11:20
直接读取reg
作者: nowayer    时间: 2023-10-23 07:37
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3