使用全局变量作为批处理函数的返回存储

时间:2013-10-31 10:41:43

标签: batch-file

我正在使用全局变量来存储批处理“函数”的返回值。 它以奇怪的方式改变:

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

1 个答案:

答案 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
    )
    ....
    ....
)