Help us understand the problem. What is going on with this article?

.bat(バッチファイル)のifコマンド解説。

More than 3 years have passed since last update.

 このページでは、バッチファイルに頻出するifコマンドについて、詳細な解説を行っています。

 ifコマンドには様々な使用形態があるので、久々にバッチを使うときや初めてバッチを使うときに戸惑うこともあるかと思います。
 そんなときには、是非このページをご覧下さい。

目次

1.ifコマンドの基本
2.ifコマンドの構文①~ == ~
3.ifコマンドの構文②~ 比較演算 ~
4.ifコマンドの構文③~ errorlevel ~
5.ifコマンドの構文④~ exist ~
6.ifコマンドの構文⑤~ defined ~
7.ifコマンドの構文⑥~ cmdextversion ~
8.ifコマンドの注意点・応用
 1.==とequの違い
 2.if文の入れ子には気を付けよう
9.まとめ

1.ifコマンドの基本

 if文とは、「条件付き処理」を行うコマンドです。そのまんまですね。
 下の文章をご覧ください。

標準形
if 条件 真コマンド else 偽コマンド
 
もしくは…
 
if 条件 (真コマンド) else (偽コマンド)

 これがif文の標準的な形となります。
 ・「条件」で様々な条件を指定します。
  例えば「もし変数hogeが3以上なら」みたいな感じです。この条件には様々な種類があります(後述)。
 ・「真コマンド」に、条件が真だったときの処理を記入します。
 ・「else 偽コマンド」で、もしそうでなかったとき=偽だったときの処理を記入できます。
  else以降は省略することも多く、そうすると「条件が真だったときだけ○○を実行」という風になります。

注意点

 「elseを使用した時に」、「真コマンドか偽コマンドでスペースを使う場合」は、コマンドを()でくくる必要があります。
 その際、()の外側は必ず半角スペースを挟むことを忘れないで下さい。
 
 ただし、偽コマンドがifの場合は必要ありません。

2. ifコマンドの構文①~ == ~

==
if (not) 文字列A==文字列B コマンド

 この構文では、「2つの文字列を比較して、それが等しかった場合」にコマンドが実行されます。
 よく間違えられるのですが、このコマンドは数値を比較しているわけではありません。覚えておきましょう。
 ちなみに、notを付けると真偽が逆転します。≠≠と書いても逆にはなりませんよ!

==の例
set variable=hoge
if %variable%==hoge echo 変数の中身はhogeだよ
if not %variable% == fuga (
    echo 変数の中身はfugaじゃないよ
) else (
    echo 変数の中身はfugaだよ
)

こんな感じです。ちなみに実行結果は、

==の例の結果
変数の中身はhogeだよ
変数の中身はfugaじゃないよ

です。わかりましたか?

まとめ・注意点

 文字列同士が等しいかどうかは、==で判別できます。
 もし「比較する変数が空である可能性がある場合」は両方の文字列を""でくくる必要があります。
 そうしないと、もし片方が空だったときに比較対象がなくなって、エラーが発生します。

3. ifコマンドの構文②~ 比較演算 ~

比較演算
if (/i) 文字列A 比較演算子 文字列B コマンド

 先ほどの==と同じかそれ以上に多用される形式です。
 この構文では、「2つの文字列を比較演算子で比較して、それが真の場合」にコマンドが実行されます。

 先ほどとの違いは、
・notが使えない代わりに演算子が使える
文字列が両方とも数字だった場合は数字の大小の比較になる
 です。2つ目の何が問題なのかは、このページの一番下で解説します。

 比較演算子は6つあります。覚えましょう。

比較演算子
equ 等しい
neq 等しくない
gtr より大きい
geq 以上
leq 以下
lss より小さい(=未満)

 特に難しくはないですね。
 /iを付けると、大文字と小文字を区別しなくなります。

まとめ・注意点

 文字列や数字の大小を比較するには、比較演算子を使います。ちなみに、""のルールは先ほどと一緒です。
 
 …文字列に大小があるのかって??
 A>a。abc<abd。A<b。ab<Ac。bb>Ac。
 とまあ法則はありますが、例外があると怖いし検証は面倒なので、2文字以上の文字列は比較しないことをお勧めします。

4. ifコマンドの構文③~ errorlevel ~

errorlevel
if (not) errorlevel エラーの番号 コマンド

 この構文では、「直前に実行したコマンドのエラーレベルが指定した番号以上の場合」にコマンドが実行されます。
 いいですか、「指定した番号以上の場合」です。「指定した番号の場合」じゃないです。

 エラーレベルについての詳細な説明は省きますが、簡単に言うと「実行したコマンドが正常に終了すれば0、そうでなければ1以上」となります。
 そしてそのエラーレベルは%errorlevel%という特殊な変数に勝手に代入されています。

まとめ・注意点

 大人しく、%errorlevel%に対して比較演算子を使いましょう。この構文では、geqかlssでしか判定できません。

