嵌套 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
,但失败了。你可以:
将 %%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.
或者确保包含%%a
的sub-routine中的代码在for
循环体中运行,因为for
meta-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%
我需要获取每台远程机器的当前屏幕分辨率(相同的 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
,但失败了。你可以:
将
%%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.或者确保包含
%%a
的sub-routine中的代码在for
循环体中运行,因为for
meta-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%