batファイルで「errorlevel」の基本的な使い方を教えます。
errorlevelにはどのような値が入っているのか、わからなくなってしまったりした経験はないでしょうか?
そのような人の為に分かりやすく実践を行っています。
応用編として「if」と「errorlevel」を併用して場合分けをするやり方も実践を踏まえ教えます。
また操作者の選択で処理を場合分けする方法や「errorlevel」の値を自由に変更するやり方まで教えます。
それぞれで実演を踏まえていますし、出そうなエラーも例を出して紹介しているので必ずあなたのものに出来ます。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
あまり使うイメージのない「errorlevel」コマンドですが、この記事を読み終えた頃には「errorlevel」を使いこなして色々な事が出来るようになっています。
- batファイルでerrorlevelの基礎がわかる
- errorlevelを使用して場合分けが出来る(操作者の選択にも対応)
- errorlevelに自分の思う数字を入れる事が出来る
- errorlevelを使用して出るエラーに対応できる
batファイルでのerrorlevelの使い方
batファイルで「errorlevel」の基本的な使い方として、前のコマンドが正常終了したか確認する事が出来ます。
前のコマンドが成功したか失敗したかで、後の処理を変更したいといった場面はないでしょうか?
そんな時に使用できるのが「errorlevel」です。
という事で、まずはbatファイルの「errorlevel」の基礎から学んで行きましょう!
- 直前のコマンドが成功した場合はerrorlevel変数に「0」を入れる
- 直前のコマンドが失敗した場合はerrorlevel変数に「1」を入れる
- コマンド自体がない場合はerrorlevel変数に「9009」を入れる
errorlevelのように変数を扱うとバッチファイルで様々な事が出来ます。具体的には下の記事にまとめています。
errorlevel | 意味 |
---|---|
2 | アクセス拒否 |
では実践で「errorlevel」の基本の動きを見ていきます。
batファイルでのerrorlevelチェック:成功判定
まずはコマンドを成功させて「errorlevel」変数に「0」が入る事を確認していきます。
下のような成功判定のbatファイルを作成してみます。
@echo off
echo ファイルがなければ作成、あってもなくてもコマンドは成功するので:エラーレベル0
if not exist test1.txt (
echo テキストの中身 > test1.txt
)
echo エラーレベル=%errorlevel%
pause
errorlevelチェック:成功判定のbatファイル説明
1行目の「@echo off」はbatファイルに記述したコマンドを表示させないコードです。
batファイルの3行目は説明になります。
①4~6行目はifを使用して「test1.txt」ファイルが無ければファイルを作成するコマンドです。
②batファイルの7行目でエラーレベルを表示しています。「%」で囲む事で変数を展開出来ます。
最後の行でbatファイルを一時停止しています。理由はbatファイルの実行結果を見る為です。
3行目の説明でも書いていますが、なければ作成あれば何もしないコマンドなので必ず成功します。
「errorlevel」が「0」になれば成功です。では先程のbatファイルを実行して見ます。
errorlevelチェック:成功判定のbat実行と結果
ファイルがなければ作成、あってもなくてもコマンドは成功するので:エラーレベル0
エラーレベル=0
「errorlevel」に「0」が入っている事がわかります。
batファイルでのerrorlevelチェック:失敗判定
次にコマンドを失敗させて「errorlevel」変数に「1」が入る事を確認していきます。
下のような失敗判定のbatファイルを作成してみます。
@echo off
echo 存在しないフォルダに移動しようとすると失敗:エラーレベル1
cd 3333
echo エラーレベル=%errorlevel%
pause
errorlevelチェック:失敗判定のbatファイル説明
batファイルの4行目で存在しない適当な「3333」フォルダに移動しようとするコマンドです。
当然ながらカレントフォルダにそんなフォルダは存在しないのでエラーとなります。
errorlevelが「1」になれば成功です。では先程のbatファイルを実行して見ます。
errorlevelチェック:失敗判定のbat実行と結果
存在しないフォルダに移動しようとすると失敗:エラーレベル1
指定されたパスが見つかりません。
エラーレベル=1
「指定されたパスが見つかりません」というメッセージが出て、フォルダ移動できなかったので「errorlevel」に「1」が入っています。
batファイルでのerrorlevelチェック:コマンドがない場合の値
最後に存在しないコマンドを指定して、判定できない状態にして「errorlevel」変数に「9009」が入る事を確認していきます。
下のような成功判定も失敗判定も出来ないbatファイルを作成してみます。
@echo off
echo ないコマンドを投入:エラーレベル9009
copyy
echo エラーレベル=%errorlevel%
pause
errorlevelチェック:コマンドがない場合のbatファイル説明
batファイルの4行目で「copy」コマンドの記入ミスの「copyy」を指定します。
そんなコマンドはないので判定のしようがありません。こんな時は「errorlevel」変数には「9009」が入ります。
「errorlevel」が「9009」になれば成功です。では先程のbatファイルを実行して見ます。
errorlevelチェック:コマンドがない場合のbat実行と結果
ないコマンドを投入:エラーレベル9009
'copyy' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
エラーレベル=9009
「copyy」は認識されていません。となり、「errorlevel」変数に「9009」が入っている事がわかります。
ここまでがbatファイルでの「errorlevel」の基礎になります。
errorlevelとifとのコラボで条件分岐
では応用編として実際に業務でも使用できるbatファイルを紹介します。
errorlevelとifを使用して条件分岐してみます。
下のようなif文とerrorlevelを使用したbatファイルを作成してみます。
@echo off
REM errorlevelとifで条件分岐する
if %errorlevel% equ 0 (
echo エラーレベル0の時の処理
) else if %errorlevel% equ 1 (
echo エラーレベル1の時の処理
) else if %errorlevel% equ 9009 (
echo エラーレベル9009の時の処理
) else (
echo エラーレベルは%errorlevel%です。
)
pause
errorlevelとifとのコラボbatファイル説明
①batファイルの3行目で「if」を使用して「errorlevel」が0の時の条件分岐をしています。
「equ」とは「equal」で等しいという意味の比較演算子です。
比較演算子 | 説明 | 英文 |
---|---|---|
equ | 等しい | equal |
neq | 等しくない | not equal |
geq | 以上 | greater than or equal |
leq | 以下 | less than or equal |
gtr | より大きい | greater than |
lss | より小さい | less than |
②4行目で「errorlevel」が「0」の時の処理を記入します。
③5行目で「else if」と比較演算子を使用して、更に条件分岐させています。「errorlevel」が「1」の時の条件分岐です。
④7行目も同様に条件分岐行います。「errorlevel」が「9009」の時の条件分岐です。
⑤9行目で「else」を使用して、どの条件にも当てはまらない時の分岐を指示しています。
これで直前でのコマンド結果の「errorlevel」の値に即した処理を行う事が出来ます。
batファイルでerrorlevelとifを使用した時の注意点
errorlevelとifを使用した時のよくあるエラーとしてスペースがあります。
@echo off
REM errorlevelとifで条件分岐する
if %errorlevel% equ 0(
echo エラーレベル0の時の処理
) else if %errorlevel% equ 1(
echo エラーレベル1の時の処理
) else if %errorlevel% equ 9009(
echo エラーレベル9009の時の処理
) else (
echo エラーレベルは%errorlevel%です。
)
pause
先程のbatファイルと同じに見えますが、上のbatファイルを実行して見て下さい。
動かないです。batファイルのエラーです。エラーの理由は比較している値の後にスペースがありません。
batファイルでerrorlevelとChoiceを組み合わせる使い方
先程のbatファイルではerrorlevelに入る値によって条件分岐しました。
今回はユーザーが入力する値によって条件分岐して見ます。
下のようなchoice文とif文とerrorlevelを使用したbatファイルを作成してみます。
@echo off
REM errorlevelとifで条件分岐する
choice /c xyz /t 30 /d z /m 'xyzから選択してください(タイムアウトは30秒デフォルトではz)'
if %errorlevel% == 1 (
echo 選んだのは1番目
) else if %errorlevel% == 2 (
echo 選んだのは2番目
) else if %errorlevel% == 3 (
echo 選んだのは3番目
)
pause
errorlevelとifでユーザーの選択肢により条件分岐するbatファイル説明
①ここではchoiceコマンドを使用します。choiceコマンドは選択肢を提示してユーザーに選ばせます。
choiceコマンドのオプションは以下にまとめています。
オプション | 意味 |
---|---|
/c 選択肢 | 選択肢を指定する |
/t タイムアウト値 | ユーザーのアクションを待つ時間指定 |
/d 選択肢 | 指定しなかった場合のデフォルト値 |
/m ‘メッセージ’ | プロンプトに表示するメッセージ指定 |
/cs | 大文字と小文字を区別する |
上のオプションからもわかるように、今回のchoiceコマンドで「x」,「y」,「z」から選ばせる。30秒経過すると自動的に「z」が選択される。
②選択したものの番号が「errorlevel」に代入されます。今回でいうと「x」を選択すれば「errorlevel」に「1」が代入、「y」であれば「2」を、「z」であれば「3」が代入されます。
この仕組みが理解できればifとerrorlevelと比較演算子を使用してユーザーが入力した値による条件分岐が作成できます。
batファイルでerrorlevelに値を入れる
次に「errorlevel」に自分の好きな値を入れてみましょう。
これはサブルーチンで行います。
以下のbatファイルを作成してみます。
@echo off
REM サブルーチンでerrorlevelに好きな値を入れる
call :subr
echo 指定した値がエラーレベルに入っていればエラーレベルは777
echo エラーレベル=%errorlevel%
pause
:subr
echo サブルーチンの中のエラーレベルは%errorlevel%
exit /b 777
サブルーチンでerrorlevelに好きな値を入れるbatファイルの説明
①上のbatファイルでは3行目でサブルーチンの7行目へ飛びます。8行目で「errorlevel」の値を表示しています。現在の値は何もしていないので0になります。
②最後の行で戻り値の「777」を「errorlevel」に代入して4行目に戻ります。
③5行目で「errorlevel」が「777」になっているか確認しています。
④6行目で「pause」を使用してコマンドの結果を見れるようにしています。
batファイルを実行
サブルーチンの中のエラーレベルは0
指定した値がエラーレベルに入っていればエラーレベルは777
エラーレベル=777
想定通りエラーレベルが指定した「777」になっている事が確認できます。
サブルーチンでerrorlevelに好きな値を入れる時の注意点
今回のサブルーチンを使用する時の注意点としては、サブルーチンをbatファイルの一番下に持っていくということです。
下のbatファイルを見て下さい。
@echo off
REM サブルーチンでerrorlevelに好きな値を入れる
call :subr
echo 指定した値がエラーレベルに入っていればエラーレベルは777
echo エラーレベル=%errorlevel%
:subr
echo サブルーチンの中のエラーレベルは%errorlevel%
exit /b 777
pause
サブルーチンを使用してエラーが出るbatファイルの説明
先程のbatファイルの「pause」が一番下にきています。サブルーチンは「:subr」から「exit /b 777」までです。その下にメインのコマンドが記述されています。
このエラーbatファイルを実行してみますが、実行できません。
サブルーチンは一番下に記述してください。
batで変数「errorlevel」に直接値をいれると値が固定される
「errorlevel」に好きな値を入れる時に注意しなければいけない事がもうひとつあります。
batファイルで変数に値を入れる時のデフォルトは以下になります。
set 変数名=値
これで「errorlevel」に好きな値を入れれば早いのではないか?と思った人もいるかもしれません
結果は代入できるが、それ以降値が変わらないが正解です。
下のsetでerrorlevelに好きな値を入れたbatファイルをみてください。
@echo off
REM setでerrorlevelに好きな値を入れる
set errorlevel=99
choice /c xyz /t 30 /d z /m 'xyzから選択してください(タイムアウトは30秒デフォルトではz)'
if %errorlevel% == 1 (
echo 選んだのは1番目
) else if %errorlevel% == 2 (
echo 選んだのは2番目
) else if %errorlevel% == 3 (
echo 選んだのは3番目
)
echo エラーレベル=%errorlevel%
pause
batで変数「errorlevel」に直接値をいれるbatファイルの説明
3行目でsetにより変数「errorlevel」に「99」を入れています。
4行目から11行目までは先程「batファイルでerrorlevelとChoiceを組み合わせる使い方」の見出しで行ったbatをそのまま使用しています。ユーザーが入れたものに紐づいた値が「errorlevel」に代入されるのでしたね。
13行目で最終の「errorlevel」の値を表示しています。
batファイル実行
このsetでerrorlevelに好きな値を入れたbatファイルを実行して「x」を指定してみます。
結果は「errorlevel」が「x」に対応する「1」になればOKです。
'xyzから選択してください(タイムアウトは30秒デフォルトではz)' [X,Y,Z]?X
エラーレベル=99
エラーレベルが3行目で指定した「99」のままです。なので失敗です。
原因はsetは環境変数へ値を指定するので、そのbatファイルが終わるまではsetで指定した値から変わらないからです。
解決法は「サブルーチンでerrorlevelに好きな値を入れるbatファイル」項目を参考にしてください。
batファイルでerrorlevelの使い方のまとめ
batファイルで「errorlevel」の基本的な使い方として、前のコマンドが正常終了したか確認する事が出来る。
「errorlevel」の基本は以下の3つです。
- 直前のコマンドが成功した場合はerrorlevel変数に「0」を入れる
- 直前のコマンドが失敗した場合はerrorlevel変数に「1」を入れる
- コマンド自体がない場合はerrorlevel変数に「9009」を入れる
errorlevelとifとのコラボで条件分岐するbatファイル例
@echo off
REM errorlevelとifで条件分岐する
if %errorlevel% equ 0 (
echo エラーレベル0の時の処理
) else if %errorlevel% equ 1 (
echo エラーレベル1の時の処理
) else if %errorlevel% equ 9009 (
echo エラーレベル9009の時の処理
) else (
echo エラーレベルは%errorlevel%です。
)
pause
注意点としては条件と「(」との間にスペースを忘れない事でした。
errorlevelとChoiceを組み合わせるbatファイル例
@echo off
REM errorlevelとifで条件分岐する
choice /c xyz /t 30 /d z /m 'xyzから選択してください(タイムアウトは30秒デフォルトではz)'
if %errorlevel% == 1 (
echo 選んだのは1番目
) else if %errorlevel% == 2 (
echo 選んだのは2番目
) else if %errorlevel% == 3 (
echo 選んだのは3番目
)
pause
choiceコマンドのオプションは以下でした。
オプション | 意味 |
---|---|
/c 選択肢 | 選択肢を指定する |
/t タイムアウト値 | ユーザーのアクションを待つ時間指定 |
/d 選択肢 | 指定しなかった場合のデフォルト値 |
/m ‘メッセージ’ | プロンプトに表示するメッセージ指定 |
/cs | 大文字と小文字を区別する |
errorlevelに好きな値を入れるbatファイル例
@echo off
REM サブルーチンでerrorlevelに好きな値を入れる
call :subr
echo 指定した値がエラーレベルに入っていればエラーレベルは777
echo エラーレベル=%errorlevel%
pause
:subr
echo サブルーチンの中のエラーレベルは%errorlevel%
exit /b 777
注意点はサブルーチンは最後に記入する(exitの後にはコマンドを書かない)
「set」コマンドで「errorlevel」に直接値をいれたらそれ以降は値は変更できない