バッチファイルで数値計算を行いたいとき、SET /A コマンドを使うと簡単に実装できます。
この記事では SET /A の基本から四則演算・インクリメント・条件分岐との組み合わせ・実務パターンまで、豊富なサンプルとともに解説します。
SET /A の基本構文
SET /A は変数に数値演算の結果を代入するコマンドです。基本構文は以下のとおりです。
たとえば set /a result=10+5 を実行すると、変数 result に 15 が代入されます。
ポイント
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-discount と set /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 に評価されます。意図しない計算結果になるので注意が必要です。
括弧の中での遅延展開に注意
IF や FOR の括弧ブロック内で変数を更新してすぐ参照すると、期待した値が取れないことがあります。遅延展開(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進数扱いになるので注意してください。