コマンド別解説

errorlevel(終了コードを取得する)

>>errorlevelのオプション簡易解説へ

こんなことを知りたい人へ向けて書いています

  • Windowsバッチファイルの「errorlevel」について詳しく知りたい方
  • 直前のコマンドが成功したかどうかを判断する方法を知りたい方
  • 「errorlevel」コマンドを自分で自由に変更して使用する方法を知りたい方
  • 「errorlevel」コマンドを使って条件分岐する方法をしりたい方

 

目次

その他の関連しそうな記事

 

「errorlevel」とは

Windowsバッチファイルの「errorlevel」は特別な変数です。この変数には、直前で実行したバッチファイルやコマンドがどのような状態で終了したかという情報(「終了コード」と呼ぶ)が格納されています。正常に終了したのか、異常終了であったかという情報です。

「errorlevel」変数には自分で値を代入する必要はありません。あるコマンドが実行されると、コマンドが成功したか失敗したかで自動的に値が代入されます。すなわち、何かのコマンドを実行した後に変数「errorlevel」の中身を見ると、そのコマンドが成功したのか失敗したのかが分かります。

以上が「errorlevel」の主な用途ですが、それ以外にも自分で任意の値を入れてそれを利用することもできます。では、次節から詳しくみていきましょう。

 

コマンドの終了コードを確認する

はじめは、「errorlevel」のメインの使い方である「コマンドの終了コードを確認する」ことからです。これを確認することで確認した場所の直前のコマンドが成功したのか失敗したのかをチェックできます。

まずは何もしない初期の状態で変数「errorlevel」に何が入っているかを見てみましょう。以下のバッチファイル(check_errorlevel.bat)を実行してみます。

ただ変数「errorlevel」の中身をコマンドプロンプトに表示させているだけのバッチファイルですね。以下、実行結果です。

errorlevel(終了コードを取得する) 変数「errorlevel」の初期値をチェック

以上から初期状態では、変数「errorlevel」には「0」が入っていることが分かります。

 

次はコマンドを実行後、変数「errorlevel」を参照します。以下のようなバッチファイル(errorlevel_after_command_1.bat)を作成しました。

4行目のコマンドは何でもよいのですが、ここでは空ファイルを作るコマンドにしました。このコマンドは正常に動作します。つまり、最終行の「echo …」コマンドはコマンドが正常に終了した後の「errorlevel」の中を確認しています。

以下、バッチファイルの実行結果です。

errorlevel(終了コードを取得する)コマンド正常終了後に「errorlevel」を確認

「errorlevel」の初期値には「0」が入っていることを確認しましたが、値は「0」のままです。このようにコマンドが正常に終了すると「errorlevel」は「0」となります。

 

次に、正しくないコマンドを実行してみます。

先ほどのバッチファイルにコマンド実行の失敗例を追加しました(errorlevel_after_command_2.bat)。

10行目では引数が必要な「type」コマンドに引数を指定していません。このバッチファイルを実行するとエラーが生じるはずです。以下、実行結果です。

errorlevel(終了コードを取得する)コマンド以上終了後に「errorlevel」を確認(その1)

予想通り、10行目のコマンドを実行した場所で「コマンドの構文が誤っています。」とエラーが出ました。その後「errorlvel」の内容を書き出してみると「1」が入っていることが分かります。このように、失敗したコマンド後には、変数「errorlevel」には「1」は入っています。

 

さらに、このバッチファイルにありえないコマンドを実行した例を付け足してみます(errorlevel_after_command_3.bat)。

14行目では、「yahoo mail」というバッチファイルには存在しないコマンドを記述しました。以下、実行結果です。

最後の出力の行から「errorlevel」には「9009」が入っていることが分かります。このように、ありえないコマンドを実行しようとした場合は変数「errorlevel」には「9009」が入るのです。

 

以上より、変数「errorlevel」を参照することでコマンドの終了状態を知ることができます。その値は、「0」が正常終了、それ以外は異常終了と覚えておきましょう。異常終了には、その異常の種類によって異なる値が使われます。

 

