奥が深い構文解析

少し前に、http://otnx.jp/CMD/%C1%B4%C8%CC%2F%B9%BD%CA%B8%B2%F2%C0%CF構文解析のことをまとめて終わった気になっていたが、まだまだのようだ。

for /f "delims=" %%A in ("echo ABC&date/t") do %%A         →ABC&date/t と表示
for /f "delims=" %%A in ("echo ABC&date/t") do %%A|more    →ABC と日付を表示
(for /f "delims=" %%A in ("echo ABC&date/t") do %%A)|more  →ABC&date/t と表示

forの制御変数や環境変数遅延展開は、構文解析の文の分割などの終わった後で行われると思っていたのだが、パイプの時は展開後に再度解析されるようである。

遅延展開のときはさらにややこしい。

setlocal enabledelayedexpansion
set XX=echo ABC^&date/t
!XX!                   → ABC&date/t と表示
!XX!|more              → 指定されたパスが見つかりません。
setlocal enabledelayedexpansion
set XX=echo ABC^&date/t
!XX!                   → ABC&date/t と表示
echo !XX!|moreecho ABC と日付を表示

setlocal で遅延展開を有効にしても、パイプのときは、コマンドの位置の変数は展開されず、オペランドの位置の変数は展開されて、さらにその後、文の区切りの構文解析もなされる。