バッチファイルで条件分岐をするif文の使い方

プログラミング

プログラムを書くときに使われる条件分岐。

バッチファイルにも条件分岐を行うための『if』コマンドがあります。

この記事では、『if』コマンドについて解説します。

ifの使い方

バッチファイルの『if』コマンドは次のように書きます。

if 条件 (
  条件が真だったときの処理
)

条件が『真』になったときだけ、if文の次の()で囲まれた部分のコマンドが実行されます。

条件が真のときに実行するコマンドが1行のときは、次のようにも書けます。

if 条件 条件が真だったときの処理

例えば、2つの文字が同じかどうかの比較は、『文字列1==文字列2』のように書きます。

一般的なプログラム言語では、文字列は『”(ダブルクォーテーション)』でくくる必要がありますが、バッチファイルでは『”』は必要ありません。

※文字列に空白を含む場合は、『”』で囲む必要があります。

@echo off

if あいうえお == あいうえお (
  echo ここは実行されます
) 

if あいうえお == かきくけこ (
  echo ここは実行されません
)

pause

このバッチファイルを実行したら次のようになります。

bat-if-basic

バッチファイルの作り方については、こちらの記事を参考にしてください。

このように「あいうえお==あいうえお」は同じ文字列なので『真』と判定され、「あいうえお==かきくけこ」は違う文字列なので『偽』と判定されます。

not

条件が『偽』のときに実行したいときは、『not』を使います。

@echo off

if not あいうえお == かきくけこ (
  echo ここは実行されます
)

pause

if else

複数の条件分岐をしたい場合は『else』を使います。

if 条件1 (
    条件1が真だったときの処理
) else if 条件2 (
    条件2が真だったときの処理
) else (
    それ以外のときの処理
)

大文字と小文字を区別しない

『if』コマンドでは、文字列を比較するとき大文字と小文字区別して判定されます。

以下のコードを実行すれば、「別の文字です」と表示されます。

@echo off

if apple == APPLE (
  echo 同じ文字です
) else (
  echo 別の文字です
)

pause

大文字と小文字を区別したくないときは『/i』を使います。

@echo off

if /i apple == APPLE (
  echo ここは実行されます
)

if /i apple == Apple (
  echo ここも実行されます
)

pause

比較

以下のバッチファイルを実行すれば、「15は30より小さいです」と表示されます。

『gtr』演算子は、次の値より大きいかを比較するので、15が30より大きいかを判定しています。

@echo off

if 15 gtr 30 (
  echo 15は30より大きいです
) else (
  echo 15は30より小さいです
)

pause

比較演算子には、次のようなものがあります。

  • equ:次の値と等しい
  • neq:次の値と等しくない
  • lss:次の値未満
  • gtr:次の値より大きい
  • leq:次の値以下
  • geq:次の値以上

『==』と『equ』の違い

『==』と『equ』は、同じく『等しい』ときですが、違いがあります。

  • 『==』:文字列として判定
  • 『equ』:値として判定

次のコードを見てください。「8」と「010」が等しいか判定しています。

両方とも「8と010は違います」と表示されると思いますよね。

@echo off

if 8 == 010 (
  echo 8と010は同じです
) else	(
  echo 8と010は違います
)

if 8 equ 010 (
  echo 8と010は同じです
) else	(
  echo 8と010は違います
)

pause

実行すると次のように表示されます。

bat-if-compare

『==』では違うと判定されましたが、『equ』では同じと判定されています。

これは、なぜでしょうか?

バッチファイルでは、「0」で始まる数は8進数として扱われます。

つまり「010」は、8進数の数だと判断され、8進数の「10」を10進数にすると「8」になります。

10進数の「8」と8進数の「010」は、同じ数値のため、『equ』では『true』と判定されてしまったのが原因です。

ファイルの存在

if exist ファイル名 コマンド』で、指定したファイル名が存在するかを判定することができます。

以下のバッチファイルは、バッチファイルと同じディレクトリに『test.txt』ファイルが存在するか判定します。

@echo off

if exist test.txt (
  echo test.txtファイルが存在します
) else	(
  echo test.txtファイルが存在しません
)

pause

ファイル名を絶対パスで指定することもできます。

@echo off

if exist C:\Users\user\Documents\test.txt (
  echo test.txtファイルが存在します
) else	(
  echo test.txtファイルが存在しません
)

pause

errorlevel

バッチファイルには、直前の処理が成功したかの判断に『errorlevel』が使われます。

『errorlevel』は、実行したコマンドが成功すれば「0」、失敗した場合は1以上の数値が格納されます。

if errorlevel 番号 コマンド』で、errorlevelが番号以上のときにコマンドを実行できます。

@echo off

if errorlevel 1 (
  echo errorlevelが1以上
) else	(
  echo errorlevelが1より小さい
)

pause

エラーレベルは、変数「errorlevel」に格納されているので、比較演算子を使うこともできます。

@echo off

if %errorlevel% equ 1 (
  echo errorlevelが1
) else	(
  echo errorlevelが1以外
)

pause

変数の定義

バッチファイルでは、『set 変数名=値』で変数を定義しますが、変数が定義されているか判定することができます。

それが『if defined 変数 コマンド』です。

@echo off

if defined a (
  echo 変数aが定義されています
) else	(
  echo 変数aが定義されていません
)

set a=あいうえお

if defined a (
  echo 変数aが定義されています
) else	(
  echo 変数aが定義されていません
)

pause
bat-if-defined

1番目の『if』コマンドのときには変数aが定義されていませんが、2番目の『if』コマンドのときには変数aが定義されているので実行されるコマンドが異なっています。

まとめ

バッチファイルでは、『if』コマンドを使えば条件分岐をすることができます。

  • if [not] 文字列1==文字列2 コマンド
  • if [not] exist ファイル名 コマンド
  • if [not] errorlevel 番号 コマンド
  • if [not] defined 変数 コマンド

比較演算子などには次のようなものがあります。

  • not:条件が偽の場合にコマンドを実行する
  • equ:次の値と等しい
  • neq:次の値と等しくない
  • lss:次の値未満
  • gtr:次の値より大きい
  • leq:次の値以下
  • geq:次の値以上
  • /i:文字列の比較で、大文字と小文字を区別しない
  • /?:ヘルプを表示する

バッチファイルを使えば、いろいろな作業を効率化することができます。

参考

Microsoft ドキュメント if

タイトルとURLをコピーしました