申し訳ありませんが、あなたの試みにも近接していません。 if not errorlevel 0
は、errorlevelが負の場合にのみ真となります。その後、
あなたはそのERRORLEVELが負になることはありません知っている場合は、
if errorlevel 1 (echo error level is greater than 0)
あなたが負のERRORLEVELを可能にし、その後、コードの括弧で囲まれたブロック内
注ではありませんしなければならない場合 - 質問のリンクされた答えにジョーイのコメントを読んだ後に、ユーザー定義のエラーレベル値を明示的にクリアするために私の答えを編集しました。ユーザー定義のエラーレベルは、アクセスしようとしている動的値をマスクすることができます。しかし、これはあなたのスクリプトが.bat
の拡張子を持っている場合にのみ有効です。 .cmd
拡張子のスクリプトでは、変数を設定またはクリアするとERRORLEVELが0に設定されます。さらに悪いことに、存在しない変数を定義解除しようとすると、XPはERRORLEVELを1に設定します。それで、私はそれをクリアしようとする前に、まずERRORLEVEL変数を明示的に定義しています!あなたは、コードの括弧で囲まれたブロック内にある場合
は、あなたは現在の値に
setlocal enableDelayedExpansion
(
SomeCommandThatMightGenerateAnError
set "errorlevel=1"
set "errorlevel="
if !errorlevel! neq 0 (echo error level is non-zero)
)
を取得するために遅れた拡張を使用する必要があります。しかし、時には、あなたは遅延拡張が有効になってほしくありません。コマンドを実行した直後にエラーレベルを確認する場合は、すべてが失われません。
(
SomeCommandThatMightGenerateAnError && (echo Success, no error) || (echo There was an error)
)
どうしても、その後、括弧で囲まれたブロック内で次の作業を遅らせ拡張を使用せずに、ダイナミックERRORLEVELの値をチェックする必要があります。しかし、2つの場所にエラー処理コードがあります。
(
SomeCommandThatMightGenerateAnError
if errorlevel 1 (echo errorlevel is non-zero) else if not errorlevel 0 (echo errorlevel is non-zero)
)
ここ
は、ついに、それもに変換することができ
(
SomeCommandThatMightGenerateAnError
set foundErr=1
if errorlevel 0 if not errorlevel 1 set "foundErr="
if defined foundErr echo errorlevel is non-zero
)
:-)どのような状況下でも動作するはず非ゼロerrrolevelのための「究極」のテストです
set "ifErr=set foundErr=1&(if errorlevel 0 if not errorlevel 1 set foundErr=)&if defined foundErr"
(
SomeCommandThatMightGenerateAnError
%ifErr% echo errorlevel is non-zero
)
マクロは括弧をサポートしており、ELSEはちょうどいいです:
%ifErr% (
echo errorlevel is non-zero
) else (
echo errorlevel is zero
)
最後の一つの問題:入力および/または出力の
リダイレクトは任意の数の理由で失敗することができます。しかし、||
演算子が使用されていない限り、リダイレクトエラーはではありません。はエラーレベルを設定します。詳細については、File redirection in Windows and %errorlevel%を参照してください。だから、エラーレベルでエラーをチェックするばかばかしい方法は存在しないと主張することができます。最も信頼性の高い方法(ただし、絶対的なものではありません)は||
です。
errorlevelは[環境変数ではありません](http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx)です。 –
@NickWestgate - うん、ERRORLEVELは多くの "擬似"または "動的"変数の1つです。私は、「動的」変数の3つのクラスをhttp://stackoverflow.com/a/20169219/1012053で特定し、文書化しました。この記事では、同じRaymond Chenのブログを参照しています。 – dbenham
EDIT 2016-06-03:存在しない変数を未定義にしようとすると、ERRORLEVELを1に設定するXPの動作を考慮して、ユーザー定義のERRORLEVELをクリアするコードを修正しました。 – dbenham