2012-06-07 7 views
17

イントロ

アドバイスの多くは、例えば、(ERROLEVELメカニズムを使用して)バッチファイルでリターンコードに対処するためにそこにあります他の人が %ERRORLEVEL%変数と==EQULSSなどを使用して内部の問題があるように思え使用することをお勧めしながら誰にでもできる方法

アドバイスのいくつかは、if errorlevel 1 goto somethingbadを行うことですIF声明などのように、遅延拡大が推奨されていますが、それは独自の癖を持っているようです。

質問

(それはほぼすべての戻りコードで、ほぼすべてのシステムを上で動作しますので、堅牢すなわち)誰にでも何である(ゼロ以外)不正なコードが返されたかどうかを知る方法はありますか?

基本的な使用のための私の試み

、次はどんなゼロ以外の戻りコードをキャッチするために[OK]を動作するようです:

if not errorlevel 0 (
    echo error level was nonzero 
) 

答えて

34

申し訳ありませんが、あなたの試みにも近接していません。 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%を参照してください。だから、エラーレベルでエラーをチェックするばかばかしい方法は存在しないと主張することができます。最も信頼性の高い方法(ただし、絶対的なものではありません)は||です。

+2

errorlevelは[環境変数ではありません](http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx)です。 –

+0

@NickWestgate - うん、ERRORLEVELは多くの "擬似"または "動的"変数の1つです。私は、「動的」変数の3つのクラスをhttp://stackoverflow.com/a/20169219/1012053で特定し、文書化しました。この記事では、同じRaymond Chenのブログを参照しています。 – dbenham

+0

EDIT 2016-06-03:存在しない変数を未定義にしようとすると、ERRORLEVELを1に設定するXPの動作を考慮して、ユーザー定義のERRORLEVELをクリアするコードを修正しました。 – dbenham

関連する問題