【bat】バッチファイルで数値を比較する方法完全ガイド|if EQU/GTR/LSS・文字列との違い・落とし穴・実践例まで

「ファイルサイズが0バイトなら警告を出したい」「引数の値が範囲外ならエラーにしたい」――バッチファイルでこうした数値の大小判定をするには、if 文の専用演算子を使います。

本記事では EQU・GTR・LSS など6種類の比較演算子の使い方から、文字列比較との違い・落とし穴・実践例まで体系的に解説します。

スポンサーリンク

目次

  1. 数値比較の基本構文
  2. 比較演算子一覧
  3. 文字列比較との違い
  4. SET /A 計算結果との比較
  5. 実践例A:ファイルサイズ0バイトチェック
  6. 実践例B:ディスク空き容量チェック
  7. 実践例C:コマンドライン引数のバリデーション
  8. 落とし穴5選
  9. FAQ
  10. まとめ

数値比較の基本構文

バッチファイルで数値を比較するには 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

%%~zFfor 変数のファイルサイズ修飾子です。ファイルの存在チェックについては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

2つの変数が等しいかを == で比較しても大丈夫ですか?
== は文字列比較のため、値が完全一致するかを確認するだけなら使えます。ただし 5 == 05 は偽になります(文字列として異なる)。数値として同値か確認する場合は EQU を使ってください(5 EQU 05 は真)。
複数条件(AかつB)の比較はできますか?
バッチファイルには AND/OR 演算子がありません。if をネストするか、フラグ変数で代替します。例:
if %A% GTR 0 if %B% GTR 0 echo AもBも正(AND相当)
OR の場合はネスト構造でフラグを立てて最終的に1つの if で判定します。
変数の値が数値かどうか確認したい
set /a CHECK=%VAR% 2>nul を実行し、CHECKVAR が同値なら数値です。ただし 007 など先頭0付き数値は SET /A が8進数として処理する場合があるため注意が必要です。
2147483647(INT最大値)を超える数値は比較できますか?
バッチファイルの SET /A は32ビット符号付き整数(-2,147,483,648〜2,147,483,647)のみ対応しています。それを超える値(ファイルサイズなど)は文字列比較では桁数を揃えた上で辞書順比較するか、PowerShellを使ってください。
比較演算子の前後にスペースは必要ですか?
必須です。if %N%GTR 10 のようにスペースがないと構文エラーになります。if %N% GTR 10 のように演算子の前後に必ずスペースを入れてください。
PowerShell の比較演算子との対応関係は?
PowerShellは -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 と組み合わせる