解析时间与执行时间

drs*_*345 0 terminology batch-file

我正在尝试学习MS Batch,并且我特别想了解“ setlocal”和“ enabledelayedexpression”方面,当我遇到词汇时我不明白:

执行时间解析时间

jeb*_*jeb 5

解析单个行时,解析器具有不同的阶段。
因此,在执行某行(或某块中的任何行)之前,在解析某行或某块时,所有百分比表达式都会展开。

因此,在执行时它们不再更改。

set var=origin
echo #1 %var%
(
  set var=new value
  echo #2 %var%
)
echo #3 %var%
Run Code Online (Sandbox Code Playgroud)

它输出

#1 origin
#2 origin
#3 new value
Run Code Online (Sandbox Code Playgroud)

与解析时一样,#2将扩展origin为执行该块的任何行之前的时间。因此,您可以在#3的块之后看到新值。

相反,恰好在执行该行之前,为每行扩展了延迟扩展。

setlocal EnableDelayedExpansion
set var=origin
echo #1 %var%, !var!
(
  set var=new value
  echo #2 %var%, !var!
)
echo #3 %var%, !var!
Run Code Online (Sandbox Code Playgroud)

输出量

#1 origin, origin
#2 origin, new value
#3 new value, new value
Run Code Online (Sandbox Code Playgroud)

现在在#2处,您将看到同一变量的两种不同扩展,因为%var%在解析块时扩展,但在执行!var!该行后扩展set var=new value

有关批处理解析器的更多详细信息,请参见SO:Windows命令解释器(CMD.EXE)如何解析脚本?