#navi(コマンド別)
#contents
////////////////////////////////////////////////////////////////////////////
*% の再評価 [#n566455d]
call の右方は構文解析時に一度、実行時に再度 % の処理がなされる。
具体的には % による環境変数展開、引数展開と %% の % への置換が二度行われる。
従って、例えばパラメータに1個の % を渡したい時には %%%% と書く。

^ によるクォート処理は構文解析時にだけ行われ、実行時には行われない。
つまり一度しか行われない。
////////////////////////////////////////////////////////////////////////////
*バッチファイル、サブルーチン呼び出し以外の命令実行 [#b30c3527]
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%

とすることが出来る。

////////////////////////////////////////////////////////////////////////////
#navi(コマンド別)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS