IF(条件分岐)
バッチファイルを作成していると、「条件に応じて処理を分けたい」という場面は非常に多く発生します。
例えば、ファイルが存在するときだけコピーを実行する、前のコマンドが成功したら次の処理に進む、といったケースです。
このような条件分岐を実現するのが IF コマンドです。
この記事では、IF コマンドの基本から応用まで、具体的なサンプルコードを交えて詳しく解説します。
IF コマンドの基本構文
IF コマンドの基本的な構文は以下の通りです。
IF 条件 (
rem 条件が真の場合に実行する処理
)
条件が偽の場合の処理も記述する場合は、ELSE を使用します。
IF 条件 (
rem 条件が真の場合の処理
) ELSE (
rem 条件が偽の場合の処理
)
ELSE は、直前の閉じ括弧 ) と同じ行に記述する必要があります。改行して ELSE
を書くと正しく動作しません。
文字列を比較する
2 つの文字列が等しいかどうかを判定するには、== 演算子を使用します。
IF "%変数%"=="比較する文字列" (
rem 一致する場合の処理
)
比較する値はダブルクォーテーションで囲むことを推奨します。変数が空の場合に構文エラーを防ぐことができます。
使用例
ユーザーからの入力に応じて処理を分岐する例です。
@echo off
setlocal
set /p ANSWER=続行しますか?(Y/N):
IF "%ANSWER%"=="Y" (
echo 処理を続行します。
) ELSE (
echo 処理を中止しました。
)
endlocal
大文字・小文字を区別しない比較
/I オプションを使用すると、大文字・小文字を区別せずに比較できます。
IF /I "%ANSWER%"=="y" (
echo 処理を続行します。
)
この書き方であれば、Y でも y でも条件が真になります。
数値を比較する
数値を比較する場合は、以下の比較演算子を使用します。
| 演算子 | 意味 | 例 |
|---|---|---|
EQU | 等しい(Equal) | IF %A% EQU 10 |
NEQ | 等しくない(Not Equal) | IF %A% NEQ 0 |
LSS | より小さい(Less Than) | IF %A% LSS 100 |
LEQ | 以下(Less or Equal) | IF %A% LEQ 100 |
GTR | より大きい(Greater Than) | IF %A% GTR 0 |
GEQ | 以上(Greater or Equal) | IF %A% GEQ 1 |
使用例
@echo off
setlocal
set /a NUM=75
IF %NUM% GEQ 80 (
echo 合格です(優秀)
) ELSE IF %NUM% GEQ 60 (
echo 合格です
) ELSE (
echo 不合格です
)
endlocal
上記の例のように ELSE IF
を連続して記述することで、複数の条件を順番に評価できます。最初に真となった条件のブロックだけが実行されます。
ファイルやフォルダの存在を確認する
IF EXIST を使うと、指定したファイルやフォルダが存在するかどうかを確認できます。
IF EXIST "パス" (
rem 存在する場合の処理
)
使用例
@echo off
setlocal
IF EXIST "C:\Users\user\Documents\report.txt" (
echo ファイルが見つかりました。
) ELSE (
echo ファイルが存在しません。
)
endlocal
フォルダの存在確認
フォルダの存在を確認する場合は、パスの末尾に \ を付けるか、NUL を使用します。
IF EXIST "C:\Users\user\Documents\" (
echo フォルダが存在します。
)
変数が定義されているか確認する
IF DEFINED を使用すると、変数が定義されているかどうかを確認できます。
IF DEFINED 変数名 (
rem 変数が定義されている場合の処理
)
使用例
@echo off
setlocal
set MY_VAR=Hello
IF DEFINED MY_VAR (
echo MY_VAR は定義されています:%MY_VAR%
) ELSE (
echo MY_VAR は定義されていません。
)
endlocal
ERRORLEVEL を判定する
直前のコマンドの終了コードを確認するには、IF ERRORLEVEL または %ERRORLEVEL% を使用します。
IF ERRORLEVEL 1 (
rem 終了コードが1以上の場合の処理
)
IF ERRORLEVEL N は「ERRORLEVEL が N 以上」の場合に真となります。「ERRORLEVEL が N
と等しい」場合のみ判定したい場合は IF %ERRORLEVEL% EQU N を使用してください。
使用例
@echo off
setlocal
copy "source.txt" "dest.txt" >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
echo コピーが成功しました。
) ELSE (
echo コピーに失敗しました。エラーコード: %ERRORLEVEL%
)
endlocal
NOT で条件を否定する
NOT を使用すると、条件を反転させることができます。
IF NOT EXIST "backup\" (
mkdir backup
echo backup フォルダを作成しました。
)
IF NOT "%USERNAME%"=="admin" (
echo 管理者ではありません。
)
IF NOT DEFINED CONFIG_PATH (
set CONFIG_PATH=C:\default\config.ini
)
複数の条件を組み合わせる
バッチファイルには AND や OR 演算子はありませんが、IF 文をネストすることで同等の処理を実現できます。
AND 条件(両方の条件を満たす場合)
IF EXIST "data.txt" (
IF %ERRORLEVEL% EQU 0 (
echo 条件をすべて満たしています。
)
)
OR 条件(いずれかの条件を満たす場合)
set MATCH=0
IF "%INPUT%"=="A" set MATCH=1
IF "%INPUT%"=="B" set MATCH=1
IF %MATCH% EQU 1 (
echo A または B が入力されました。
)
まとめ
この記事では、IF コマンドの使い方について解説しました。
| 条件の種類 | 構文 |
|---|---|
| 文字列比較 | IF "%A%"=="%B%" |
| 大文字小文字無視 | IF /I "%A%"=="%B%" |
| 数値比較 | IF %A% EQU %B% |
| ファイル存在 | IF EXIST "パス" |
| 変数が定義済みか | IF DEFINED 変数名 |
| エラーレベル | IF %ERRORLEVEL% EQU 0 |
| 否定 | IF NOT 条件 |
IF コマンドを使いこなすことで、バッチファイルの処理をより柔軟に制御できるようになります。