批量嵌套for循环返回不正确的值

时间:2017-05-14 12:07:38

标签: windows batch-file for-loop nested-loops

我的脚本中的

问题是索引目录文件时的返回值。 首先,我需要循环我的数组,第二个是在目录中查找文件。返回值仍然没有变化,并显示所有变量的最新值。 是的我知道,这可能是因为我使用 setx 但是使用设置只是它绝对没有用。

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
  )
)

3 个答案:

答案 0 :(得分:2)

  1. 您为什么使用setx?普通set命令不够吗?请注意,setx不会更改当前cmd实例的变量。
  2. if not语句将始终评估为True,因为您已在==的任一侧声明了文字字符串。您的意思是%arch%而不是arch吗?
  3. 您需要!DriverPath!的延迟展开。但是,for /R无法使用延迟扩展的变量,因此您必须将for /R循环移动到子例程中才能使用立即% - 扩展,或者暂时更改为目录并让for /R默认为该(已更改)当前目录。
  4. 切勿在带括号的块中使用::条评论,而是使用rem
  5. 这是固定代码:

    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
    

答案 1 :(得分:0)

::评论更改为传统的rem评论。

::实际上是一个损坏的标签,标签(损坏或其他)导致代码块出现问题(带括号的语句序列)

答案 2 :(得分:0)

另一件事(我猜)是您尝试比较字符串{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

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