こんなことを知りたい人へ向けて書いています
- Windowsバッチファイルの「errorlevel」について詳しく知りたい方
- 直前のコマンドが成功したかどうかを判断する方法を知りたい方
- 「errorlevel」コマンドを自分で自由に変更して使用する方法を知りたい方
- 「errorlevel」コマンドを使って条件分岐する方法をしりたい方
目次
その他の関連しそうな記事
「errorlevel」とは
Windowsバッチファイルの「errorlevel」は特別な変数です。この変数には、直前で実行したバッチファイルやコマンドがどのような状態で終了したかという情報(「終了コード」と呼ぶ)が格納されています。正常に終了したのか、異常終了であったかという情報です。
「errorlevel」変数には自分で値を代入する必要はありません。あるコマンドが実行されると、コマンドが成功したか失敗したかで自動的に値が代入されます。すなわち、何かのコマンドを実行した後に変数「errorlevel」の中身を見ると、そのコマンドが成功したのか失敗したのかが分かります。
以上が「errorlevel」の主な用途ですが、それ以外にも自分で任意の値を入れてそれを利用することもできます。では、次節から詳しくみていきましょう。
コマンドの終了コードを確認する
はじめは、「errorlevel」のメインの使い方である「コマンドの終了コードを確認する」ことからです。これを確認することで確認した場所の直前のコマンドが成功したのか失敗したのかをチェックできます。
まずは何もしない初期の状態で変数「errorlevel」に何が入っているかを見てみましょう。以下のバッチファイル(check_errorlevel.bat)を実行してみます。
1 2 3 4 |
@echo off rem 変数「errorlevel」を書き出す echo %errorlevel% |
ただ変数「errorlevel」の中身をコマンドプロンプトに表示させているだけのバッチファイルですね。以下、実行結果です。
以上から初期状態では、変数「errorlevel」には「0」が入っていることが分かります。
次はコマンドを実行後、変数「errorlevel」を参照します。以下のようなバッチファイル(errorlevel_after_command_1.bat)を作成しました。
1 2 3 4 5 6 7 |
@echo off rem コマンド実行(成功) type nul > file.txt rem コマンドが成功したときの「errorlevel」の中身をチェック echo コマンド成功 → %errorlevel% |
4行目のコマンドは何でもよいのですが、ここでは空ファイルを作るコマンドにしました。このコマンドは正常に動作します。つまり、最終行の「echo …」コマンドはコマンドが正常に終了した後の「errorlevel」の中を確認しています。
以下、バッチファイルの実行結果です。
「errorlevel」の初期値には「0」が入っていることを確認しましたが、値は「0」のままです。このようにコマンドが正常に終了すると「errorlevel」は「0」となります。
次に、正しくないコマンドを実行してみます。
先ほどのバッチファイルにコマンド実行の失敗例を追加しました(errorlevel_after_command_2.bat)。
1 2 3 4 5 6 7 8 9 10 11 12 |
@echo off rem コマンド実行(成功) type nul > file.txt rem コマンドが成功したときの「errorlevel」の中身をチェック echo コマンド成功 → %errorlevel% echo; rem コマンド実行(失敗1) type rem コマンドが失敗したときの「errorlevel」の中身をチェック echo コマンド失敗1 → %errorlevel% |
10行目では引数が必要な「type」コマンドに引数を指定していません。このバッチファイルを実行するとエラーが生じるはずです。以下、実行結果です。
予想通り、10行目のコマンドを実行した場所で「コマンドの構文が誤っています。」とエラーが出ました。その後「errorlvel」の内容を書き出してみると「1」が入っていることが分かります。このように、失敗したコマンド後には、変数「errorlevel」には「1」は入っています。
さらに、このバッチファイルにありえないコマンドを実行した例を付け足してみます(errorlevel_after_command_3.bat)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@echo off rem コマンド実行(成功) type nul > file.txt echo コマンド成功 → %errorlevel% echo; rem コマンド実行(失敗1) type echo コマンド失敗1 → %errorlevel% echo; rem コマンド実行(失敗2) yahoo mail echo コマンド失敗2 → %errorlevel% |
14行目では、「yahoo mail」というバッチファイルには存在しないコマンドを記述しました。以下、実行結果です。
最後の出力の行から「errorlevel」には「9009」が入っていることが分かります。このように、ありえないコマンドを実行しようとした場合は変数「errorlevel」には「9009」が入るのです。
以上より、変数「errorlevel」を参照することでコマンドの終了状態を知ることができます。その値は、「0」が正常終了、それ以外は異常終了と覚えておきましょう。異常終了には、その異常の種類によって異なる値が使われます。
自分で終了コードを代入する
前節の例では、直前に実行したコマンドの成否によって「errorlevel」の値は自動で決まっていましたが、自分で終了コードを設定することもできます。それは、サブルーチンを使用する場合です(※サブルーチンについては「バッチファイルでサブルーチンを使用する -やりたいことから検索-」を参照して下さい)。
サブルーチンで自分で終了コードを設定した例として、以下のようなバッチファイル(errorlevel_subroutine.bat)を考えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off rem サブルーチンを呼び出す call :subroutine rem 「errorlevel」を書き出してチェックする echo %errorlevel% rem バッチファイルを終了する goto :eof このから下がサブルーチンのコード :subroutine echo ここはサブルーチン内です。 rem サブルーチンを終了しメインコードに戻る rem その際、「errorlevel」には「777」を代入する exit /b 777 |
4行目でサブルーチンを呼び出します。するとプログラムは13行目にジャンプします。14行目で「ここはサブルーチン内です。」と表示した後、サブルーチンの最後の行(18行目)で、サブルーチンからメインプログラムへ戻るコマンド「exit /b 777」を実行します。
ただメインコードへ移動するだけならば、「exit /b」だけでよいのですが、「exit /b」の右側に数字を付け足すことで「errorlevel」にその数字が代入されます。この場合は「errorlevel」に「777」を代入してメインコードへ戻るようになっています。
1 |
exit /b [「errorlevel」に代入したい数値] |
以下、上記のバッチファイルの実行結果です。
メインコードに戻った後、7行目の「echo」コマンドを実行した結果が出力され、「errorlevel」には指定した値(「777」)が入っていることが分かると思います。
「errorlevel」を使って条件分岐を行う
この取得した「errorlevel」の値を使って、分岐処理を行うこともできます。「errorlevel」の分岐処理は様々なものがありますので、一つずつ詳しく見ていきましょう。
これからいくつかの分岐処理を紹介しますが、「これを使うべきだ!」というものは存在しません。目的に一番合った方法を選ぶのが正解ですが、「この方法が分かりやすいから」という理由でも全く問題ないと私は考えています。
「if errorlevel」コマンドを使った分岐処理
はじめに「errorlevel」用の特別なコマンドである「if errorlevel」を紹介しましょう。「if errorlevel」は以下のように使用します。
1 |
if errorlevel [数値] [指定した数値以上の場合の処理] |
これで変数「errorlevel」が[数値]に指定した値以上のときに[指定した数値以上の場合の処理]に書いたコマンドが実行されます。
例えば、前節ではありえないコマンドが実行されエラーが生じた後の変数「errorlevel」の値は「9009」でしたが、[数値]に「0」を指定した場合と「9999」を指定した場合のバッチファイルを見てみましょう。以下にテスト用バッチファイル(if_errorlevel_1.bat)を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@echo off rem 存在しないコマンドを実行 yahoo mail echo: rem 「errorlevel」の中身をチェック echo errorlevel= %errorlevel% echo: rem 「if errorlevel」の使用例 if errorlevel 0 echo errorlevelは0以上です。 if errorlevel 9999 echo errorlevelは9999以上です。 |
以下、実行結果です。
バッチファイルには14行目と15行目で「if errorlevel」コマンドを使用して、「echo」コマンドを実行していますが、[数値]を0に指定したものだけが実行され、コマンドプロンプトには「errorlevelは0以上です。」と表示されました。
このように、「if errorlevel」コマンドは「errorlevel」が[数値]に指定した値以上のときにコマンドを実行します。
また、実行したいコマンドが複数行にわたるときは以下のような書き方も可能です。
1 2 3 |
if errorlevel ( [数値] [指定した数値以上の場合の処理] ) |
「if errorlevel」コマンドは「errorlevel」が[数値]に指定した値以上のときにコマンドを実行するものでした。
一方、「if not errorlevel」コマンドは「errorlevel」が[数値]に指定した値未満のときにコマンドを実行します。上記のバッチファイル「if_errorlevel_1.bat」を編集して「if not errorlevel」コマンドを使用したバッチファイル例を紹介します(if_not_errorlevel_1.bat)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@echo off rem 存在しないコマンドを実行 yahoo mail echo: rem 「errorlevel」の中身をチェック echo errorlevel= %errorlevel% echo: rem 「if errorlevel」の使用例 if not errorlevel 0 echo errorlevelは0未満です。 if not errorlevel 9009 echo errorlevelは9009未満です。 if not errorlevel 9999 echo errorlevelは9999未満です。 |
前のバッチプログラム「if_errorlevel_1.bat」から最後の3行を少しだけ変更しました。「not」を付け足し、[数値]も「0」、「9009」、「9999」の3パターンを記述しています。以下、実行結果です。
「errorlevel」の値は「9009」ですので、、最後行の「9999」を設定したコマンドだけが条件を満たし、「echo」コマンドが実行されています。
単純に「if」コマンドを使った条件分岐の方法
次は、最も単純な方法です。「if」コマンドを使って値を比較することで条件分岐を行う方法です。
例えば、直前のコマンドが正常に終了したときだけ次のコマンドに進み、失敗した場合はそこでプログラムをストップするようなバッチファイルを作ってみましょう。変数「errorlevel」は「0」のとき以外はコマンドが異常終了したということなので、「errorlevel=0」ではなかったらプログラムを止めればよいでしょう。バッチファイルは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@echo off echo プログラム開始 echo: rem 存在しないコマンドを実行 yahoo mail echo: rem 直前のコマンドが異常終了していればエラーメッセージを出力し、 rem バッチプログラムを終了する if %errorlevel% neq 0 ( echo プログラムは異常終了しました。 exit /b ) echo プログラム正常終了 |
7行目で存在しないコマンド「yahoo mail」を実行しようとし、「errorlevel」に「9009」が代入されます。そして、12行目で「errorlevel」が0でない場合は「プログラムは異常終了しました。」というメッセージを出力し、プログラムをそこでストップします。
以下、実行結果です。
この場合は異常終了という結果となりました。例えば、7行目の「yahoo mail」の行をコメントアウトして実行すると今度は最後までバッチプログラムが回り、正常終了のメッセージが表示されるはずです。
このように、単純に「if」コマンドを使うだけでも「errorlevel」の条件分岐を実現することができます。この例のようにコマンドが異常終了した場合にはプログラムを止めるという操作は結構実践でも使用する機会が多いと思います。
サブルーチン名に「errorlevel」の名前を含める
最後は「errorlevel」に入っている数値をサブルーチン名に含めることで、呼び出すサブルーチンを変更する方法です。言葉で説明しても分かりづらいので次のバッチファイルの例を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
@echo off rem 成功するコマンド(errorlevel=0) type nul > file.txt rem 失敗するコマンド1(errorlevel=1) rem type rem 失敗するコマンド2(errorlevel=9009) rem yahoo mail echo: rem 「errorlevel」を参照する echo errorlevel=%errorlevel% rem サブルーチンを呼び出す call :subroutine_%errorlevel% goto :eof :subroutine_0 echo ここは「subroutine_0」内です。 exit /b :subroutine_1 echo ここは「subroutine_1」内です。 exit /b :subroutine_9009 echo ここは「subroutine_9009」内です。 exit /b |
3行目から8行目は「errorlevel」に値を代入させるために成功と失敗(2つ)するコマンドを記述しています。今は成功するコマンドを実行するようにしています。
13行目で「errorlevel」の中身を確認した後、16行目ではサブルーチンを呼び出しています。このサブルーチンの名前に注目すると、サブルーチン名の一部に変数「errorlevel」が使われています。つまり、「errorlevel」が0であればサブルーチン「subroutine_0」が呼び出されるし、9009であればサブルーチン「subroutine_9009」が呼び出されます。このように、「errorlevel」の値で呼び出すサブルーチンを変えることで条件分岐を行うのです。
21行目からは各「errorlevel」に対応したサブルーチン名とその処理内容を書いています。
以上で「errorlevel」に関連した条件分岐の紹介を終わります。詳しい解説は「「errorlevel」の値から分岐処理を行う -やりたいことから検索-」でも解説していますので参考にして下さい。
上記の例題に、下記のように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でも入れないと、テスト表示がされません
念のためですが、■は、例題に追記した、とう意味です。テストする際は■を外して
hogehoge.txtを置いてください