変数置換の順序

変数の置換や構文解析の順序だが、いろいろやってみた結果次のようである。
(1) 環境変数の置換、引数の置換が同順序で最初
(2) if/for/( ) 等の構造を持った文の構文解析、およびリダイレクトの判断等が同順序
(3) for制御変数の置換
(4) 環境変数遅延展開の置換
(5) echo 等の単純なビルトインコマンドの解析

例えば、遅延展開が有効な状態で、for制御変数の値に !が含まれたりするとそれによる置換のほうが後で起こるため、予想外の結果になったりする。具体的には、

for /f %%A in (file1.txt) do echo %%A

は、file1.txt の内容を(空行を省いて)表示するが、setlocal enabledelayedexpansion で遅延展開が有効になっていて、file1.txt! が含まれていると正しくない表示となる。