[DOS]expansion
DOSの変数展開の話。
DOSの変数展開は、他の多くのシェルと同様にいくつかに分かれる。
通常の変数、引数変数、forで宣言した変数、setlocal enabledelayedexpansionで展開され、最終的に他のコマンドやバッチファイル およびcallによる関数等として使用される。
展開される順序は以下の順序になる。
%var%形式の変数, 引数(%n)
引数変数nは0だとシェルのパス、1~9なら当該バッチ(または関数)の引数に展開される。コード読み込み時に展開されるため、for文などの中に入れるとループ処理が始まる前に解釈され、ループ処理中は固定値になってしまう。また、入れ子にできないため、%var[%index%]%のような表記もできない。
for文の変数
for文で宣言する変数。ループ毎に展開される。
遅延展開変数。
!var!形式の変数。コマンド呼び出しとして解釈される直前に展開される。setlocal enabledelayedexpansionを宣言すると、対応するendlocalまでの間で使用可能になる。通常の変数などを入れ子にできる
以下のコードを実行すると、
setlocal enabledelayedexpansion
set var[1]=aaa
for /l %I in (1, 1, 1) do (
set index=1
echo var[%index%]
echo var[%I]
echo !var[%index%]!
echo !var[%I]!
)
endlocal
各echoの出力は、一つ目が`var[]'、二つ目が`var[1]'、三つ目は`ECHOは <ON>です。'、4つ目が`aaa'。意図するところは4つめだろう。

0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム