使用CALL命令在FOR循环中出现意外的Windows批处理脚本行为

时间:2012-10-15 23:29:14

标签: windows batch-file

在我正在处理的批处理脚本中,在调用2个子例程之后,不会保留变量值,而是从批处理脚本的FOR循环中调用另一个子例程。 这是一个演示场景的代码片段:

set ERRORCODE=0
FOR ... do (
    call :myRoutine

    @ECHO %ERRORCODE%        // Here I am expecting the ERRORCODE to be a 1 (non-zero), but I am seeing that it is getting reset to 0
)

myRoutine:
call :another
IF %ERRORCODE% NEQ 0 GOTO :EOF  // Here I am getting the ERRORCODE as 1 as expected
...
GOTO :EOF


another:
something went wrong here..
IF %ERRORLEVEL% NEQ 0 (
    set ERRORCODE=1
    GOTO :EOF
)

1 个答案:

答案 0 :(得分:2)

ERRORCODE保留得很好 - 你只是没有正确访问它。

您的问题是,在解析行时会扩展%ERRORCODE%,并且在执行FOR循环之前,会同时解析整个带括号的代码块。所以你看到循环执行之前存在的值。

解决方案是使用延迟展开!ERRORCODE!,这需要setlocal enableDelayedExpansion。执行该行时会发生延迟扩展。有关延迟扩展的详细信息,请从命令行键入HELP SETSET /?

set ERRORCODE=0
setlocal enableDelayedExpansion
FOR ... do (
  call :myRoutine
  echo !ERRORCODE!
)

... etc.