1

私が取り組んでいるバッチ スクリプトでは、バッチ スクリプトの FOR ループから 2 つのサブルーチンを呼び出した後、変数値が保持されません。シナリオをデモするコード スニペットを次に示します。

set ERRORCODE=0
FOR ... do (
    call :myRoutine

    @ECHO %ERRORCODE%        // Here I am expecting the ERRORCODE to be a 1 (non-zero), but I am seeing that it is getting reset to 0
)

myRoutine:
call :another
IF %ERRORCODE% NEQ 0 GOTO :EOF  // Here I am getting the ERRORCODE as 1 as expected
...
GOTO :EOF


another:
something went wrong here..
IF %ERRORLEVEL% NEQ 0 (
    set ERRORCODE=1
    GOTO :EOF
)
4

1 に答える 1

2

ERRORCODE は問題なく保持されます - 適切にアクセスしていないだけです。

あなたの問題は%ERRORCODE%、行が解析されるときに展開され、FORループが実行される前に、括弧で囲まれたコードブロック全体が一度に解析されることです。したがって、ループが実行される前に存在していた値が表示されます。

!ERRORCODE!解決策は、 を必要とする遅延展開 を使用することsetlocal enableDelayedExpansionです。行が実行されると遅延展開が発生します。遅延展開の詳細については、コマンド ラインからHELP SETorを入力してください。SET /?

set ERRORCODE=0
setlocal enableDelayedExpansion
FOR ... do (
  call :myRoutine
  echo !ERRORCODE!
)

... etc.
于 2012-10-15T23:48:40.107 に答える