「ファイルサイズが0バイトなら警告を出したい」「引数の値が範囲外ならエラーにしたい」――バッチファイルでこうした数値の大小判定をするには、if 文の専用演算子を使います。
本記事では EQU・GTR・LSS など6種類の比較演算子の使い方から、文字列比較との違い・落とし穴・実践例まで体系的に解説します。
目次
- 数値比較の基本構文
- 比較演算子一覧
- 文字列比較との違い
- SET /A 計算結果との比較
- 実践例A:ファイルサイズ0バイトチェック
- 実践例B:ディスク空き容量チェック
- 実践例C:コマンドライン引数のバリデーション
- 落とし穴5選
- FAQ
- まとめ
数値比較の基本構文
バッチファイルで数値を比較するには if 文に専用の比較演算子を使います。
if 値1 演算子 値2 (
条件が真のときのコマンド
) else (
条件が偽のときのコマンド
)
シンプルな例です。
@echo off
set NUM=15
if %NUM% GTR 10 (
echo %NUM% は10より大きい
) else (
echo %NUM% は10以下
)
実行結果:15 は10より大きい
変数・数値リテラルのどちらでも比較できます。%NUM% のように % で変数を展開して渡します。
比較演算子一覧
| 演算子 | 意味 | 数学記号 | 例(真になる条件) |
|---|---|---|---|
EQU |
等しい | = | 5 EQU 5 |
NEQ |
等しくない | ≠ | 5 NEQ 3 |
GTR |
より大きい | > | 10 GTR 5 |
GEQ |
以上 | ≥ | 10 GEQ 10 |
LSS |
より小さい | < | 3 LSS 10 |
LEQ |
以下 | ≤ | 3 LEQ 3 |
演算子は大文字・小文字どちらでも動作します(GTR / gtr 同等)。慣習として大文字が使われることが多いです。
全演算子を使った比較デモ
@echo off set A=10 set B=20 if %A% EQU %B% echo A = B if %A% NEQ %B% echo A ≠ B (A=%A%, B=%B%) if %A% GTR %B% echo A > B if %A% GEQ %B% echo A >= B if %A% LSS %B% echo A < B (A=%A%, B=%B%) if %A% LEQ %B% echo A <= B (A=%A%, B=%B%)
実行結果:
A ≠ B (A=10, B=20) A < B (A=10, B=20) A <= B (A=10, B=20)
文字列比較との違い
バッチファイルには数値比較と文字列比較の2種類があります。数値として大小比較するには必ず EQU/GTR 系を使ってください。 == は文字列比較です。
| 比較方法 | 演算子 | 比較方式 | 注意点 |
|---|---|---|---|
| 数値比較 | EQU GTR LSS GEQ LEQ NEQ |
数値の大小 | 整数のみ。小数不可 |
| 文字列比較 | == |
文字列の一致 | 辞書順比較。9 > 10 になる |
== と GTR の違いを確認する例
@echo off set X=9 set Y=10 :: 文字列比較(== ): "9" と "10" を文字列として比較 → "9" > "10" ! if %X% == %Y% (echo X == Y) else (echo X != Y) → X != Y :: 文字列の大小は辞書順:先頭文字 "9" > "1" なので... if "%X%" GTR "%Y%" (echo 文字列では X > Y) else (echo 文字列では X <= Y) :: 数値比較(GTR): 9 と 10 を数値として比較 → 9 < 10 if %X% GTR %Y% (echo 数値では X > Y) else (echo 数値では X <= Y)
実行結果:
X != Y 文字列では X > Y ← 誤判定! 数値では X <= Y ← 正しい判定
特に2桁以上の数値を扱う場合は GTR/LSS 系を使わないと誤判定が起きます。
SET /A 計算結果との比較
SET /A で計算した結果を変数に格納してから if で比較できます。SET /Aでの数値計算方法と組み合わせることで、より複雑な条件判定が可能です。
@echo off
setlocal
:: ファイル処理済み件数に応じてメッセージを変える
set TOTAL=150
set PROCESSED=120
set /a REMAIN=%TOTAL% - %PROCESSED%
set /a PERCENT=%PROCESSED% * 100 / %TOTAL%
echo 進捗: %PROCESSED%/%TOTAL% (%PERCENT%%)
if %REMAIN% EQU 0 (
echo 全件処理完了!
) else if %REMAIN% LEQ 10 (
echo もうすぐ完了(残り %REMAIN% 件)
) else (
echo 処理中... 残り %REMAIN% 件
)
endlocal
SET /A の結果は必ず整数になるため、そのまま数値演算子で比較できます。変数を遅延展開で参照する場合は setlocal enabledelayedexpansion と !変数名! を使います(遅延展開ガイドを参照)。
実践例A:ファイルサイズ0バイトチェック
ログ出力スクリプトが正常に動いたか確認するために、出力ファイルが空(0バイト)でないかをチェックする例です。
@echo off
setlocal
set LOGFILE=C:\Logs\output.log
:: ファイルが存在するか確認
if not exist "%LOGFILE%" (
echo [ERROR] ファイルが見つかりません: %LOGFILE%
exit /b 1
)
:: ファイルサイズを取得(FOR %%~z は bytes)
for %%F in ("%LOGFILE%") do set SIZE=%%~zF
echo ファイルサイズ: %SIZE% bytes
if %SIZE% EQU 0 (
echo [WARN] ファイルが空です。処理が実行されなかった可能性があります。
exit /b 2
) else if %SIZE% GTR 10485760 (
echo [WARN] ファイルサイズが10MBを超えています(%SIZE% bytes)
) else (
echo [OK] ファイルサイズは正常です。
)
endlocal
%%~zF は for 変数のファイルサイズ修飾子です。ファイルの存在チェックについてはIF EXISTでファイル・フォルダの存在確認する方法も参照してください。
実践例B:ディスク空き容量チェック
バックアップ処理の前に空き容量が十分あるか確認し、不足している場合は処理を中止する例です。
@echo off
setlocal
set DRIVE=C
set MIN_FREE_MB=1024
:: wmic で空き容量をバイト取得 → MB変換
for /f "skip=1 tokens=*" %%A in ('wmic logicaldisk where "DeviceID='%DRIVE%:'" get FreeSpace') do (
if not "%%A"=="" set FREE_BYTES=%%A
)
:: スペースを除去
set FREE_BYTES=%FREE_BYTES: =%
:: MB単位に変換(整数演算)
set /a FREE_MB=%FREE_BYTES:~0,-6%
echo %DRIVE%: ドライブ空き容量: %FREE_MB% MB
if %FREE_MB% LSS %MIN_FREE_MB% (
echo [ERROR] 空き容量が不足しています(必要: %MIN_FREE_MB% MB, 現在: %FREE_MB% MB)
exit /b 1
) else (
echo [OK] 空き容量は十分です。バックアップを開始します。
)
endlocal
wmic logicaldisk で取得したバイト値を SET /A でMB換算しています。大きな数値(数十億バイト)でも整数演算で扱えます。
実践例C:コマンドライン引数のバリデーション
スクリプトに渡す数値引数が正しい範囲かチェックする例です。例えば「保持日数(1〜365)」を引数で受け取る場合です。
@echo off
setlocal
:: 引数チェック
if "%1"=="" (
echo 使い方: %~nx0 保持日数 [1-365]
exit /b 1
)
set DAYS=%1
:: 数値かどうか確認(数値以外の文字が含まれる場合は弾く)
set /a CHECK=%DAYS% 2>nul
if %CHECK% NEQ %DAYS% (
echo [ERROR] 引数が数値ではありません: %DAYS%
exit /b 1
)
:: 範囲チェック
if %DAYS% LSS 1 (
echo [ERROR] 保持日数は1以上を指定してください。
exit /b 1
)
if %DAYS% GTR 365 (
echo [ERROR] 保持日数は365以下を指定してください。
exit /b 1
)
echo [OK] 保持日数: %DAYS% 日
echo 処理を開始します...
endlocal
SET /A に非数値を渡すと0になる性質を利用して数値チェックをしています。%1 などの引数についての詳細は環境変数を設定・参照する方法を参照してください。
落とし穴5選
落とし穴1:変数が未定義のままだと比較が文字列になる
変数が未定義(空文字)のまま if %VAR% GTR 0 を実行すると、実際には if GTR 0 となり構文エラーになります。比較前に必ず変数に初期値を設定するか、未定義チェックを行ってください。
:: NG: VAR が未定義だとエラー if %VAR% GTR 0 echo 正 :: OK: 初期値を設定してから比較 if not defined VAR set VAR=0 if %VAR% GTR 0 echo 正
落とし穴2:負の数は比較できない場合がある
変数に負の値が入っている場合、if -%N% GTR 0 のような書き方はマイナス記号がオプションと誤認されます。負の数を比較する際は括弧でくくるか、SET /A で絶対値処理を検討してください。
@echo off set N=-5 :: NG: -5 がオプションとして解釈される場合がある if %N% GTR 0 echo 正 :: OK: 括弧でくくる if (%N%) GTR (0) echo 正
落とし穴3:小数点は扱えない
バッチファイルの数値演算・比較は整数のみです。SET /A も整数演算で、小数点以下は切り捨てられます。小数比較が必要な場合はPowerShellや外部ツールを使ってください。
落とし穴4:if ERRORLEVEL は数値比較とは挙動が異なる
if ERRORLEVEL N は「ERRORLEVELが N 以上のとき真」という意味です。if %ERRORLEVEL% EQU N(特定値のみ一致)と挙動が異なります。詳細はif ERRORLEVELが正しく判定されない理由を参照してください。
:: if ERRORLEVEL は「N以上」の意味 :: ERRORLEVEL=2 のとき、下記は両方真になる if ERRORLEVEL 1 echo ERRORLEVEL >= 1 ← 真 if ERRORLEVEL 2 echo ERRORLEVEL >= 2 ← 真 :: 特定値のみ判定したい場合は EQU を使う if %ERRORLEVEL% EQU 2 echo ERRORLEVEL == 2 のみ
落とし穴5:for ループ内で比較するときは遅延展開が必要
for ループや if ブロック内で変数を更新・参照する場合は setlocal enabledelayedexpansion と !変数名! が必要です。%VAR% のままだとブロック先頭の値が使われて誤判定になります。
@echo off
setlocal enabledelayedexpansion
set MAX=0
for %%N in (5 12 3 8 20 1) do (
if %%N GTR !MAX! set MAX=%%N
)
echo 最大値: !MAX!
:: → 最大値: 20
FAQ
== で比較しても大丈夫ですか?== は文字列比較のため、値が完全一致するかを確認するだけなら使えます。ただし 5 == 05 は偽になります(文字列として異なる)。数値として同値か確認する場合は EQU を使ってください(5 EQU 05 は真)。if をネストするか、フラグ変数で代替します。例:if %A% GTR 0 if %B% GTR 0 echo AもBも正(AND相当)OR の場合はネスト構造でフラグを立てて最終的に1つの if で判定します。
set /a CHECK=%VAR% 2>nul を実行し、CHECK と VAR が同値なら数値です。ただし 007 など先頭0付き数値は SET /A が8進数として処理する場合があるため注意が必要です。SET /A は32ビット符号付き整数(-2,147,483,648〜2,147,483,647)のみ対応しています。それを超える値(ファイルサイズなど)は文字列比較では桁数を揃えた上で辞書順比較するか、PowerShellを使ってください。if %N%GTR 10 のようにスペースがないと構文エラーになります。if %N% GTR 10 のように演算子の前後に必ずスペースを入れてください。-eq, -ne, -gt, -ge, -lt, -le を使います。バッチの EQU→-eq, NEQ→-ne, GTR→-gt, GEQ→-ge, LSS→-lt, LEQ→-le に対応します。PowerShellは小数・大きな整数も扱えます。まとめ
| やりたいこと | 使う演算子 | 例 |
|---|---|---|
| 2つの値が等しい | EQU |
if %A% EQU %B% |
| 2つの値が違う | NEQ |
if %A% NEQ %B% |
| A が B より大きい | GTR |
if %A% GTR %B% |
| A が B 以上 | GEQ |
if %A% GEQ %B% |
| A が B より小さい | LSS |
if %A% LSS %B% |
| A が B 以下 | LEQ |
if %A% LEQ %B% |
数値比較の要点まとめ:
- 数値の大小には必ず
EQU/GTR/LSS系を使う(==は文字列比較) - 変数未定義・負の数・小数には注意が必要
- ループ内での比較は
setlocal enabledelayedexpansionと!が必要 - 計算結果との比較は SET /A と組み合わせる