自分で終了コードを代入する

前節の例では、直前に実行したコマンドの成否によって「errorlevel」の値は自動で決まっていましたが、自分で終了コードを設定することもできます。それは、サブルーチンを使用する場合です(※サブルーチンについては「バッチファイルでサブルーチンを使用する -やりたいことから検索-」を参照して下さい)。

サブルーチンで自分で終了コードを設定した例として、以下のようなバッチファイル(errorlevel_subroutine.bat)を考えます。

4行目でサブルーチンを呼び出します。するとプログラムは13行目にジャンプします。14行目で「ここはサブルーチン内です。」と表示した後、サブルーチンの最後の行(18行目)で、サブルーチンからメインプログラムへ戻るコマンド「exit /b 777」を実行します。

ただメインコードへ移動するだけならば、「exit /b」だけでよいのですが、「exit /b」の右側に数字を付け足すことで「errorlevel」にその数字が代入されます。この場合は「errorlevel」に「777」を代入してメインコードへ戻るようになっています。

以下、上記のバッチファイルの実行結果です。

errorlevel(終了コードを取得する)自分で終了コードを設定する

メインコードに戻った後、7行目の「echo」コマンドを実行した結果が出力され、「errorlevel」には指定した値(「777」)が入っていることが分かると思います。

 

「errorlevel」を使って条件分岐を行う

この取得した「errorlevel」の値を使って、分岐処理を行うこともできます。「errorlevel」の分岐処理は様々なものがありますので、一つずつ詳しく見ていきましょう。

これからいくつかの分岐処理を紹介しますが、「これを使うべきだ!」というものは存在しません。目的に一番合った方法を選ぶのが正解ですが、「この方法が分かりやすいから」という理由でも全く問題ないと私は考えています。

「if errorlevel」コマンドを使った分岐処理

はじめに「errorlevel」用の特別なコマンドである「if errorlevel」を紹介しましょう。「if errorlevel」は以下のように使用します。

これで変数「errorlevel」が[数値]に指定した値以上のときに[指定した数値以上の場合の処理]に書いたコマンドが実行されます。

例えば、前節ではありえないコマンドが実行されエラーが生じた後の変数「errorlevel」の値は「9009」でしたが、[数値]に「0」を指定した場合と「9999」を指定した場合のバッチファイルを見てみましょう。以下にテスト用バッチファイル(if_errorlevel_1.bat)を示します。

以下、実行結果です。

バッチファイルには14行目と15行目で「if errorlevel」コマンドを使用して、「echo」コマンドを実行していますが、[数値]を0に指定したものだけが実行され、コマンドプロンプトには「errorlevelは0以上です。」と表示されました。

このように、「if errorlevel」コマンドは「errorlevel」が[数値]に指定した値以上のときにコマンドを実行します。

 

また、実行したいコマンドが複数行にわたるときは以下のような書き方も可能です。

 

「if errorlevel」コマンドは「errorlevel」が[数値]に指定した値以上のときにコマンドを実行するものでした。

一方、「if not errorlevel」コマンドは「errorlevel」が[数値]に指定した値未満のときにコマンドを実行します。上記のバッチファイル「if_errorlevel_1.bat」を編集して「if not errorlevel」コマンドを使用したバッチファイル例を紹介します(if_not_errorlevel_1.bat)。

前のバッチプログラム「if_errorlevel_1.bat」から最後の3行を少しだけ変更しました。「not」を付け足し、[数値]も「0」、「9009」、「9999」の3パターンを記述しています。以下、実行結果です。

「errorlevel」の値は「9009」ですので、、最後行の「9999」を設定したコマンドだけが条件を満たし、「echo」コマンドが実行されています。

単純に「if」コマンドを使った条件分岐の方法

次は、最も単純な方法です。「if」コマンドを使って値を比較することで条件分岐を行う方法です。

