1

在我正在处理的批处理脚本中,在调用 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
)
4

1 回答 1

2

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

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

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

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

... etc.
于 2012-10-15T23:48:40.107 回答