インストーラーのラッパーであるバッチファイルがあります。このバッチファイルは、インストーラーによって返されたエラーレベルをチェックし、それに応じて出力します。
(同じコマンドウィンドウ/環境で)バッチファイルを開始する直前のコマンドプロンプトでset ERRORLEVEL=0
を実行すると、インストーラーがエラーレベルを変更することはなく、バッチスクリプトは常に成功を返します。 %ERRORLEVEL%
はWindowsによって定義された変数であり、プログラムやスクリプトからのエラーを出力するために特別に使用され、バッチファイルなどで変数を使用することは、「自己責任」であると考えられます。別のプロセスによっていつでも変更されました。
どうやら、私が与えられた環境でerrorlevelを設定すると、終了コードのホルダーとしてのerrorlevelの使用が何らかの形で終了します。これがなぜなのか誰か知っていますか?私にとっては、ただの奇妙な予期しない振る舞いです。この件に関する情報があれば大歓迎です!
システム変数を通常のものに再定義しています。これを行うと、システムはコマンドセッションが閉じられるまでそれを使用しません。
最良の方法は使用することです
exit /b 0
別のバッチファイルで、プライマリスクリプトから呼び出します。ここで、0は希望するerrorlevel
です。それか、echo、findstrなど、errorlevel
をリセットするコマンドを使用します。
たとえば、次のコマンドはすべて、バッチファイル内でERRORLEVEL
を0に設定します。
VERIFY > nul
cmd /c "exit /b 0"
ver > nul
ERRORLEVEL、PATH、CD、DATE、TIMEなどの動的なシステム変数に独自の値を割り当てないでください。そうすると、コードが動的な値を参照できなくなります。ユーザー定義値を未定義にするだけで、動的な値を復元できます。例えば:
set "errorlevel="
エラーレベルを0に強制したい場合、これは完全に直観的ではありませんが、非常に効果的な構文(call )
を使用できます。通話後のスペースは重要です。エラーレベルを1に設定する場合は、(call)
を使用できます。電話の後にはスペースがないことが重要です。
(call)
echo %errorlevel%
(call )
echo %errorlevel%
エラーレベルを設定するためのより直感的ではあるがあまり便利ではない方法は、バッチファイルで専用のサブルーチンを使用することです。
call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b
:setErr
exit /b %1
または、コマンドラインで使用する場合
cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
私は個人的にこれを使用します:
cd .
UNIXシェルでも機能します。
ErrorLevel
状態をリセットする他のいくつかの方法を次に示します。これらはMS-DOSでも機能します(少なくともバージョン6.22の場合)。
more < nul > nul
rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul
次のメソッドはMS-DOSでのみ機能します。
command /? > nul
fc nul nul > nul
完全を期すために、これはErrorLevel
状態を1
に設定します。これは、WindowsとMS-DOSの両方に有効です。
< nul find ""
これが私が見つけた唯一の動作です。
call (exit /b 0)
ERRORLEVELを検出するサードパーティスクリプトを使用するスクリプトで必要ですが、エラーレベルを適切にリセットしていません。
これらも機能します:(エラーレベルを1に設定)
color 00
echo A | find "B"
これを使用してエラーレベル1-26を設定することもできます。
echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n