批量嵌套for循环返回不正确的值
问题描述:
我的脚本中的问题是索引目录文件时返回值。 首先我需要循环我的数组,第二个用于在目录中查找文件。返回值仍然没有变化,并显示所有变量的最新值。 是的,我知道,这可能是因为我使用setx但设置只有它不能正常工作。批量嵌套for循环返回不正确的值
for /L %%G in (1,1,%i%) do (
if NOT {arch}=={32} (
setx DriverPath !DefaultPath!driver\!DriverPath64[%%G]! >nul 2>&1
) else (
setx DriverPath !DefaultPath!driver\!DriverPath32[%%G]! >nul 2>&1
)
:: looking for inf file
for /r "%DriverPath%\" %%f in (*.inf) do (
set PrinterDriverInf[%%G]=%%f
)
)
答
- 你为什么要使用
setx
?set
命令是否正常?请注意,setx
不会更改当前cmd
实例的变量。 -
if not
声明将始终评估为True,因为您已在==
的任一侧声明了文字字符串。你的意思是%arch%
而不是arch
? - 您需要延迟扩展
!DriverPath!
。但是,for /R
不能使用延迟扩展的变量,因此您必须将for /R
循环移动到子例程中以便能够立即使用%
扩展,或者您暂时更改为该目录,并让for /R
默认为该(更改的)当前目录。 - 绝对不要在带括号的块中使用
::
注释,请改为使用rem
。
这里是固定的代码:
setlocal EnableDelayedExpansion
for /L %%G in (1,1,%i%) do (
if not "%arch%"=="32" (
setx DriverPath !DefaultPath!driver\!DriverPath64[%%G]! >nul 2>&1
set "DriverPath=!DefaultPath!driver\!DriverPath64[%%G]!"
) else (
setx DriverPath !DefaultPath!driver\!DriverPath32[%%G]! >nul 2>&1
set "DriverPath=!DefaultPath!driver\!DriverPath32[%%G]!"
)
rem looking for inf file
call :SUB PrinterDriverInf[%%G] "%DriverPath%"
)
endlocal
goto :EOF
:SUB
for /R "%~2" %%f in (*.inf) do (
set "%~1=%%f"
)
goto :EOF
你甚至可以简化这样的代码:
setlocal EnableDelayedExpansion
if not "%arch%"=="32" set "arch=64"
for /L %%G in (1,1,%i%) do (
setx DriverPath !DefaultPath!driver\!DriverPath%arch%[%%G]! >nul 2>&1
set "DriverPath=!DefaultPath!driver\!DriverPath%arch%[%%G]!"
rem looking for inf file
pushd "!DriverPath!" && (
for /R %%f in (*.inf) do (
set "PrinterDriverInf[%%G]=%%f"
)
popd
)
)
endlocal
答
更改::
评论到传统rem
评论。
::
实际上是一个破碎的标签和标签(破碎或以其他方式)引起的问题的代码块(parenthesised语句序列)
+0
唉...没有发现....我只抓到了{{}} == {32}'的问题 – SteveFest
答
另一件事(我猜)是你试图比较字符串{arch}
和{32}
。
这就是命令解析器看到:
if the string {arch} equals {32}, do something
我猜你想这样的:
if the content of arch variable equals 32, do something
如果是这样,这将成为命令 为你。
if "%arch%"=="32" echo your commands here
始终使用引号"
代替{
和}
,因为它们是安全的。
你在'如果NOT'声明表示'%拱%'? (字符串“arch”不等于字符串“32”)您是否在'for'循环之前添加了'setlocal enableDelayedExpansion? – SteveFest