HOWTO · Batch
バッチスクリプトの IF ELSE 条件
このチュートリアルでは、バッチスクリプトでの IF ELSE 条件の構造について説明します。
このページの内容
Windows CMD のバッチファイルでは、IF ... ELSE を使って、条件が真の場合と偽の場合に別々のコマンドグループを実行できます。各グループは丸括弧で囲み、真の場合のグループを閉じる括弧と同じ論理行に ELSE を置きます。以下はバッチファイルの例です。出力は、記載された入力値と環境に応じたものです。
IF … ELSE の構文と基本例
基本形は IF condition ( commands-for-true ) ELSE ( commands-for-false ) です。条件には比較やファイル属性を指定できます。偽の場合に何もする必要がなければ、バッチファイルでは ELSE を省略できます。
この例は .bat ファイルから実行します。2つの値を設定して比較し、どちらの分岐が選ばれるかを表示します。10 は 20 より小さいため、真の分岐が実行されます。出力は次のとおりです。コード例内の表示文は、元のコードを変更せず保持するため英語のままです。
@echo off
set /a left=10
set /a right=20
if %left% LSS %right% (
echo %left% is less than %right%.
) else (
echo %left% is not less than %right%.
)
10 is less than 20.
ファイルを確認するには IF EXIST path を使います。確認時点で指定したファイルまたはディレクトリが存在すれば、真の分岐が選ばれます。次の自己完結型バッチファイルは、一時ファイルを作成して確認し、その後削除します。
@echo off
set "sample=%TEMP%\if-else-sample-%RANDOM%.txt"
echo sample>"%sample%"
if exist "%sample%" (
echo File exists.
) else (
echo File does not exist.
)
del "%sample%"
File exists.
別のファイルを確認するには、パスを変更してください。ファイルがない場合だけ処理したいときは、IF NOT EXIST path ( commands ) を使うと、パスが存在しない場合にそのコマンドが実行されます。
Batch の比較演算子
数値条件では、CMD は EQU(等しい)、NEQ(等しくない)、LSS(より小さい)、LEQ(以下)、GTR(より大きい)、GEQ(以上)をサポートしています。これらは数値の比較に使います。文字列を比較する場合は == を使います。空白を含む値や空の値で条件の解釈が崩れないよう、文字列を引用符で囲みます。例: IF "%mode%"=="backup" ( echo Backup mode )。
NOT は条件を否定します。たとえば IF NOT EXIST "report.txt" ( echo Create the report first ) は、レポートファイルが存在しない場合に実行されます。CMD の IF 条件構文では、AND と OR は直接使える論理演算子ではありません。複数の条件を満たす必要がある場合は IF をネストします。コマンドが成功した後に別のコマンドを実行する CMD の && は、条件を組み合わせる方法とは動作が異なる別の機能です。
ネストした IF … ELSE 条件
次の判定が最初の条件に依存する場合は、分岐の中に別の IF ... ELSE を置きます。次の完全な例では、まず高い成績の基準を確認し、その後に次の基準を確認します。
@echo off
set /a score=85
if %score% GEQ 90 (
echo Grade: A
) else (
if %score% GEQ 80 (
echo Grade: B
) else (
echo Grade: C
)
)
85 では最初の条件が偽になるため、CMD はネストされた条件を評価します。85 は 80 以上なので、その分岐で B の成績が表示されます。判定する順序が重要です。低い基準を先に確認すると、それより高い点数もその条件に該当してしまいます。コード例内の表示文は変更せず、英語のままです。
IF … ELSE の実用例
パスを読み取る、コピーする、または削除する前に、ファイルの存在を確認すると便利です。たとえば IF EXIST "%~1" ( ... ) ELSE ( ... ) は、バッチファイルに渡された最初の引数を確認します。%~1 は引数を囲む引用符を取り除きます。条件内でもう一度引用符で囲めば、空白を含むパスを扱えます。
スクリプトで管理者権限が必要な操作を試し、その結果を確認することもできます。ただし、単一の権限確認が常に信頼できるとは限りません。コマンドは権限だけでなく、サービスの設定やポリシーが原因で失敗することもあります。Windows CMD のバッチファイルでは、net session >nul 2>&1 の直後に IF ERRORLEVEL 1 ( echo The command did not succeed; check permissions and system configuration. ) ELSE ( echo The command succeeded. ) を置く方法があります。このコマンドは Windows のサービスやアカウントポリシーに依存するため、ここでは実行時の出力や権限を保証するものとして説明していません。コード例内の表示文は英語のままです。
IF ERRORLEVEL n は、直前のコマンドが n 以上の終了コードを返したかどうかを確認します。確認対象のコマンドの直後に置いてください。失敗した理由が必ず管理者権限の不足だとは限りません。
よくある間違いと Windows CMD の適用範囲
これらの例は Windows CMD のバッチ構文を使っており、PowerShell や Bash の構文ではありません。ELSE は真のコマンドグループを閉じる括弧に続けて記述します。コマンド区切りを挿入したり、別のコマンド行から ELSE を始めたりすると、CMD が分岐を正しく対応付けられないことがあります。
CMD は丸括弧で囲まれたブロックを読み込む時点で %variable% を展開します。そのブロック内で変数の値を変更しても、同じブロック内の後続の %variable% 参照には、変更前の値が使われる場合があります。ブロック内で更新後の値を使う必要がある場合は、setlocal EnableDelayedExpansion で遅延展開を有効にし、!variable! と記述します。遅延展開が有効なときは、パスやテキスト中の ! 自体が影響することにも注意してください。
2つの IF 比較を結合するものとして AND や OR を使わないでください。依存する条件を表すには条件をネストし、それぞれの ELSE が意図した IF に対応していることを確認します。文字列比較では、IF "%first%"=="%second%" のように両側を引用符で囲むと、空白や値がない場合に CMD の比較の解釈が変わるのを防げます。