Windowsバッチスクリプト内のエラーを処理するためのよくある方法は、次のようなものを使用することです。if errorlevel 1 ...
またはif %errorlevel% neq 0 ...
。多くの場合、エラー処理コードでERRORLEVELを保持する必要があります。
すべての外部コマンドによって常にERRORLEVELが何らかの値に設定されると思います。そのため、エラー処理コードは、外部コマンドを実行する前に、環境変数にERRORLEVELを保持する必要があります。
しかし、内部コマンドはどうですか?問題は、一部の内部コマンドは、成功したときにERRORLEVELを0にクリアし、一部はクリアしないことです。また、どのコマンドが何を実行するかを指定するドキュメントが見つかりません。
したがって、問題は、成功したときにどの内部コマンドがERRORLEVELを0にクリアするかということですこれはnot返されたERRORLEVELコードに関する一般的な質問ですが、厳密には成功結果に関する質問です。
ERRORLEVELをゼロにリセットする最も簡単な方法は何ですか? および Windowsバッチファイル:.bat vs .cmd? のような投稿があり、部分的な回答が得られます。しかし、私は包括的なリストを見たことがありません。
注:私はこれについて何年も興味がありました。それで、私はついにたくさんの実験を実行して、決定的な答えを思いつくことに決めました。私が見つけたものを共有するためにこのQ&Aを投稿しています。
この回答は、Windows 10で実行した実験に基づいています。cmd.exeを使用する以前のWindowsバージョンとの違いは疑わしいですが、可能です。
また注意-この回答は、内部コマンドでエラーが発生した場合のERRORLEVELの結果を文書化しようとはしません(DELとERASEに関するわずかなビットを除く)
コマンド間に違いがあるだけでなく、単一のコマンドがコマンドラインから実行されたか、_.bat
_拡張子の付いたバッチスクリプト内から実行されたか、_.cmd
_のバッチスクリプト内から実行されたかによって、動作が異なる場合があります。 SOMECODE)__拡張子。
次の一連のコマンドは、コンテキストに関係なく、成功時にERRORLEVELを0にクリアすることはありませんが、代わりに前のERRORLEVELを保持します。
次の一連のコマンドは、コンテキストに関係なく、成功すると常にERRORLEVELを0にクリアします。
次に、コマンドラインから発行された場合、または拡張子が_.bat
_のスクリプト内の場合、成功時にERRORLEVELをクリアしないコマンドがありますが、_.cmd
_のスクリプトから発行された場合はERRORLEVELを0にクリアします。拡張。 https://stackoverflow.com/a/148991/101205 および https://groups.google.com/forum/#!msg/Microsoft.public.win2000.cmdprompt)を参照してください。詳細については、admin/XHeUq8oe2wk/LIEViGNmkK0J を参照してください。
最後に、前のカテゴリのいずれにもうまく当てはまらない次のコマンドがあります。
CALL :: routineまたはバッチスクリプトがCALLされている場合、ERRORLEVELはCALLedスクリプトまたは:routineによって排他的に制御されます。ただし、コマンドに対する他のタイプの成功したCALLは、CALLedコマンドが他の方法で設定しない場合、常にERRORLEVELを0にクリアします。
例:_call echo OK
_。
EXIT:_/B
_なしで使用すると、cmd.exeセッションが終了し、ERRORLEVELはなくなり、cmd.exeの戻りコードのみが返されます。明らかに、_EXIT /B 0
_はERRORLEVELを0にクリアしますが、値のない_EXIT /B
_は前のERRORLEVELを保持します。
私が見逃した文書化されていないコマンドがない限り、それはすべての内部コマンドを説明していると思います。
CALL
コマンドの説明が不完全です。
CALL:CALLedコマンドでERRORLEVELが設定されていない場合は、ERRORLEVELをクリアします。例:
call echo OK
。
この小さな例を確認してください。
@echo off
call :setTwo
echo Set two: %errorlevel%
call :preserve
echo Preserve: %errorlevel%
call echo Reset
echo Reset: %errorlevel%
call :subNotExists 2> NUL
echo Sub not exist: %errorlevel%
goto :EOF
:setTwo
exit /B 2
:preserve
echo Preserve
exit /B
出力:
Set two: 2
Preserve
Preserve: 2
Reset
Reset: 0
Sub not exist: 1
CALL
の説明は次のようになります。
call echo OK
ただし、呼び出されたコマンドがサブルーチンの場合は、前のERRORLEVELが保持されます。呼び出されたサブルーチンが存在しない場合は、ERRORLEVELを1に設定します。