目次
文字列を比較する
等しいときに処理を実行する
二つの文字列を比較して、その文字列同士が等しければ処理を実行するプログラムは以下のように書けます。
1 2 3 |
if [文字列1] == [文字列2] ( [文字列同士が等しい場合に実行する処理] ) |
例えば、変数「test1」と変数「test2」を比較して等しければ、変数の中身を表示するプログラムは以下のように書けます(if_sample_1.bat)。変数についての解説は、「バッチファイルで変数を使用する -やりたいことから検索-」をご覧ください。
1 2 3 4 5 6 7 8 |
@echo off set test1=apple set test2=apple if %test1% == %test2% ( echo 「test1」と「tes2」は「%test1%」です。 ) |
6行目から8行目がif文となっています。6行目で二つの変数の中身を比較し、等しい場合にだけ8行目の「echo 「test1」と…」コマンドを実行します。
以下は実行結果です。
等しくないときの処理を追加する
もし、等しくなかった場合の処理も追加したい場合には、「else」文を書き加えます。「if」文に書き加える形で使用します。
1 2 3 4 5 |
if [文字列1] == [文字列2] ( [文字列同士が等しい場合に実行する処理] ) else ( [文字列同士が等しくない場合に実行する処理] ) |
以下のバッチファイル(if_sample_2.bat)は前節の「if_sample_1.bat」に「else」文を追記しました。
1 2 3 4 5 6 7 8 9 10 11 |
@echo off set test1=apple set test2=りんご if %test1% == %test2% ( echo test1とtes2は「%test1%」です。 ) else ( echo test1は「%test1%」です。 echo test2は「%test2%」です。 ) |
8行目に「else」文を追記しました。これで、変数「test1」と変数「test2」が等しくない場合は、9行目~10行目のコマンドが実行されます。
以下は実行結果です。いま二つの変数の中身は異なるので、else文の( )内が表示されていることが分かります。
文字列の大文字と小文字を区別しない
文字列としてアルファベットを扱う場合、大文字と小文字の区別をしたくない場合もあるかと思います。小文字と大文字は同じ文字として判断して欲しいとき、「/i」オプションをつけて以下のように記述します(if_sample_3.bat)。
1 2 3 4 5 6 7 8 9 10 11 |
@echo off set test1=apple set test2=APPLE if /i %test1% == %test2% ( echo test1とtes2は「%test1%」です。 ) else ( echo test1は「%test1%」です。 echo test2は「%test2%」です。 ) |
6行目の「if」文で「/i」オプションを指定しました。
以下は実行結果です。いま、二つの変数は「apple」と「APPLE」で大文字と小文字の違いがありますが、実行結果から同じ文字として扱われたことが分かります。
等しくないときに処理を実行する
比較している文字列が等しくないときに処理を実行する場合には、「if」の代わりに「if not」を使用します。
1 2 3 |
if not [文字列1] == [文字列2] ( [文字列同士が等しい場合に実行する処理] ) |
もちろん、「if not」文にも「if」文と同様に「else」文が使用可能です。
1 2 3 4 5 |
if not [文字列1] == [文字列2] ( [文字列同士が等しくない場合に実行する処理] ) else ( [文字列同士が等しい場合に実行する処理] ) |
数値を比較する
等しいときに処理を実行する
文字列でなく、数値を比較したい場合には「equ」を使います。
1 2 3 |
if [数値1] equ [数値2] ( [二つの数値が等しい場合に実行する処理] ) |
以下は変数「value1」と変数「value2」を数値として比較し、等しければその値を表示するバッチファイルです(if_sample_4.bat)。
1 2 3 4 5 6 7 8 |
@echo off set value1=10 set value2=10 if %value1% equ %value2% ( echo value1とvalue2の値は「%value1%」です。 ) |
以下は実行結果です。
また、文字列の比較と同様に「if else」文も使用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@echo off set value1=10 set value2=20 if %value1% equ %value2% ( echo value1とvalue2の値は「%value1%」です。 ) else ( echo value1の値は「%value1%」ですが、 echo value2の値は「%value2%」です。 ) |
二つの変数(「value1」と「value2」)は異なる値を設定しています。
以下は実行結果です。
様々な比較演算子
文字列の場合と異なり、数値には等しいかどうか以外にも大小関係を比較する場合があります。そのためバッチでは以下のような演算子が用意されています。
equ | 等しい |
neq | 等しくない |
geq | 等しいか、より大きい(以上) |
leq | 等しいか、より小さい(以下) |
gtr | より大きい |
lss | より小さい(未満) |
以下のプログラムは変数「value1」と「value2」を比較する前節のバッチファイル(if_sample_4.bat)を編集し、「より大きい」ときと、「より小さい」ときに実行する処理を追加しました(if_sample_6.bat)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off set value1=10 set value2=20 if %value1% equ %value2% ( echo value1とvalue2の値は「%value1%」です。 ) else if %value1% gtr %value2% ( echo value1の値はvalue2の値より大きいです。 ) else ( echo value1の値はvalue2の値より小さいです。 ) |
以下、実行結果です。
ここでは、「else if」文を追加することにより、三つの処理に分岐させています。
「else if」を使用すればいくらでも条件分岐を増やすことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
if [数値] [比較演算子] [数値] ( [処理1] ) else if [数値] [比較演算子] [数値] ( [処理2] ) else if [数値] [比較演算子] [数値] ( [処理3] … ) else if [数値] [比較演算子] [数値] ( [処理X-1] ) else ( [処理X] ) |
if文を使用したプログラム例は、「入門講義【第7回】 ユーザが処理を選べるようにする」で具体的な使用例を紹介しています。
その他の特殊なif文
ファイルの存在有無で判断する
if文には、ファイルが存在するときにだけ処理を実行する特別な書き方が存在します。
1 |
if exist [ファイル名] [ファイルが存在するときに実行したいコマンド] |
例として、以下は「file.txt」ファイルが存在する場合に、そのファイルを削除するプログラムです。
1 |
if exist file.txt del file.txt |
単に、
1 |
del file.txt |
とだけ書いても、ファイルがない場合は「ファイルが見つかりません」という警告が出るだけで特に動作に問題は無いのですが(下図)、警告が出るのを嫌う場合によく書かれる定型的な書き方となっています。
直前のコマンドの成否で判断する
直前の処理が成功したか失敗したかを判断するには変数「errorlevel」を使用します。
変数「errorlevel」は、実行したコマンドが正常に終了したか、エラーで終了したかの情報が入る変数です。直前で実行したコマンドが正常終了した場合は0が入り、エラー終了した場合は1以上の数値が格納されます。この「errorlevel」に入っている数値のことを「終了コード」と呼びます。
すなわち、コマンドが正常に終了したか否かはこの「終了コード」を参照すれば確認できるということになります。
変数「errorlevel」の値によって実行する処理を決めるif文が特別に存在します。「errorlevel」の値が指定した終了コードだった場合に処理を実行するプログラムの構文は以下のようになります。
1 |
if errorlevel [終了コード] [errorlevelが終了コード以上だったときに実行したい処理] |
終了コードに等しいときではなく、ここで、「errorlevel」が終了コード以上のときにコマンドが実行されることに注意してください。
また、この構文に関しても「if not」が使用可能です。以下は、errorlevelが指定した終了コード以外のときに処理を実行する場合です。
1 |
if not errorlevel [終了コード] [errorlevelが終了コード未満だったときに実行したい処理] |
この場合も「errorlevel」が終了コード未満のときにコマンドが実行されることに注意です。
「if errorlevel」文をもっとも使う場面は、「直前のコマンドがエラー終了したときに処理を終了する」場合でしょう。以下プログラムは直前のコマンド「dir」を間違えて「div」と書いてしまったときエラー終了させた例です。
1 2 3 4 5 6 7 8 9 10 11 |
@echo off div if errorlevel 1 ( echo stage.3で異常終了しました。 pause exit ) echo 続きのコード |
コマンドエラーは「1」以上の数値が「errorlevel」に格納されるので、「if errorlevel 1」としています。エラーの種類によって「errorlevel」に格納される数値は変わってきますが、どにかく「1」以上の数値は何かしらのエラーが生じたことを示しています。
以下、実行結果です。
if文に引っかかりエラー終了していることが分かります(最後の行にかかれている「続きのコード」が表示されていません)。ここでは、( )を使って複数行のコマンドをひとまとめにしていることにも注目して下さい。
「errorlevel」コマンドに関しては、「errorlevelの値から分岐処理を行う -やりたいことから検索-」や「errorlevel(終了コードを取得する) -コマンド別解説-」を参照してください。