バッチファイルで条件分岐を使う(IF)

バッチファイルでは IF コマンドを使用して記述した条件が一致する場合にコマンドを実行させることができます。条件には文字列と文字列を比較したり、指定したファイルが存在するかなどを記述することができます。ここでは IF コマンドを使いバッチファイルの中で条件分岐を行う方法について解説します。

(Last modified: )

IFコマンドの使い方

IF コマンドにはいくつか書式がありますが、基本となる記述方法は次の通りです。

IF 条件式 コマンド

条件式には文字列と文字列を比較したりファイルが存在するかどうかなどを記述します。この条件を満たす場合だけ条件式の後に記述されたコマンドが実行されます。

条件式を満たす場合の他に満たさなかった場合には別のコマンドを実行させることもできます。次のように記述します。

IF 条件式 コマンドA ELSE コマンドB

条件式が満たされる場合にはコマンドA、満たされなかった場合にはコマンドBが実行されます。

また IF コマンドは括弧()を使って複数行に分けて記述することもできます。条件式が満たされた場合に複数のコマンドを実行したい場合などにはこちらの方が記述しやすいかもしれません。注意して頂きたいのは「(」の前と「)」の後には必ず半角スペースを記述する必要があります。

IF 条件式 (
  コマンドA1
  コマンドA2
) ELSE (
  コマンドB1
  コマンドB2
)

それでは条件式の記述の仕方をみていきます。

文字列と文字列を比較する

条件式で文字列Aと文字列Bが等しいかどうかを判断するには次のように == を使って記述します。文字列Aと文字列Bが等しい場合にコマンドが実行されます。

IF 文字列A==文字列B コマンド

条件式の前に NOT を記述すると文字列Aと文字列Bが等しくない場合にコマンドが実行されます。

IF not 文字列A==文字列B コマンド

変数に格納されている値と比較する場合は、次のように変数名の前後に % を記述します。比較する文字列の部分も変数でも構いません。

IF %変数名%==文字列 コマンド

テストを行うために次のような簡単なバッチファイル iftest.bat を c:\ に作成しました。

@echo off
set answer=
set /p answer=本を英語で何と言いますか?

if %answer%==BOOK (
  echo 正解です!
) else (
  echo 残念、不正解です
)

バッチファイルを実行すると質問が表示されますので回答を入力してください。

文字列と文字列を比較する(1)

正しい回答を入力すると「正解です!」と表示されます。

文字列と文字列を比較する(2)

誤った回答をすると「残念、不正解です」と表示されます。

文字列と文字列を比較する(3)

数値と数値を比較する

文字列と文字列を比較する場合、等しいかどうかだけではなく比較演算子を使って条件式が正しいかどうかの判断をすることができます。

IF 文字列A 比較演算子 文字列B コマンド

/I オプションを付けると大文字と小文字の区別を行わずに比較します。

IF /I 文字列A 比較演算子 文字列B コマンド

使用できる比較演算子は次のようなものがあります。

演算子意味
EQU等しい
NEQ等しくない
LSSより小さい
LEQ以下
GTRより大きい
GEQ以上

この書式は文字列どうしで比較する場合にも使えますが、文字列Aと文字列Bがそれぞれ数字だった場合には、文字列が数値に変換されて比較されるため、数値と数値を比較するためにも使用することができます。

テストを行うために次のような簡単なバッチファイル iftest.bat を c:\ に作成しました。

@echo off
set answer=
set /p answer=年齢は何歳ですか?

if %answer% GEQ 18 (
echo 利用できます!
) else (
echo 18歳未満は使用できません
)

今回は入力した年齢が 18 以上か、そうでないかで結果が異なります。バッチファイルを実行すると質問が表示されますので回答を入力してください。

数値と数値を比較する(1)

18 以上の数値を入力した場合は次のように表示されます。

数値と数値を比較する(2)

18 より小さい数値を入力した場合は次のように表示されます。

数値と数値を比較する(3)

