batファイルで条件分岐したい時には「if」構文を使用します。今回はifを使い方をまとめます。
batファイルに限らずプログラミングの条件分岐で処理を変える事は、業務をよりインタラクティブにする事が出来ます。
またifで複数条件指定したい場合のやり方も記述しています。
batファイルで使用できる条件など例文を踏まえて紹介するので理解しやすいです。
- 「exist」を使用して、カレントディレクトリにファイルが存在するかどうかで処理を変える
- 「errorlevel」を使用して、直前のコマンドの成功、失敗などで条件分岐を行う
- 「defined」を使用して、変数に値が入っているかで条件分岐する
応用では「defined」や「goto」などを使用して、実務で使用できるバッチファイルをご紹介します。
という事で今回はバッチファイルの条件分岐のifの基本から応用まで例文を踏まえご紹介します。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
この記事を読んだあとはbatファイルの「if」について理解できて使いこなせます。
batファイルでのifの基本構文

バッチファイルでifの基本構文を以下で紹介します。
if 比較 処理
処理を複数指定したい場合は、以下のようにカッコで囲みます。
if 比較 (
処理1
処理2
・・・
)
複数条件指定したい場合は、以下のように「else if」を使用します。
if 比較1 処理
else if 比較2 処理
else if 比較3 処理
・・・
どの比較にも当てはまらない場合の処理は「else」で指定可能です。
if 比較1 処理
else if 比較2 処理
else どの比較にも当てはまらない場合の処理
では比較にはどのようなものがあるのでしょうか?
比較対象としては基本的には2種類あります。
- 文字列を比較する
- 数字を比較する
文字列を比較する演算子
バッチファイルのifで使用する文字列比較演算子を以下にまとめます。シンプルですね。
比較演算子 | 説明 |
---|---|
A == B | AとBは文字列が同じ |
not A == B | AとBは文字列が違う |
大文字と小文字を区別しないオプションは「/i」です。
例文として変数に文字列を入れて、その変数を使用して文字列の比較で条件分岐してみます。

@echo off
set moji=mojiretsu
if /i %moji% == mojiretsu (
echo 文字列はあっています。
)
pause
最初の「@echo off」はbatファイルに記述したコマンドを表示しないコードです。なぜこのコマンドを入れるかは以下の記事を参考にしてください。

3行目で「moji」という変数に文字列を入れています。
4行目でその文字列を比較しています。あっていれば5行目のメッセージを表示します。
最後の「pause」はバッチファイルを一時停止させるコマンドです。なぜこのコマンドを入れるかは以下の記事を参考にしてください。

バッチファイルを実行した結果は以下です。

文字列はあっています。
バッチファイルのifで変数の中の文字列を比較する時の注意点があります。
変数に値を入れる時は「=」にスペースは不要だが、比較演算子の「==」の前後に半角スペースが必須
数字を比較する演算子
数字の比較演算子を以下にまとめます。少しややこしいですが、下の表を見ればよくわかります。
比較演算子 | 説明 | 英文 |
---|---|---|
equ | 等しい | equal |
neq | 等しくない | not equal |
geq | 以上 | greater than or equal |
leq | 以下 | less than or equal |
gtr | より大きい | greater than |
lss | より小さい | less than |
以上がバッチファイルの「if」の基本情報です。
次からは「if」の比較にあるコマンドの使用した組み合わせによる処理を行います。
batファイルのifとexistで条件分岐

「if」と「exist」を用いたバッチファイルです。
「exist」は存在するという意味で、ファイルの存在があれば真となります。
対義語としては「not exist」にすればOKです。
では「if」と「exist」を用いたバッチファイルを作成してみます。
カレントディレクトリに「test1.txt」ファイルがなければ、そのファイルを作成するバッチファイルです。
@echo off
if not exist test1.txt (
echo null>test1.txt
)
pause
3行目で「exist」でファイルの存在がない事を条件としています。
4行目ではファイルを作成しています。バッチファイルでファイルを作成する方法は以下の記事を参考にしてください。

このバッチファイルを実行してみると、ディレクトリに「text1.txt」ファイルが出来上がりました。

