ERRORLEVELを0に設定


14

インストーラーのラッパーであるバッチファイルがあります。このバッチファイルは、インストーラーによって返されたエラーレベルをチェックし、それに応じて印刷します。

set ERRORLEVEL=0(同じコマンドウィンドウ/環境で)バッチファイルを開始する直前にコマンドプロンプトで実行すると、インストーラーがerrorlevelに干渉することはなく、バッチスクリプトは常に合格を返します。私は%ERRORLEVEL%Windowsによって定義された変数であり、特にプログラムやスクリプトからエラーを出力するために使用され、バッチファイルまたは他の何かで変数を使用すると、いつでも変更される可能性があるため、「あなた自身のリスクがある」と仮定します別のプロセス。

どうやら、特定の環境でerrorlevelを設定すると、終了コードのホルダーとしてerrorlevelの使用が何らかの形で終了します。これはなぜだれか知っていますか?私にとって、その奇妙な予期しない動作。この件に関する情報は大歓迎です!


回答:


14

システム変数を通常の変数に再定義しています。これを行うと、システムはコマンドセッションが終了するまで使用しません。

最良の方法は、使用することです

exit /b 0

別のバッチファイルで、プライマリスクリプトから呼び出します。番号0はあなたが望んでいるところerrorlevelです。それか、errorlevelecho、findstrなどのをリセットするコマンドを使用してください。

たとえば、次のコマンドはERRORLEVEL、バッチファイル内ですべて0に設定されます。

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
ほぼ正しい。を使用してユーザー定義値を未定義にするだけで、動的なERRORLEVELを使用する「システム」を取得できますset "errorlevel="
-dbenham

Windowsでシステム変数を通常のシステム変数に再定義できるのはなぜですか?両方の定義がまだ存在しますか?そのちょうどエコーと他のそのようなコマンドは現在通常のものを指しますか?だから、プログラムはまだシステム変数を更新している可能性があり、コマンドプロンプトからアクセスできないだけですか?
ユーザー972276

1
「どちらか、またはecho、findstrなど、エラーレベルをリセットするコマンドを使用してください。」echoコマンドは、errorlevel変数をリセットしませ
antred

他の人が言ったようにすれば、errorlevel 変数が持つユーザー/バッチによる「手動」に設定されている"set errorlevel=0"errorlevel変数はもはや終了コードを反映していないでしょうが、あなたはまだして終了コードにアクセスすることができますif errorlevel do something
ケビンフェガン

(1)より一般的な質問は、「42などの任意の値にERRORLEVELを設定するにはどうすればよいですか」です。  cmd /c exit 42 それに対する最善の答えのようです。(2)  dbenhamが指摘しているよう/b、引用符は必要ありません  。
スコット

12

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%

7

私は個人的にこれを使用します:

cd .

UNIXシェルでも動作します。


しかし、これはもう少し速いかもしれません:type nul>nulプロセスモニターはPSでQueryDirectory呼び出しを表示するためcd .cd .UNIXシェルで別の素晴らしい副作用があります。消去の前に開かれている場合、ターミナルで再作成された作業ディレクトリを復元します。
アンドリー

2

以下に、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 ""

1

これが私が見つけた唯一の機能していることです。

call (exit /b 0)

ERRORLEVELを検出するサードパーティのスクリプトを使用するスクリプトで必要ですが、エラーレベルを適切にリセットしていません。


0

これらも機能します:(errorlevelを1に設定します)

方法1

color 00

方法2

echo A | find "B"

これを使用して、エラーレベル1-26を設定することもできます。

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.