例えば、直前のコマンドが正常に終了したときだけ次のコマンドに進み、失敗した場合はそこでプログラムをストップするようなバッチファイルを作ってみましょう。変数「errorlevel」は「0」のとき以外はコマンドが異常終了したということなので、「errorlevel=0」ではなかったらプログラムを止めればよいでしょう。バッチファイルは以下のようになります。

7行目で存在しないコマンド「yahoo mail」を実行しようとし、「errorlevel」に「9009」が代入されます。そして、12行目で「errorlevel」が0でない場合は「プログラムは異常終了しました。」というメッセージを出力し、プログラムをそこでストップします。

以下、実行結果です。

この場合は異常終了という結果となりました。例えば、7行目の「yahoo mail」の行をコメントアウトして実行すると今度は最後までバッチプログラムが回り、正常終了のメッセージが表示されるはずです。

このように、単純に「if」コマンドを使うだけでも「errorlevel」の条件分岐を実現することができます。この例のようにコマンドが異常終了した場合にはプログラムを止めるという操作は結構実践でも使用する機会が多いと思います。

サブルーチン名に「errorlevel」の名前を含める

最後は「errorlevel」に入っている数値をサブルーチン名に含めることで、呼び出すサブルーチンを変更する方法です。言葉で説明しても分かりづらいので次のバッチファイルの例を見てみましょう。

3行目から8行目は「errorlevel」に値を代入させるために成功と失敗(2つ)するコマンドを記述しています。今は成功するコマンドを実行するようにしています。

13行目で「errorlevel」の中身を確認した後、16行目ではサブルーチンを呼び出しています。このサブルーチンの名前に注目すると、サブルーチン名の一部に変数「errorlevel」が使われています。つまり、「errorlevel」が0であればサブルーチン「subroutine_0」が呼び出されるし、9009であればサブルーチン「subroutine_9009」が呼び出されます。このように、「errorlevel」の値で呼び出すサブルーチンを変えることで条件分岐を行うのです。

21行目からは各「errorlevel」に対応したサブルーチン名とその処理内容を書いています。

 

以上で「errorlevel」に関連した条件分岐の紹介を終わります。詳しい解説は「「errorlevel」の値から分岐処理を行う -やりたいことから検索-」でも解説していますので参考にして下さい。

Windowsバッチファイル初心者へ向けた入門書を作成しました


Windowsバッチファイル初心者の方へ向けた入門書(PDF)を作成しました。


・初めてWindowsバッチファイルを勉強してみようと思っている方

・使ったことはあるが一から基礎を学び直したい方


へ向けて丁寧な解説を行っています。


「全くプログラムを知らない方でも、この入門書を読んだ後には、Windowsバッチファイルの中級者レベルになれるように」をコンセプトに執筆したものです。


この本を読めば、バッチファイルを使ったファイルやフォルダの操作に関しては一通りのことができるようになります。そうなればもう十分中級者と呼べるレベルですので、あとは自分のやりたいことを実現しようとする中で徐々に知識を蓄えていくだけですぐに上級者へなれるでしょう。


詳しくみる

関連ページ

コメント

  1. ばっち女 より:

    上記の例題に、下記のようにifを追加するだけで、errorlevelに入る値が変わります。
    ■if exist hogehoge.txt(
    rem コマンド実行(成功)
    type nul > file.txt
    rem コマンドが成功したときの「errorlevel」の中身をチェック
    echo コマンド成功 → %errorlevel%
    echo;

    rem コマンド実行(失敗1)
    type
    rem コマンドが失敗したときの「errorlevel」の中身をチェック
    echo コマンド失敗1 → %errorlevel%
    ■pause
    ■) else (
    ■echo 終了です
    ■pause
    ■exit /b )

    回避策はないでしょうか?(if分の中でも、例題のようなerrorlevelの値が表示される)
    補足 プログラムの中に、pauseでも入れないと、テスト表示がされません

    1. ばっち女 より:

      念のためですが、■は、例題に追記した、とう意味です。テストする際は■を外して
      hogehoge.txtを置いてください

コメントを残す