0

私はMS Batchを学ぼうとしています.特に「setlocal」と「enableddelayedexpression」の側面を理解しようとしていましたが、理解できない語彙に出くわしました:

実行時間解析時間

4

1 に答える 1

5

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?

于 2013-06-24T06:45:07.333 に答える