我正在使用全局变量来存储批处理“函数”的返回值。 它以奇怪的方式改变:
result local = 1
result global = 1
result = 4
因此,在函数调用之后,某种结果会变回4。这有什么不对?
set result=4
if %build%==1 (
call :build_1
echo "result=%result%"
if %result%==4 (
exit /b 4
goto error
)
call :build_2
if %result%==4 (
exit /b 4
goto error
)
call :build_3
if %result%==4 (
exit /b 4
goto error
)
call :build_4
if %result%==4 (
exit /b 4
goto error
)
goto success
)
rem return error/success code in result variable
:build_1
setlocal
rem Stage 1
call :build_one_unit
if %errorlevel%==4 (
echo FAILED!
set result=4
exit /b
)
rem Stage 2
call :build_one_unit
if %errorlevel%==4 (
echo FAILED!
set result=4
exit /b
)
set result=1
echo "result local = %result%"
endlocal & set result=%result%
echo "result global = %result%"
goto:eof
答案 0 :(得分:3)
您的if %build%==1 ( ...... )
,是的,从左括号到近括号,被读取并解释为块。发生这种情况时,结果变量的值为4.解释块时,所有变量都将替换为其值。不是在执行到达if %result%==4
的行时,而是在处理初始if时。
您需要的是延迟变量扩展。它允许你使用变量!var! (而不是%var%)表示法,告诉cmd在访问时需要检查/替换这些变量,而不是在解释块时。您的代码应为:
setlocal enabledelayedexpansion
set return=4
if %build%==1 (
call :build_1
echo "result=!result!"
if !result!==4 (
exit /b 4
goto error
)
....
....
)