variable を持つ a.bat と、%errorlevel%
b.bat を呼び出す次の行があります。
start /wait cmd /c b.bat
b.bat
を設定する場合%errorlevel%
(例: errorlevel = 5
)
CALL コマンドを使用せず%errorlevel%
に、この変数のみを に永続化するにはどうすればよいですか。a.bat
CALL を使用したくない理由は、保持したくb.bat
ない変数が含まれているためです。
variable を持つ a.bat と、%errorlevel%
b.bat を呼び出す次の行があります。
start /wait cmd /c b.bat
b.bat
を設定する場合%errorlevel%
(例: errorlevel = 5
)
CALL コマンドを使用せず%errorlevel%
に、この変数のみを に永続化するにはどうすればよいですか。a.bat
CALL を使用したくない理由は、保持したくb.bat
ない変数が含まれているためです。
スクリプト間で通信するために内部変数を公開する必要はありません。%ERRORLEVEL%
通常の引数を使用して、呼び出されたスクリプトに値を送信し、環境変数から数値結果を取得できます。次のサンプルでa.cmd
は、引数を に渡し、b.cmd
その実行結果を (から%ERRORLEVEL%
)受け取ります。
:: a.cmd ----
SETLOCAL
SET ARGUMENT=123
CALL b.cmd "%ARGUMENT%"
SET RESULT=%ERRORLEVEL%
ECHO B returned this numeric value as result (%RESULT%)
:: b.cmd ----
SETLOCAL
SET OTHERVAR=%~1
ECHO B received this value as argument (%OTHERVAR%)
EXIT /B 33000
変数に予約名を使用しないようにという提案を強化します (@dbenham もコメントしているように)。
この回答は、最初に投稿されてから大幅に編集されました。
コマンドは現在書かれているとおりに機能するはずですが、START を使用するメリットはありません。単純に使用する方がはるかに簡単で効率的です。
cmd /c "b.bat"
b.bat によって設定された ERRORLEVEL は、CMD コマンドによって返される必要があります。もちろん、Windows によって維持される動的な値をマスクする ERRORLEVEL という名前の独自の環境変数を作成した場合、これは機能しません。
ただし、(可能であれば) b.bat を変更SETLOCAL
して先頭に配置した方がよいと思います。b.bat で定義された変数は一時的なものであり、スクリプトが終了すると忘れられます。その後、CALL を使用できます。b.bat の変数はなくなりますが、呼び出し元に対して ERRORLEVEL が適切に設定されます。
b.バット
@echo off
setlocal
set var=This value will be "forgotten" when b.bat ends
dir "This does not exist so ERRORLEVEL will be set to 1"
caller.bat
@echo off
set var=
call b.bat
echo ERRORLEVEL=%errorlevel%
set var
しかし、あなたのコメントに基づいて、b.bat に次のような行があるように聞こえます。
set errorlelvel=%errorsaved%
ERRORLEVEL が使用されるはずの機能を壊してしまうため、そのように ERRORLEVEL に独自の値を定義するべきではありません。
代わりに、スクリプトの最後で EXIT /B を使用してエラーレベルを設定する必要があります
@echo off
setlocal
...
set someVar=anything. This value will be gone at script end because of SETLOCAL
...
someCommandThatGeneratesAnError
set errorsaved=%errorlevel%
...
exit /b %errosaved%
(ERRORLEVEL ではなく) b.bat からユーザー定義変数を選択的に永続化しようとしている場合は、b.bat を変更SETLOCAL
して先頭に配置ENDLOCAL
し、多数のメソッドのいずれかと組み合わせて使用して値を永続化する必要があります。 ENDLOCAL バリアを越えて。環境変数を有効にする ENDLOCALに対する上位 3 つの投票済み回答をご覧ください。