【问题标题】:batch wmi for loop批处理 wmi for 循环
【发布时间】:2014-07-13 23:39:00
【问题描述】:

我在 for 循环中使用 wmi 时遇到问题。我只是想获取操作系统版本的第一个数字来区分 XP (5) 和 Win7 (6)。

以下内容本身可以很好地查询单台机器。

for /f "tokens=1 delims=." %%a in ('wmic /node:%machine% os get version') do @for /f "tokens=1 delims=." %%b in ("%%a") do @set osver=%%b
echo %osver%

但是,一旦我尝试将其放入 for 循环中,我只会得到 %osver% 的空白

for /f %%G in (list.txt) do (
    for /f "skip=2 tokens=2 delims=.," %%a in ('wmic /node:%%G os get version /format:csv') do @for /f "tokens=1 delims=." %%b in ("%%a") do @set osver=%%b
    echo %osver%
) > results.txt

我假设这是我的 skip/tokens/delims 的问题,但我不确定如何找出它到底哪里出了问题。我尝试过的任何变体仍然会导致空白行。

【问题讨论】:

    标签: batch-file for-loop wmic


    【解决方案1】:

    您也不必将 %%b 设置为 osver,如果您只需要回显 %%b 的值,您也可以回显 %%b,因为​​它本身就是一个仅可用于方法的变量它是在其中声明的.. 如果您打算在 for 正文之外使用它,则只能创建一个实例变量..

    因此,如果您想在其他地方使用它,您可能应该坚持使用 enabledelayedexpansion ...

    你也应该用括号括起来你的语句,以避免代码混淆......

    【讨论】:

    • 你如何自己回显 %%b? echo %%b 显示为 %b
    • 只有在使用批处理文件时才会回显 %%b,如果是在命令行中工作,则回显前面的 %..
    【解决方案2】:

    我会说你假设错了。

    在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何%var% 都将替换为该变量的值在分析块时 - 在块执行之前 - 同样适用于FOR ... DO (block)

    因此,IF (something) else (somethingelse) 将在遇到IF 时使用%variables% 的值执行。

    解决此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion 并使用 !var! 代替 %var% 来访问 var 的更改值或 2) 调用子程序以使用改变了值。

    因此请注意CALL ECHO %%var%% 的使用,它显示var 的更改值。 CALL ECHO %%errorlevel%% 显示,但遗憾的是 RESETS errorlevel。

    所以,我预测 call echo %%osver%% 代替 echo %osver% 可以解决您的问题。

    OTOH,echo %%b 可能会更轻松、更快捷。


    for /f %%G in (list.txt) do (
     for /f "skip=2 tokens=2 delims=.," %%a in (
      'wmic /node:%%G os get version /format:csv'
      ) do for /f "tokens=1 delims=." %%b in ("%%a") do (
       set osver=%%b
       echo %%b
      )
     CALL echo %%osver%%
    ) > results.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多