私はMS Batchを学ぼうとしています.特に「setlocal」と「enableddelayedexpression」の側面を理解しようとしていましたが、理解できない語彙に出くわしました:
実行時間と解析時間
私はMS Batchを学ぼうとしています.特に「setlocal」と「enableddelayedexpression」の側面を理解しようとしていましたが、理解できない語彙に出くわしました:
実行時間と解析時間
1 行を解析する場合、パーサーにはさまざまなフェーズがあります。
したがって、行またはブロックが解析されるとき、行 (またはブロック内の任意の行) が実行される前に、パーセント式はすべて展開されます。
そのため、実行時にそれらを変更することはできません。
set var=origin
echo #1 %var%
(
set var=new value
echo #2 %var%
)
echo #3 %var%
出力します
#1 origin
#2 origin
#3 new value
解析時と同様origin
に、ブロックの行が実行される前に #2 が展開されます。したがって、#3 のブロックの直後に新しい値が表示されます。
これに対して、遅延展開は、行が実行される直前に行ごとに展開されます。
setlocal EnableDelayedExpansion
set var=origin
echo #1 %var%, !var!
(
set var=new value
echo #2 %var%, !var!
)
echo #3 %var%, !var!
出力
#1 origin, origin
#2 origin, new value
#3 new value, new value
!var!
#2 では、ブロックが解析されるときに %var% が展開されますが、行set var=new value
が実行された後に展開されるため、同じ変数に対して 2 つの異なる展開が表示されます。
バッチ パーサーの詳細については、SO: How does the Windows Command Interpreter (CMD.EXE) parse scripts?