调用内部"功能"在CMD脚本中不更新变量

时间:2012-01-23 22:36:35

标签: function batch-file cmd

在这个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

您可能会问:您还尝试了什么?好:

  1. 删除了setlocal\endlocal技巧,并使用了全局%RESULT%变量
  2. 每次调用函数前明确未定义%RESULT%%_RESULT_%(例如set RESULT=
  3. ......所有结果相同。这里有什么我想念的吗?

1 个答案:

答案 0 :(得分:4)

无法确定,因为我们无法在上下文中看到实际代码。但是,如果FIX 2 CALL和ECHO位于带括号的块中,则可以预期您所描述的行为 - 可能是IF语句或FOR循环的一部分。

如果是这种情况,则需要在括号内使用延迟扩展,因为在执行之前解析整个块,并且在解析时扩展%RESULT%。

使用SET EnableDelayedExpansion启用延迟扩展,并使用!RESULT!代替%RESULT%在执行时而不是在解析时获取RESULT的值。