20

はじめに

バッチ ファイルでリターン コードを処理するためのアドバイスがたくさんあります (ERROLEVEL メカニズムを使用)。

アドバイスの中には を実行することもあれば、変数を使用して、、などをif errorlevel 1 goto somethingbad使用することを推奨するもの もあります。%ERRORLEVEL%==EQULSSIF

質問

悪い ( 0 以外の) コードが返されたかどうかを知る確実な (つまり、堅牢で、ほぼすべてのリターン コードを持つほぼすべてのシステムで動作する) 方法は何ですか?

私の試み

基本的な使用法では、以下はゼロ以外の戻りコードをキャッチするために問題なく機能するようです:

if not errorlevel 0 (
    echo error level was nonzero
)
4

1 に答える 1

43

申し訳ありませんが、あなたの試みはまだ終わっていません。if not errorlevel 0errorlevel が負の場合にのみ true になります。

エラーレベルが決して負にならないことがわかっている場合、

if errorlevel 1 (echo error level is greater than 0)

負のエラー レベルを許可する必要があり、かっこで囲まれたコード ブロック内にない場合は、

set "errorlevel=1"
set "errorlevel="
if %errorlevel% neq 0 (echo error level is non-zero)

注 - 質問のリンクされた回答に対するジョーイのコメントを読んだ後、ユーザー定義のエラーレベル値を明示的にクリアするように回答を編集しました。ユーザー定義のエラーレベルは、アクセスしようとしている動的な値をマスクできます。ただし、これはスクリプトに.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)
)


ここに、ついに、ゼロ以外のerrrolevelの「究極の」テストがあり、どのような状況でも機能するはずです:-)

(
  SomeCommandThatMightGenerateAnError
  set foundErr=1
  if errorlevel 0 if not errorlevel 1 set "foundErr="
  if defined foundErr echo errorlevel is non-zero
)

使いやすいようにマクロに変換することもできます。

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
)


最後の問題:

入力および/または出力のリダイレクトは、さまざまな理由で失敗する可能性があります。ただし、オペレーターが使用されない限り、リダイレクトエラーはエラーレベルを設定しません。||詳細については、Windows でのファイル リダイレクトと %errorlevel%を参照してください。したがって、errorlevel を介してエラーをチェックする絶対確実な方法は存在しないと主張することができます。最も信頼できる方法 (ただし、絶対確実ではない) は||演算子です。

于 2012-06-07T16:38:48.267 に答える