条件式で変数が未定義の場合にエラーにならないようにする

条件式で変数に格納された値を比較する場合、変数が未定義だとエラーが発生します。先程のサンプルのようにユーザーが入力された値を変数に格納し、変数を文字列や数値と比較する場合などには注意が必要です。

文字列と文字列で比較する時に使用したバッチファイルを改めて実行します。

@echo off
set answer=
set /p answer=本を英語で何と言いますか?

if %answer%==BOOK (
  echo 正解です!
) else (
  echo 残念、不正解です
)

何も入力せずに [Enter] キーを押してみてください。エラーが表示されます。

条件式で変数が未定義の場合にエラーにならないようにする(1)

もし何も入力しなくてもエラーにならないようにする場合は、条件式の左側と右側をそれぞれダブルクォーテーションで囲ってください。

先ほどのバッチファイルを次のように変更します。

@echo off
set answer= set /p answer=本を英語で何と言いますか?

if "%answer%"=="BOOK" (
  echo 正解です!
) else (
  echo 残念、不正解です
)

バッチファイルを実行し、何も入力せずに [Enter] キーを押してみてください。今度はエラーにはなりませんでした。

条件式で変数が未定義の場合にエラーにならないようにする(2)

正しい回答を入力すると「正解です!」と表示されます。

条件式で変数が未定義の場合にエラーにならないようにする(3)

-- --

また IF コマンドで DEFINED を使って変数が定義されているかどうかを判定することもできます。

IF DEFINED 変数 コマンド

IF NOT DEFINED 変数 コマンド

変数が定義されていれば条件式が真となりコマンドが実行されます。NOT を付けた場合は変数が定義されていない場合に条件式が真となりコマンドが実行されます。

この書式と GOTO コマンドを利用して、何も入力されなかった場合は入力をやり直すようにバッチファイルを書き換えてみます。

@echo off
:start
set answer=
set /p answer=本を英語で何と言いますか?

if not defined answer (
  echo 値を入力しなおしてください
  goto start
)


if "%answer%"=="BOOK" (
  echo 正解です!
) else (
  echo 残念、不正解です
)

バッチファイルを実行したあと、質問が表示されたときに何も入力せずに[Enter]キーを押すと、メッセージを表示したあと改めて入力をうながします。

条件式で変数が未定義の場合にエラーにならないようにする(4)

何か入力をしてから[Enter]キーを押せば、回答が正しいかどうかの判定をします。

条件式で変数が未定義の場合にエラーにならないようにする(5)

ファイルやディレクトリが存在するかどうかを調べる

IF コマンドでは条件式としてファイルやディレクトリが存在するかどうかを記述できる書式が用意されています。

IF [NOT] EXIST ファイル名 コマンド

ファイル名に指定したファイルが存在する場合は条件式が真となりコマンドが実行されます。ファイル名だけを記述した場合はカレントディレクトリ内にあるかどうかを探します。カレントディレクトリ以外のファイルを探す場合は絶対パス付きで指定してください。

テストを行うために次のような簡単なバッチファイル iftest.bat を c:\test に作成しました。

@echo off
set answer=
set /p answer=ファイル名を入力してください

if exist %answer% (
  echo ファイルは存在します
) else (
  echo ファイルは存在しません
)

バッチファイルを実行するとファイル名の入力待ちとなります。

ファイルやディレクトリが存在するかどうかを調べる(1)

ファイル名を入力して [Enter] キーを押すと、入力したファイル名がカレントディレクトリに存在するかどうかを調べて対応するメッセージを表示します。

ファイルやディレクトリが存在するかどうかを調べる(2)

ファイルやディレクトリが存在するかどうかを調べる(3)

カレントディレクトリ内にあるサブディレクトリ名を入力した場合も存在した場合は条件式が真となります。ただファイルなのかディレクトリなのかは判別できません。

ファイルやディレクトリが存在するかどうかを調べる(4)

-- --

IF コマンドを使ってバッチファイルの中で条件分岐を行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。