Function 调用内部;功能“;在CMD脚本中,不更新变量

Function 调用内部;功能“;在CMD脚本中,不更新变量,function,batch-file,cmd,Function,Batch File,Cmd,在前几天拼凑的这个NT cmd shell \“批处理文件”中,我使用这个命令——就像我以前在其他脚本中多次做的那样。但其中一个行为奇怪,我不知道可能是什么错 问题是,第一次调用函数时,它会正确返回错误代码并设置(全局)变量%RESULT%,但每次稍后再次调用时,它都无法使用新的错误代码更新变量 下面是有问题的代码的精简版本: :FACL REM run fileacl.exe with given OPTIONS (%1) REM uses global variables %TARGET%

在前几天拼凑的这个NT cmd shell \“批处理文件”中,我使用这个命令——就像我以前在其他脚本中多次做的那样。但其中一个行为奇怪,我不知道可能是什么错

问题是,第一次调用函数时,它会正确返回错误代码并设置(全局)变量
%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%
你看到那些
如果定义了DEBUG…
行了吗?它们向我显示,在函数内部,后续调用将成功,从而打印出预期的0的
%\u RESULT%
,但全局
%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:

函数内部:RESULT_=107无法确定,因为我们无法在上下文中看到实际代码。但是,如果fix2调用和ECHO位于括号内的块中,那么您描述的行为是可以预期的——可能是if语句或FOR循环的一部分

如果是这种情况,那么您需要在括号内使用延迟展开,因为整个块在执行之前被解析,而%RESULT%在解析时被展开


使用
设置EnableDelayedExpansion
启用延迟扩展,然后使用
!结果
而不是
%RESULT%
以在执行时而不是在分析时获取RESULT的值。

无法确定,因为我们无法在上下文中看到实际的代码。但是,如果fix2调用和ECHO位于括号内的块中,那么您描述的行为是可以预期的——可能是if语句或FOR循环的一部分

如果是这种情况,那么您需要在括号内使用延迟展开,因为整个块在执行之前被解析,而%RESULT%在解析时被展开


使用
设置EnableDelayedExpansion
启用延迟扩展,然后使用
!结果
而不是
%RESULT%
以在执行时而不是在解析时获取RESULT的值。

我曾经复制过类似于您的结果的内容,结果与您的结果不同,即,它们每次都不同,正如我所预期的那样。顺便问一下,您是否意识到在
endlocal
行的
%\u RESULT%
之后存储了额外的空间?我不确定这是否与你目前的问题有关,只是让你知道。注意额外的空间!我通过使用
SET/A RESULT=…
来解决这个问题,以确保存储的值是一个数字。我过去常常复制一些类似于您的结果的东西,结果与您的结果不同,也就是说,它们每次都不同,就像我预期的那样。顺便问一下,您是否意识到在
endlocal
行的
%\u RESULT%
之后存储了额外的空间?我不确定这是否与你目前的问题有关,只是让你知道。注意额外的空间!我通过使用
SET/A RESULT=…
来确保存储的值是一个number.dbenham来解决这个问题,您完全正确:后续的“函数”调用都在一个带括号的IF块内!我经常使用延迟扩展,但没有想到在这里应用。dbenham,你完全正确:后续的“函数”调用都在带括号的IF块中!我经常使用延迟扩展,但没有想到会在这里应用。