バッチファイルで変数を使った演算を行う(SET /A)

広告

バッチファイルで SET コマンドを使って変数に値を設定すると基本的に文字列として扱われますが、 /A スイッチを使用することで値を数式として評価し、その結果を変数に設定することができます。ループ回数やファイル数のカウント、日付や時刻の簡易的な計算などに利用されることがあります。ここでは、バッチファイルで変数を使った演算を行う方法について解説します。

変数を使った演算を行う

SET コマンド使って変数に値を設定するときに /A スイッチを付けることで = の右側に記載された値が数式として評価されることを指定できます。書式は次の通りです。

SET /A 変数名=数式

数式には、あらかじめ決められた演算子を使った式を記述できます。この場合、数式を評価した結果が変数に設定されます。

次の例を見てください。

@echo off

set total=10+5+3
echo %total%

set /a total=10+5+3
echo %total%

/A スイッチを付けずに変数に値を設定した場合は、文字列 "10+5+3" として変数に設定されます。それに対して /A スイッチを付けた場合は、 10+5+3 を数式として評価した結果である 18 が変数に設定されます。

実際にバッチファイルを実行すると次のように表示されます。

変数を使った演算を行う(1)

このように /A スイッチを付けることで、簡単な演算であれば行えるようになります。ただし扱える数値は整数のみで少数は扱えません。あまり複雑な演算には向いていないです。

演算を使った実際の例をもう一つ見てみます。カレントディレクトリにある拡張子が *.txt のファイルの個数をカウントし、結果を画面に出力します。

@echo off
setlocal EnableDelayedExpansion

set count=0
for %%f in (*.txt) do (
  set /a count=count+1
)
echo ファイル数: !count!

このとき、set /a count=count+1 の部分を set /a count=%count%+1 のように記述する必要はありません。 set /a では式の中に変数名をそのまま記述すると、その変数の値として参照され、数式として評価されます。

また、set count=0 の時点では変数 count には文字列として "0" が設定されていますが、 set /a によって式が評価される際に、その値は数値として解釈されます。そのため、初期化を set /a count=0 と記述する必要はありません。

実際にバッチファイルを実行すると次のように表示されます。

変数を使った演算を行う(2)

指定した条件に一致するファイルの数をカウントすることができました。

利用可能な演算子の種類

バッチファイルで数式を記述するときに利用可能な演算子の種類です(上のものほど優先順位が高くなっています)。

記号種類
()グループ化
! ~ -単項演算子
* / %算術演算子
+ -算術演算子
<< >>論理シフト
&ビット演算子 AND
^ビット演算子排他的 OR
|ビット演算子 OR
= *= /= %= += -= &= ^= |= <<= >>=代入
,式の区切り記号

次に論理シフトやビット演算子を使う場合はダブルクォーテーションで囲って記述します。

@echo off

set /a num1="4<<2"
set /a num2="4^2"

使用できる数値は整数だけです。少数は利用できません。また数値は 10 進数として扱われますが、 先頭に 0x を付けた場合は 16 進数、先頭に 0 を付けた場合は 8 進数の数値として扱われます。

次のサンプルを見て下さい。

@echo off

set /a num1=0x5+0xA
set /a num2=013+024
echo %num1%
echo %num2%

16 進数で書かれた 0x5+0xA は 10 進数で 5+10 と同じです。また 8 進数で書かれた 013+024 は 10 進数で 11+20 と同じです。

実際にバッチファイルを実行すると次のように表示されます。

利用可能な演算子の種類(1)

変数の値を出力すると 10 進数の値として表示されます。

-- --

バッチファイルで変数を使った演算を行う方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。