計算(四則演算)
バッチファイルで、回数をカウントしたり、合計を求めたり、サイコロのような乱数を作ったりしたい場面があります。
コマンドプロンプトで計算を行うには、set コマンドに /a オプションを付けます。この記事では、基本的な書き方から、つまずきやすい注意点までを解説します。
基本的な使い方
set /a 変数名=計算式
set /a RESULT=10 + 5
echo %RESULT%
計算結果が変数 RESULT に代入されます。コマンドプロンプトに直接入力した場合は、結果がそのまま画面に表示されます。バッチファイル内では表示されないため、必要なら echo で出力します。
set /a の計算式の中では、変数名をそのまま書けます。set /a TOTAL=PRICE * 3 のように % や ! で囲まなくても、変数の値が使われます。存在しない変数は 0 として扱われます。
使える演算子
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
+ | 加算 | set /a X=7 + 3 | 10 |
- | 減算 | set /a X=7 - 3 | 4 |
* | 乗算 | set /a X=7 * 3 | 21 |
/ | 除算(整数) | set /a X=7 / 3 | 2 |
% | 余り | set /a X=7 %% 3(バッチファイル内) | 1 |
( ) | 優先順位の指定 | set /a X=(2 + 3) * 4 | 20 |
乗算・除算・余りは、加算・減算より先に計算されます。
余りを求める % は、バッチファイル内では %% と二重に書く必要があります。コマンドプロンプトに直接入力する場合は % を 1 つだけ書きます。
変数を更新する(カウンター・合計)
代入と演算を一度に行う +=、-=、*=、/=、%%= が使えます(%%= はバッチファイル内の書き方で、コマンドプロンプトに直接入力する場合は %= です)。
set COUNT=0
set /a COUNT+=1
set /a COUNT+=1
echo %COUNT%

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
for ループの中で合計を求める例です。set /a はループ内でも変数を直接参照できますが、ループ内で echo により途中経過を表示するには遅延展開(!変数名!)が必要です。
@echo off
setlocal EnableDelayedExpansion
set SUM=0
for %%N in (10 20 30) do (
set /a SUM+=%%N
echo 途中経過: !SUM!
)
echo 合計: !SUM!
endlocal
詳しくは遅延展開の記事を参照してください。
小数は扱えない
set /a が扱えるのは整数だけです。割り算の結果は、小数点以下が切り捨てられます。
set /a X=7 / 2
echo %X%
小数が必要な場合は、あらかじめ 100 倍などして整数で計算する方法があります。
set PRICE=1980
set /a TAX=PRICE * 10 / 100
set /a TOTAL=PRICE + TAX
echo 税額: %TAX% 円 / 税込: %TOTAL% 円
厳密な小数計算が必要な場合は、PowerShell を呼び出す方法もあります。
powershell -NoProfile -Command "[math]::Round(1980 * 1.1)"
乱数を作る
%RANDOM% は 0 から 32767 の乱数を返します。余りを使うと、範囲を絞れます。
set /a DICE=%RANDOM% %% 6 + 1
echo %DICE%
%RANDOM% %% 6 で 0〜5 になるため、+ 1 で 1〜6 にしています。
16 進数・ビット演算
0x を付けると 16 進数を指定できます。
set /a X=0xFF
echo %X%
ビット演算には &(AND)、|(OR)、^(XOR)、<<、>> などがあります。これらはコマンドプロンプトの特殊文字でもあるため、計算式全体を二重引用符で囲む必要があります。
set /a "X=6 & 3"
set /a "Y=1 << 4"
echo %X% %Y%
引用符で囲まずに set /a X=6 & 3 と書くと、& がコマンドの区切りとして解釈され、意図しない動作になります。
注意点
扱える範囲は 32 ビット整数
扱える数値は -2147483648 から 2147483647 までです。計算結果が範囲を超えてもエラーにはならず、桁あふれして誤った値になります。ただし、2147483648 のような範囲外の数値を直接書くと「無効な数字です」というエラーになります。
set /a X=2147483647 + 1
echo %X%
ファイルサイズの計算など、大きな数を扱う場合は注意してください。
0 で始まる数値は 8 進数として扱われる
08 や 09 のように 0 で始まる数値は 8 進数として解釈されます。8 進数には 8 や 9 が存在しないため、エラーになります。
set /a X=08 + 1
%TIME% から取り出した分や秒の「08」「09」などをそのまま計算に使うと、この問題が起きます。先頭に 1 を付けて 100 を引くと、10 進数として扱えます。
set MIN=%TIME:~3,2%
set /a MIN=1%MIN% - 100
echo %MIN%
MIN が 08 の場合、108 - 100 で 8 になります。
0 で割るとエラーになる
set /a X=10 / 0
除数が変数の場合は、if で 0 でないことを確認してから計算してください。
計算結果をゼロ埋めして表示する
連番のファイル名(001、002)には、1000 を足してから右側の桁を取り出す方法が便利です。
set /a NUM=1000 + 7
echo %NUM:~1%
文字列の切り出し方は、文字列操作の記事で詳しく解説しています。
まとめ
| やりたいこと | 書き方 |
|---|---|
| 計算結果を変数に入れる | set /a X=1 + 2 |
| カウントアップ | set /a COUNT+=1 |
| 余りを求める(バッチ内) | set /a X=10 %% 3 |
| 1〜N の乱数 | set /a X=%RANDOM% %% N + 1 |
| ビット演算 | set /a "X=6 & 3"(引用符で囲む) |
| 小数の計算 | 100 倍して整数で計算、または PowerShell |