在我正在处理的批处理脚本中,在调用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
)
答案 0 :(得分:2)
ERRORCODE保留得很好 - 你只是没有正确访问它。
您的问题是,在解析行时会扩展%ERRORCODE%
,并且在执行FOR循环之前,会同时解析整个带括号的代码块。所以你看到循环执行之前存在的值。
解决方案是使用延迟展开!ERRORCODE!
,这需要setlocal enableDelayedExpansion
。执行该行时会发生延迟扩展。有关延迟扩展的详细信息,请从命令行键入HELP SET
或SET /?
。
set ERRORCODE=0
setlocal enableDelayedExpansion
FOR ... do (
call :myRoutine
echo !ERRORCODE!
)
... etc.