Windowsコマンドのエラーを判定する方法

Windowsコマンドのエラーを判定する方法

Windowsでバッチファイルを作成していると、バッチファイルやバッチファイル内で実行したコマンドでエラーが発生してかるかに応じて処理を分けたい(エラーハンドリングしたい)ときがあります。

そこでここでは、バッチファイルやバッチファイル内で実行したコマンドが正常終了したか異常終了したかを判別する方法を解説します。

ERRORLEVELを使った方法

Windowsコマンドの多くは、正常にコマンドが実行されると終了コード(Exit Code)として「0」が返され、何らかのエラーが発生したときは0以外の数値が返され、終了コードの値はERRORLEVELという変数に格納されます。

そこで、エラーハンドリングしたいコマンドを実行するときは、以下のようにコマンドの実行直後でERRORLEVELに格納されている値をIF文などでチェックすることでエラーを判別できます。

rename e:\samaple1.txt test.txt
if %errorlevel% neq 0 (
  echo エラーが発生しました
)

なお、コマンドによっては正常終了したときでも「0」以外の値を返すことがあります。たとえば、robocopyコマンドでは、実行結果に応じてさまざまな値を返すので、使用するコマンドが正常終了したときや異常終了したときにどのような終了コードを返すのかをあらかじめ確認しておくとよいでしょう。

ERRORLEVELで判定できないコマンドの場合

Windowsコマンドの中には、コマンドが正常終了しても異常終了しても終了コードに0しか返さないコマンドがあります。たとえば、ファイルを削除するDELコマンドは、正常にファイルが削除されてもエラーが発生しても終了コードとして0しか返さないため、ERRORLEVELを使ったエラーハンドリングができません。

そのようなときは、別の手段を考える必要があります。

たとえば、DELコマンドなら、エラーが発生したときのみ標準エラー出力にファイルを削除できなかったなどのメッセージが出力されるため、FINDコマンドと組み合わせてメッセージの有無をチェックすることでエラーを判別できます。

del a.txt 2>&1 | find /v ""
if %errorlevel% neq 1 (
  echo エラーが発生しました
)

上のコマンドでは、まずDELコマンドの標準エラー出力を標準出力にリダイレクトし、パイプに続くFINDコマンドで標準出力に文字列が出力されているかをチェックしています。

FINDコマンドは、検索条件に一致する文字列があれば終了コードとして「0」、一致する文字列がなければ「1」が返されることから、ERRORLEVELによる判定が可能です。

なお、ファイルを削除するDELコマンドなら、コマンド実行後ファイルの存在をチェックすることで判別するという方法もあるでしょう。

バッチファイルに終了コードを設定

バッチファイル自体のエラーを判定したいときは、EXITコマンドを使ってバッチファイルに終了コードを設定できます。EXITコマンドで指定した終了コードはERRORLEVELに格納されます。

たとえば、バッチファイル内でエラー発生個所に応じて異なる終了コードを設定しておけば、終了コードからどこでエラーが発生したかを判別できるでしょう。

コマンドA
if %errorlevel% neq 0 (
  exit /b 1
)

コマンドB
if %errorlevel% neq 0 (
  exit /b 2
)

コマンドC
if %errorlevel% neq 0 (
  exit /b 3
)

あとがき

作成するバッチファイルによっては、エラーハンドリングをより工夫しなければならないこともありますが、まずは上に紹介した方法を覚えておけば、大抵のケースには対応できるのではないでしょうか。