5. ifコマンドの構文④~ exist ~

exist
if (not) exist ファイル名 コマンド

 この構文では、「指定したファイルが存在する場合」にコマンドが実行されます。
 ファイル名が絶対パス(c:\などから始まるもの)でない場合、カレントディレクトリ(バッチファイルがあるフォルダ)の中を検索します。
 特に難しくもないですね。

まとめ・注意点

 ファイルを探索する場合、existを使用します。
 バッチファイルがあるフォルダ以外を検索したいときは、ドライブ名から入力しましょう。
 ファイル名に半角スペースや半角小カッコがある場合、""で括りましょう。

6 ifコマンドの構文⑤~ defined ~

2016/11/02追記

 本節でnotが使用できないとありましたが、使えました。ごめんなさい。
 自分で記事書いときながら変数名の指定を間違えてました。アホです。
 shinichy様にコメント欄でご指摘いただきました。ありがとうございます!
 混乱を防ぐため、該当部分は削除済です。大変申し訳ありませんでした。

defined
if defined 変数名 コマンド

 この構文では、「指定した環境変数が定義されている場合」にコマンドが実行されます。

まとめ・注意点

 環境変数が定義されているか確かめたい場合、definedを使います。

7. ifコマンドの構文⑥~ cmdextversion ~

cmdextversion
if cmdextversion バージョンの番号 コマンド

 この構文では、「現在のコマンドプロセッサの拡張機能のバージョンが指定した番号以上の場合」にコマンドが実行されます。
 errorlevelと同じく、指定した番号以上でしか動作しません。しかもnotが使えません。

 そしてerrorlevelと同じく%cmdextversion%という変数が存在します。後は分かるな…?

まとめ・注意点

 現在のcmd.exeの拡張機能のバージョンを確かめたい場合、cmdextversionを使います。
 notが使えないので、geqでしか判別できません。
 大人しく%cmdextversion%に対して比較演算子を使いましょう。
 
 ちなみに、これを使う機会は一生のうち1回程度だと思います。

8. ifコマンドの注意点・応用

 少し難しい内容となります。読むときはゆっくり読んでください。

1.==とequの違い

 最初に、次のコードを見てください。

==とequの違い
@echo off
if 8 == 010 (
    echo T
) else echo F
if 8 equ 010 (
    echo T
) else echo F

pause >nul

 「8」「010」という2つの文字列を、==とequで比較しています。
 同じならT、異なればFと表示されます。

 では、実行してみます。

==とequの違いの結果
F
T

 同じ比較のはずなのに、答えが異なっています!一体なぜでしょうか?

 これは、0で始まる文字列は、それを数字として扱う場合、8進数扱いになるという仕様が影響しています。

 上のほうでは==、すなわち文字列として比較しているので、当然別物と判断されます。
 ですが下のほうでは、比較演算子かつ両側とも数字だけの文字列なので、数字として大小が比較されます。
 忘れた人は前に戻って見直しましょう。

 8進数での10は10進数での8なので、8と010は同じだと判断されるのです。

まとめ・注意点

 大分前に述べた、
      ==:このコマンドは数値を比較しているわけではありません。
  比較演算子:・文字列が両方とも数字だった場合は数字の大小の比較になる
 という但し書きの意味は上記の問題によるものです。
 
 数字が0から始まるシチュエーションというのは、少ないようで意外と多いです。
 数字の比較で==を使うメリットは全くありませんので、ちゃんとequを使いましょう。

2.if文の入れ子には気を付けよう

if文の入れ子には気を付けよう
@echo off
if 1 ==2 (
if 3 geq 2 (
echo 1
) else if not 2 lss 4 (
echo 2) else (
echo 3
)) else (
if not 4==1 (echo 4
) else (
echo 5))
pause >nul

まとめ・注意点

 ifを複数回連続で使うことはよくあります。(3つの変数が全部同じかを確かめるときなど)
 ですがifの中でifを使うとどうしても読みづらくなります。
 ちゃんと工夫して、少しでも読みやすくなるように記述しましょう。他の人や未来の自分が困惑します。
 
 ちなみに上のコードでは4が出力されます。

9.まとめ

 いかがでしたか?
 駆け足気味の解説だった気がしますが、説明の短いものはそれだけ使用頻度も低いです。

 if文は本当にバッチファイルによく出てくるコマンドです。他のコマンドと組み合わせると、スタイリッシュなバッチファイル(?)が書けるようになりますので、是非覚えてみてください。

 .bat初心者・未経験者に贈るコマンド集
 .bat(バッチファイル)でゲームを作るうえで必要な、10の基礎知識。
 では、実践的にifが使われていたりするので、よかったらご覧ください。

 (リンク先では普通に数字の比較に==を使っていますが、エラーは発生し得ないので問題ありません。が、慣れるまでは区別するようにしましょう。)
 
 
 

10.実行するかは不明の予告

 そのうち、for文の解説もしたいと思います。

plcherrim
バッチファイルが好き。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした