批量嵌套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 
) 
) 
+0

你在'如果NOT'声明表示'%拱%'? (字符串“arch”不等于字符串“32”)您是否在'for'循环之前添加了'setlocal enableDelayedExpansion? – SteveFest

  1. 你为什么要使用setxset命令是否正常?请注意,setx不会更改当前cmd实例的变量。
  2. if not声明将始终评估为True,因为您已在==的任一侧声明了文字字符串。你的意思是%arch%而不是arch
  3. 您需要延迟扩展!DriverPath!。但是,for /R不能使用延迟扩展的变量,因此您必须将for /R循环移动到子例程中以便能够立即使用%扩展,或者您暂时更改为该目录,并让for /R默认为该(更改的)当前目录。
  4. 绝对不要在带括号的块中使用::注释,请改为使用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 

始终使用引号"代替{},因为它们是安全的。

+0

哦,是的,我忘了%%,但这没有问题 – DimmuBoy

+1

'%arch%'和'arch'是两码事。 – SteveFest