0

バッチ「関数」の戻り値を格納するためにグローバル変数を使用しています。そして、それは奇妙な方法で変化します:

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
4

1 に答える 1

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
    )
    ....
    ....
)
于 2013-10-31T10:59:27.790 に答える