% の再評価 †call の右方は構文解析時に一度、実行時に再度 % の処理がなされる。 具体的には % による環境変数展開、引数展開と %% の % への置換が二度行われる。 従って、例えばパラメータに1個の % を渡したい時には %%%% と書く。 ^ によるクォート処理は構文解析時にだけ行われ、実行時には行われない。 つまり一度しか行われない。 バッチファイル、サブルーチン呼び出し以外の命令実行 †call /? に書かれている機能は、バッチファイルの呼び出し、ラベルを使っての 内部サブルーチン呼び出しの2つであるが、それ以外の命令も実行できる。 if、for、( ) の構造を持った文以外の、内部コマンド、外部プログラム呼び出し等も 前に call をつけて実行することが出来る。この時、前項に書いた通り % の処理が 二度行われるのでこれを利用できる。 例えば、環境変数を配列のように使用できる。 set DATA[1]=11111 set DATA[2]=22222 set DATA[3]=33333 set N=2 set DATA[%N%]=@@@@@ call echo %%DATA[%N%]%% 最終行は、構文解析時に call echo %DATA[2]% になり、実行時に %DATA[2]% が展開される。 また、set /? にあるうまく行かない例: set LIST= for %%i in (*) do set LIST=%LIST% %%i echo %LIST% を解決するのに set /? の解説にある遅延展開を使わず、 set LIST= for %%i in (*) do call set LIST=%%LIST%% %%i echo %LIST% とすることが出来る。 |