ファイルが存在するかしないかで処理を分ける事はかなりあるので、「if」と「exist」のバッチファイルは必ず出来るようになってください。

batファイルのifとerrorlevelで条件分岐

「if」と「errorlevel」を用いたバッチファイルです。
「errorlevel」は直前のコマンドが成功したかどうかによって値が入る変数です。「errorlevel」については以下の記事で詳しく説明しています。

「if」と「errorlevel」を用いたバッチファイルの基本スタイルは以下です。
if errorlevel 数字 (
errorlevelに入っている数字が、指定した数字以上だと当てはまる処理
)
「if」と「errorlevel」を用いたバッチファイルの注意点としては、指定した数字以上という事です。
指定した値にしたい場合は以下のようにしてください。
if %errorlevel% equ 数字 (
errorlevelに入っている数字が、指定した数字と等しいと当てはまる処理
)
変数の前後に「%」を付けて変数を展開して、数字の比較の演算子を用いて条件分岐しています。
では「if」と「errorlevel」を用いたバッチファイルを作成してみます。
直前のコマンドの結果によって条件分岐するバッチファイルです。
@echo off
if errorlevel 9009 (
echo errorlevel 9009以上
) else if errorlevel 1 (
echo errorlevel 1以上
) else if errorlevel 0 (
echo errorlevel 0以上
)
pause
3行目で「errorlevel」の値が9009以上のものを条件としています。
「errorlevel」に入る値については以下の記事を参考にしてください。

ifの基本で説明した複数条件を元にバッチファイルを作成しました。
特にコマンドを実行していないので、成功の「0」が入っています。バッチファイルを実行してみます。
errorlevel 0以上
続行するには何かキーを押してください . . .
想定通りの結果となりました。
batファイルのifで変数に値が入っているか確認

変数が入っているか確認するバッチファイルの基礎
「if」と「defined」を用いたバッチファイルです。
「defined」は指定した変数に値が入っているか確認するコマンドです。
「if」と「defined」を用いたバッチファイルの基本スタイルは以下です。
if defined 変数 (
指定した変数に値が入っている時の処理
)
変数が入っていない時のバッチファイル実行結果
では「if」と「defined」を用いたバッチファイルを作成してみます。
@echo off
if defined moji (
echo 変数は入ってます。
)
pause
3行目で「moji」という変数に値が入っているかを条件としています。
特に変数を指定していないので、何も表示されないです。バッチファイルを実行してみます。
続行するには何かキーを押してください . . .
想定通りの結果となりました。
変数が入っていた時のバッチファイル実行結果
では変数に値を入れるコマンドを入れて実行してみます。
@echo off
set moji=test
if defined moji (
echo 変数は入ってます。
)
pause
3行目の「set」コマンドで「moji」という変数に値をいれています。
今回は変数を指定したので、メッセージが表示されます。バッチファイルを実行してみます。
変数は入ってます。
続行するには何かキーを押してください . . .
想定通りの結果となりました。
応用編:ifを使い業務で使用できるbatファイルをご紹介

では「if」を使用して実業務でよく使用する例をご紹介します。
よくユーザーに値を入力してもらい、その文字を使用してインタラクティブに文字を表示する事はよくあります。
下のバッチファイルを見て下さい。これはユーザーの名前を入力してもらい、その名前を使用してメッセージを表示するバッチファイルです。
@echo off
set /p name="名前を入力してください"
echo こんにちは%name%さん!
pause
3行目はsetコマンドでユーザーに名前を入力してもらうメソッドです。

4行目でユーザーに入力してもらった名前と文字列を結合して表示させています。

batファイルを実行して見ます。
名前を入力してください:山田
こんにちは山田さん!
続行するには何かキーを押してください . . .
「名前を入力してください:」の後に名前を入力したら、「こんちには山田さん!」と表示されました。
ではこのバッチファイルで名前を入力せずにエンターをします。
名前を入力してください:
こんにちはさん!
続行するには何かキーを押してください . . .
名前を入力しないでもエラーになりません。これでは2流です。
@echo off
:name_input
set /p name="名前を入力してください:"
if defined name (
echo こんにちは%name%さん!
) else (
goto :name_input
)
pause
3行目にラベルを付けます。ラベルとは目印で「goto」コマンドでラベルを指定するところに移動出来ます。

