3 バッチファイルの変数

バッチファイル内では変数が使用できます。 局所変数も使えますが、 本稿では主に大域変数である 環境変数 を使用します。 ただし、環境変数はすでに設定されているものもありますので、 一時的な変数としてはそれらと同じ名前は使用しないでください。 環境変数の一覧は set コマンドを用いて

> set
とすると表示されます。 環境変数の設定、削除はそれぞれ

set [変数名]=[値]
set [変数名]=
のようにします8。 なお、スペースをそれとわかるように で表しましたが、 上にあるように = の前後にはスペースを入れてはいけません。 値は基本的には文字列で、値文字列にスペースが含まれていても 文字列全体を引用符で囲む必要はありません9

環境変数の値を利用するときは、変数名を % で囲んで %[変数名]% とします。例えば、


> set a=竹の
> set b=%a% 茂治
> echo %b%
とすると「竹の 茂治」と表示されます。ここで echo は、 その後ろに指定した文字列を画面に表示するコマンドです10

現在のコマンドインタプリタ (の拡張機能) では、 変数の整数値、およびその計算も set コマンドでできるようになっていて、


set /a [変数名]=[式]
で式の整数演算の結果を変数に代入できます。式には、 が使えますし、代入を意味する = も、C 言語と同様の演算付きの代入記号
*=, /=, +=, -=, %=, <<=, >>=, &=, ^=, |=
で置きかえることが可能です。

なお、剰余演算を意味する % は、 コマンドプロンプトの対話的な実行時は % でいいのですが、 バッチファイル中では % は特別な意味を持つため、 2 つ重ねて %% とする必要があります。 また、上記の演算子のうちいくつかは他の意味にも使われるので、 式を二重引用符で囲む必要がある場合 (例えばビット演算子) もあります。

整数値は、デフォルトでは 10 進数ですが、頭に 0x をつければ 16 進数、 0 をつければ 8 進数として扱われます。

また、「set /a」の右辺では変数の値は % で囲まずに単に変数名だけで参照できることになっています。 よって、例えばバッチファイルで


set x=10
set y=4
set /a y+=3*x%%7
echo %y%
とすると、結果として 4 に 3×10 を 7 で割った余りを加えた 6 が表示されることになります。 3 行目の /a を書かないと、 = の後の式「3*x%7」が文字列として 「y+」という変数に代入されてしまうことになります。

さらに、カンマ演算子 (,) があり、1 行の式の中で以下のような 逐次評価が行えます。


set x=1
set /a x+=(a=2, b=2*a, c=2*b, 2*c)
echo %a% %b% %c% %x%
これは「2 4 8 17」と表示されます。

また、コマンドライン上でバッチファイルに与えたオプションパラメータは、 バッチファイル内では順に %1,%2,...,%9 として参照できます。 %0 はバッチファイル自身の名前を指し11、 さらに %*%1 以降のオプション文字列全体を表します。

例えば、test.bat というバッチファイルを


> test.bat 123 竹の 茂治
として実行すると、test.bat 内では
%0=test.bat, %1=123, %2=竹の, %3=茂治, %*=123 竹の 茂治
となります。 %4 以降はこの場合空文字列となります。

なお、バッチファイルのオプションの区切りは、 スペースの他にカンマ (,) も利用できるので、


> test.bat 123,竹の 茂治
としても %* 以外は上と同じ結果になりますが、%*
%*=123,竹の 茂治
となります。

さらに、動的に変化する以下の変数があります。 なお、これらは環境変数の一覧表示の set コマンドでは表示されません12

竹野茂治@新潟工科大学
2014年5月2日