【bat】SET /A で数値計算する方法|四則演算・比較・インクリメントを完全解説

バッチファイルで数値計算を行いたいとき、SET /A コマンドを使うと簡単に実装できます。

この記事では SET /A の基本から四則演算・インクリメント・条件分岐との組み合わせ・実務パターンまで、豊富なサンプルとともに解説します。

スポンサーリンク

SET /A の基本構文

SET /A は変数に数値演算の結果を代入するコマンドです。基本構文は以下のとおりです。

BAT
set /a 変数名=

たとえば set /a result=10+5 を実行すると、変数 result15 が代入されます。

ポイント
SET /A では変数参照に %変数名% を使わずそのまま変数名を書いても機能します(例: set /a result=a+b)。ただし既存の変数値を参照する場合は %変数名% 形式も使用できます。

使える演算子一覧表

SET /A で使用できる演算子の一覧です。

演算子 意味 結果
+ 加算 set /a x=10+3 13
- 減算 set /a x=10-3 7
* 乗算 set /a x=10*3 30
/ 除算(整数) set /a x=10/3 3
%% 剰余(余り) set /a x=10%%3 1
& ビットAND set /a x=12&10 8
| ビットOR set /a x=12|3 15
^ ビットXOR set /a x=12^10 6
~ ビット反転(単項) set /a x=~5 -6
<< 左シフト set /a x=1<<4 16
>> 右シフト set /a x=16>>2 4
注意
バッチファイル内で剰余演算子 % を使う場合は %% と2つ重ねて記述します。コマンドプロンプトから直接実行するときは % 1つでOKです。

基本の四則演算サンプル

実際に動くサンプルで四則演算を確認しましょう。

calc_basic.bat
@echo off
set a=20
set b=6

set /a add=a+b
set /a sub=a-b
set /a mul=a*b
set /a div=a/b
set /a mod=a%%b

echo 加算: %add%
echo 減算: %sub%
echo 乗算: %mul%
echo 除算: %div%
echo 剰余: %mod%

実行結果:

実行結果
加算: 26
減算: 14
乗算: 120
除算: 3
剰余: 2

インクリメント・デクリメント

ループカウンタとしてよく使うインクリメント(+1)とデクリメント(-1)です。+=-= の複合代入演算子が使えます。

increment.bat
@echo off
set cnt=0

:: インクリメント(1ずつ増やす)
set /a cnt+=1
echo cnt = %cnt%

:: 5ずつ増やす
set /a cnt+=5
echo cnt = %cnt%

:: デクリメント(1ずつ減らす)
set /a cnt-=1
echo cnt = %cnt%

複合代入演算子の一覧:

演算子 意味
+= 加算して代入 set /a cnt+=1
-= 減算して代入 set /a cnt-=1
*= 乗算して代入 set /a total*=2
/= 除算して代入 set /a total/=2
%%= 剰余を代入 set /a n%%=3

変数同士の演算

SET /A では複数の変数を組み合わせた演算も直感的に記述できます。

var_calc.bat
@echo off
set price=1500
set qty=4
set discount=200

:: 小計 = 単価 × 数量
set /a subtotal=price*qty
:: 合計 = 小計 - 割引
set /a total=subtotal-discount

echo 小計: %subtotal% 円
echo 合計: %total% 円
ポイント
SET /A 内では %変数名% の形式でも変数名だけでも同じように参照できます。set /a total=subtotal-discountset /a total=%subtotal%-%discount% は同じ結果になります。

計算結果を条件分岐に使う(IFとの組み合わせ)

SET /A で計算した結果を IF で評価するパターンは実務でよく使います。

calc_if.bat
@echo off
set score=85
set pass=60

set /a diff=score-pass

if %diff% geq 0 (
    echo 合格です。余裕: %diff% 点
) else (
    echo 不合格です。不足: %diff% 点
)

IF の数値比較に使える演算子:

演算子 意味
EQU 等しい(==)
NEQ 等しくない(!=)
LSS より小さい(<)
LEQ 以下(<=)
GTR より大きい(>)
GEQ 以上(>=)

実務パターン集

ループカウンタ

ファイルを連番で処理するループの実装例です。

loop_counter.bat
@echo off
set i=1
set max=5

:loop
if %i% gtr %max% goto :end
echo 処理中: file_%i%.txt
set /a i+=1
goto :loop

:end
echo 完了

合計値の計算

sum.bat
@echo off
set total=0
:: 複数の値を合計する
for %%n in (10 25 38 12 55) do (
    set /a total+=%%n
)
echo 合計: %total%

余り判定で奇数・偶数の分岐

odd_even.bat
@echo off
set num=7
set /a rem=num%%2

if %rem% equ 0 (
    echo %num% は偶数です
) else (
    echo %num% は奇数です
)

ファイル番号のゼロ埋め

連番ファイル名を作成するとき、番号を3桁にゼロ埋めするテクニックです。

zero_pad.bat
@echo off
set n=7
:: 1000を加えてから先頭1文字を除去→3桁ゼロ埋め
set /a padded=1000+n
set padded=%padded:~1%
echo file_%padded%.txt

よくある失敗例

小数点は使えない

SET /A は整数演算専用です。小数点を含む計算はできません。

BAT(エラー例)
:: これはエラーになる
set /a result=1.5*2  :: NG: 小数点は使えない
対処法
小数点以下の計算が必要な場合は、値を10倍・100倍して整数に変換してから計算し、最後に割って調整する方法を取ります。または WSH (VBScript/JScript) や PowerShell を呼び出すことも検討してください。

文字列との演算はできない

BAT(エラー例)
set name=hello
set /a result=name+1  :: 文字列変数は 0 として扱われる

文字列変数は数値として 0 に評価されます。意図しない計算結果になるので注意が必要です。

括弧の中での遅延展開に注意

IFFOR の括弧ブロック内で変数を更新してすぐ参照すると、期待した値が取れないことがあります。遅延展開(setlocal EnableDelayedExpansion + !変数名!)を使いましょう。

delayed_expansion.bat
@echo off
setlocal EnableDelayedExpansion
set total=0
for %%n in (1 2 3) do (
    set /a total+=%%n
    echo 現在の合計: !total!  :: !変数! を使う
)

FAQ

❓ SET /A で負の数は扱えますか? (クリックで開閉)
はい、扱えます。SET /A は符号付き32ビット整数(約-21億〜+21億)の範囲で計算できます。set /a result=-10+3 のように負の数も自然に記述できます。
❓ SET /A の計算結果を echo で表示しない方法はありますか? (クリックで開閉)
@echo off が有効であれば計算結果の自動表示は抑制されます。もし echo on の状態で実行している場合は、set /a 変数=式 > nul のようにリダイレクトするか、@echo off を先頭に記述してください。
❓ 16進数や8進数の計算もできますか? (クリックで開閉)
はい、できます。0x プレフィックスで16進数(例: set /a x=0xFF)、先頭に 0 をつけると8進数(例: set /a x=010 → 結果は8)として扱われます。意図せず先頭が 0 の数値を渡すと8進数扱いになるので注意してください。