在这个NT cmd shell \“批处理文件”中,我前几天拼凑了一起,我正在使用call命令run sections of the script like functions - 正如我之前在其他脚本中做过很多次一样。但其中一个表现得很奇怪,我无法弄清楚可能出现的问题......
问题是第一次调用函数时它会正确返回错误代码并设置(全局)变量%RESULT%
,但每次稍后调用它时都无法使用新的错误代码更新变量。
以下是相关代码的简化版本:
:FACL
REM run fileacl.exe with given OPTIONS (%1)
REM uses global variables %TARGET% and %LOGPATH%, sets global %RESULT%
setlocal
set _OPTIONS_=%*
fileacl.exe "%TARGET%" %_OPTIONS_% /SILENT >%LOGPATH%\temp.out 2>%LOGPATH%\temp.err
set _RESULT_=%ERRORLEVEL%
if defined DEBUG echo INSIDE FUNCTION: _RESULT_ = %_RESULT_%
endlocal & set RESULT=%_RESULT_% & goto :EOF
该函数在以下行中调用:
call :FACL /LINE
if defined DEBUG echo AFTER TEST #1: RESULT = %RESULT%
...
call :FACL /INHERIT /REPLACE /FORCE
if defined DEBUG echo AFTER FIX #2: RESULT = %RESULT%
你看到那些if defined DEBUG...
行吗?他们告诉我,在函数内部,后续调用是成功的,因此打印出预期的%_RESULT_%
0,但全局%RESULT%
保持不变。这是一些示例输出:
TEST #1:
INSIDE FUNCTION: _RESULT_ = 107 <-- that's what I expect for the first call
AFTER TEST #1: RESULT = 107 <-- the variable was properly set after the first call
FIX #2:
INSIDE FUNCTION: _RESULT_ = 0 <-- command succeeded :)
AFTER FIX #2: RESULT = 107 <-- variable didn't change :(
RETEST:
INSIDE FUNCTION: _RESULT_ = 0 <-- succeeded again
AFTER RETEST: RESULT = 107 <-- still didn't change
您可能会问:您还尝试了什么?好:
setlocal\endlocal
技巧,并使用了全局%RESULT%
变量%RESULT%
和%_RESULT_%
(例如set RESULT=
)......所有结果相同。这里有什么我想念的吗?
答案 0 :(得分:4)
无法确定,因为我们无法在上下文中看到实际代码。但是,如果FIX 2 CALL和ECHO位于带括号的块中,则可以预期您所描述的行为 - 可能是IF语句或FOR循环的一部分。
如果是这种情况,则需要在括号内使用延迟扩展,因为在执行之前解析整个块,并且在解析时扩展%RESULT%。
使用SET EnableDelayedExpansion
启用延迟扩展,并使用!RESULT!
代替%RESULT%
在执行时而不是在解析时获取RESULT的值。