6行目で今回使用した「if」と「defined」を使用して、変数に値が入っているかを確認しています。
7行目で変数に値が入っていればメッセージを表示します。
8行目から10行目で変数に値が入っていなかった時の処理を追加しました。gotoで3行目につけたラベルに移動する処理です。これで名前を入力しない場合はもう一度名前を聞く処理に戻る事が出来ます。
では修正したバッチファイルを実行してみます。入力を促されたら3回空白でエンターを押してみます。
名前を入力してください:
名前を入力してください:
名前を入力してください:
名前を入力してください:山田
こんにちは山田さん!
続行するには何かキーを押してください . . .
空白の場合はもう一度名前を聞かれています。名前を入力して変数に文字が入力された時点でメッセージが表示されてバッチファイルが終了しています。
このように色んな場合を想定したバッチファイルの設計が必要です。それが「if」を使用すれば簡単にできます。

batファイルでifの使い方のまとめ

バッチファイルでifの基本構文は以下です。
if 比較 処理
複数条件指定したい場合は、以下のように「else if」や「else」を使用します。
if 比較1 処理
else if 比較2 処理
else if 比較3 処理
・・・
else どの比較にも当てはまらない場合の処理
比較対象としては基本的には2種類あります。
- 文字列を比較する
- 数字を比較する
文字列を比較する演算子
バッチファイルのifで使用する文字列比較演算子を以下にまとめます。
比較演算子 | 説明 |
---|---|
A == B | AとBは文字列が同じ |
not A == B | AとBは文字列が違う |
大文字と小文字を区別しないオプションは「/i」です。
数字を比較する演算子
数字の比較演算子を以下にまとめます。
比較演算子 | 説明 | 英文 |
---|---|---|
equ | 等しい | equal |
neq | 等しくない | not equal |
geq | 以上 | greater than or equal |
leq | 以下 | less than or equal |
gtr | より大きい | greater than |
lss | より小さい | less than |
ifとexistで条件分岐
「if」と「exist」を用いたバッチファイルは、ファイルの存在があれば真となります。対義語としては「not exist」にすればOKです。

「if」と「exist」を用いたバッチファイルの例
@echo off
if not exist test1.txt (
echo null>test1.txt
)
pause
ifとerrorlevelで条件分岐
「if」と「errorlevel」を用いたバッチファイルでは、直前のコマンドが成功したかどうかによって条件分岐します

「if」と「errorlevel」を用いたバッチファイルの基本スタイルは以下です。
if errorlevel 数字 (
errorlevelに入っている数字が、指定した数字以上だと当てはまる処理
)
「if」と「errorlevel」を用いたバッチファイルの注意点としては、指定した数字以上。指定した値にしたい場合は以下のようにする。
if %errorlevel% equ 数字 (
errorlevelに入っている数字が、指定した数字と等しいと当てはまる処理
)
「if」と「errorlevel」を用いたバッチファイルの例
@echo off
if errorlevel 9009 (
echo errorlevel 9009以上
) else if errorlevel 1 (
echo errorlevel 1以上
) else if errorlevel 0 (
echo errorlevel 0以上
)
pause
ifで変数に値が入っているか確認
「if」と「defined」を用いたバッチファイルは、指定した変数に値が入っているかどうかでの条件分岐でした。
「if」と「defined」を用いたバッチファイルの基本スタイルは以下です。
if defined 変数 (
指定した変数に値が入っている時の処理
)
「if」と「defined」を用いたバッチファイルの例
@echo off
set moji=mojiretsu
if defined moji (
echo 環境変数は入ってます。
)
pause
応用編:ifを使った業務で使えるbatファイル
ユーザーに値を入力してもらいその文字を使用してインタラクティブに文字を表示する。入力なしであれば催促するバッチファイル
@echo off
:name_input
set /p name="名前を入力してください:"
if defined name (
echo こんにちは%name%さん!
) else (
goto :name_input
)
pause