嵌套 for 循环:使用批处理脚本将当前屏幕分辨率存储为各种远程计算机的变量

Nested for loop: Storing current screen resolution as a variable for various remote machines using batch script

我需要获取每台远程机器的当前屏幕分辨率(相同的 IP 存储在 .txt 文件中)并将其作为变量存储在脚本中以供进一步使用。

我能够遍历 .txt 文件中的机器,并且能够将屏幕分辨率存储为变量,但我无法在所有机器的循环中执行此操作。 谁能告诉我哪里出错了? 如何在后面的代码中使用 use %%a set in first for 和 next for loop?

Set MyFile=VMs.txt
rem VMs.txt contains IPs of the machines

for /f "usebackq delims=" %%a in ("%MyFile%") do call :compare
    
:compare
for /f "tokens=2 delims==" %%i in ('wmic /node:"%%a" path Win32_VideoController get CurrentVerticalResolution /value ^| find "="') do set height=%%i
echo %height% 

您尝试访问被调用的 sub-routine :compare 中的 for 循环 meta-variable %%a,但失败了。你可以:

  1. %%a 作为参数传递给 sub-routine 并通过 %1 访问它:

     Set "MyFile=VMs.txt"
     rem VMs.txt contains IPs of the machines
    
     for /f "usebackq delims=" %%a in ("%MyFile%") do call :compare %%a
     goto :EOF
    
     :compare
     for /f "tokens=2 delims==" %%i in ('wmic /node:"%~1" path Win32_VideoController get CurrentVerticalResolution /value ^| find "="') do set "height=%%i"
     echo(%height%
    

    %~1 中的 ~ 字符确保传递的参数不带引号(尽管此处可能不需要),因此表达式 [=19= 周围只有一对引号].

    注意命令 goto :EOF,它可以防止在第一个 for /f 循环结束时无意中执行后续代码。

    还要注意引用的 set 语法,它保护特殊字符并避免无意的尾随 white-spaces.

  2. 或者确保包含%%a的sub-routine中的代码在for循环体中运行,因为formeta-variable 是全局的,但它们只能在 for 循环上下文中访问,这不再适用于 sub-routine,即使调用来自循环体。

    到re-establishsub-routine中的循环上下文,只需将相关代码放在只迭代一次的for循环中:

     Set "MyFile=VMs.txt"
     rem VMs.txt contains IPs of the machines
    
     for /f "usebackq delims=" %%a in ("%MyFile%") do call :compare
     goto :EOF
    
     :compare
     for %%j in (.) do for /f "tokens=2 delims==" %%i in ('wmic /node:"%%a" path Win32_VideoController get CurrentVerticalResolution /value ^| find "="') do set "height=%%i"
     echo(%height%