概要

このページは、Windowsのバッチファイルの変数について記述します。 使える変数は3種類がある。
種類 記述方法 概要
バッチファイルの引数 各引数は%0~%9
全引数は%*
読み取り専用
9個以上の引数を扱う場合はshift文でずらして使用する
環境変数 %変数名% あらかじめシステムで登録されているもの他、自分で定義可能
for文の変数 コマンドプロンプトでは%変数名
バッチファイルでは%%変数名
変数名は英字1文字のみでなければならない

環境変数内の文字列の部分取得

rem       01234567890123456
rem       65432109876543210
set test=01234567890ABCDEF
上記の様に環境変数testを設定した場合の部分取得例を以下に示します。
書式 記述例
取得結果
%変数名:~先頭からの開始位置% %test:~3%
34567890ABCDEF
%変数名:~先頭からの開始位置,文字数% %test:~3,2%
34
%変数名:~先頭からの開始位置,-末尾からの文字位置% %test:~3,-4%
34567890AB
%変数名:~-末尾からの開始位置% %test:~-5,2%
BC
%変数名:~-末尾からの開始位置,-末尾からの文字位置% %test:~-5,-1%
BCDE

環境変数内の文字の置き換え

環境変数の文字を置き換えるには以下の様に記述します。
%環境変数:A=B%
例えば以下のバッチファイルを実行すると環境変数tempのCがcに置換される
d:¥bat¥mod¥rep.bat
set test=ABCDEFG
echo %test:C=c%
pause
実行結果
D:¥bat¥mod>set test=ABCDEFG

D:¥bat¥mod>echo ABcDEFG
ABcDEFG

D:¥bat¥mod>pause
続行するには何かキーを押してください . . .

環境変数の修飾子

引数およびfor文の変数に対して修飾子をつけることができます。

フルパスに展開

環境変数をフルパス名に変換するには(変数番号がnの時)以下の様に記述します。
%~fn
例えば以下のバッチファイルを実行するとfullpass.batのフルパス名が表示される
d:¥bat¥mod¥fullpass.bat
echo %~f0
pause
実行結果
D:¥bat¥mod>echo D:¥bat¥mod¥fullpass.bat
D:¥bat¥mod¥fullpass.bat

D:¥bat¥mod>pause
続行するには何かキーを押してください . . .

パスだけに展開

環境変数をパスだけに変換するには(変数番号がnの時)以下の様に記述します。
%~pn
例えば以下のバッチファイルを実行するとpass.batのパスだけが表示される
d:¥bat¥mod¥pass.bat
echo %~p0
pause
実行結果

D:¥bat¥mod>echo ¥bat¥mod¥
¥bat¥mod¥

D:¥bat¥mod>pause
続行するには何かキーを押してください . . .

ドライブ文字に展開

環境変数をドライブ文字に変換するには(変数番号がnの時)以下の様に記述します。
%~dn
例えば以下のバッチファイルを実行するとdrive.batのドライブ文字が表示される
d:¥bat¥mod¥drive.bat
echo %~d0
pause
実行結果
D:¥bat¥mod>echo D:
D:

D:¥bat¥mod>pause
続行するには何かキーを押してください . . .

ファイル名に展開

環境変数をファイル名に変換するには(変数番号がiの時)以下の様に記述します。
%~ni
例えば以下のバッチファイルを実行するとfile.batのファイル名が表示される
d:¥bat¥mod¥file.bat
echo %~n0
pause
実行結果

D:¥bat¥mod>echo file
file

D:¥bat¥mod>pause
続行するには何かキーを押してください . . .

拡張子に展開

環境変数を拡張子に変換するには(変数番号がnの時)以下の様に記述します。
%~pn
例えば以下のバッチファイルを実行するとext.batの拡張子が表示される
d:¥bat¥mod¥ext.bat
echo %~x0
pause
実行結果

D:¥bat¥mod>echo .bat
.bat

D:¥bat¥mod>pause
続行するには何かキーを押してください . . .

その他

変数%nには"D:¥bat¥mod¥all.bat"が格納されている場合の変換例を以下に示します。
※nは変数の番号を示す
修飾子 変換名 変換例
%~n ダブルクォーテーションを削除 D:¥bat¥mod¥all.bat
%~fn 完全修飾パス名(フルパス) D:¥bat¥mod¥all.bat
%~dn ドライブ文字 D:
%~pn パス(ファイル名を除く) ¥bat¥mod¥
%~nn ファイル名 all
%~xn 拡張子 .bat
%~sn 8.3形式でフルパス D:¥bat¥mod¥all.bat
%~an ファイル属性 --a------
%~tn ファイル更新時の日付/時刻。 2015/12/29 21:32
%~zn ファイルサイズ 116
修飾子は複数を同時に指定できる。
例えば%dpnと指定するとドライブ名とパス名であるD:¥bat¥mod¥に変換される。

変数の遅延展開

変数の参照方法には%変数名%と!変数名!がある。

通常の展開

バッチファイルの読み込み時のみ変数が展開されます。
例えば以下様なバッチファイルを実行すると、for文の中は6回のループとなるので、変数numは1~6まで変化しそうに見せますが、実行結果の通りechoの表示結果は0のままです。
変数numの展開が読み込み時のみ展開されていますので最初に代入した0から変わりません。
@echo off
set num=0
for %%A in (a b c d e f) do (
        set /A num=%num%+1
        echo %num% %%A
)
pause
出力結果
0 a
0 b
0 c
0 d
0 e
0 f
続行するには何かキーを押してください . . .

遅延展開

変数を参照するたびに展開されます。
例えば以下様なバッチファイルを実行すると、for文の中は6回のループとなるので、変数numは1~6まで変化します。
通常の展開と違い参照のたびに展開されますのでループのたびに1ずつ加算されます。
遅延展開を使用するために、setlocal enabledelayedexpansionを宣言しています。
また参照時には!を使用しています。
@echo off

setlocal enabledelayedexpansion

set num=0
for %%A in (a b c d e f) do (
        set /A num=!num!+1
        echo !num! %%A
)
pause
1 a
2 b
3 c
4 d
5 e
6 f
続行するには何かキーを押してください . . .