使用ENABLEDELAYEDEXPANSION

Mec*_*ash 2 cmd batch-file

在批处理脚本中使用ENABLEDELAYEDEXPANSION时,在调用ENDLOCAL之后,其中创建的变量是否仍然存在?

And*_*y M 5

我明白,你的问题基本上是关于SETLOCAL命令及其影响,无论使用哪个ENABLEDELAYEDEXPANSION选项(或任何其他选项).

我的简短回答是:,假设变量在进入SETLOCAL范围之前不存在.

我的答案如下:

对范围内的变量所做的所有更改SETLOCAL在退出范围时(即到达时ENDLOCAL)将被丢弃.这包括:

正如我在开头所说SETLOCAL,无论您是否使用附加选项,上述内容均适用.

总之,我想说可以保存在SETLOCAL范围内计算的结果,以便在之后使用ENDLOCAL.这是一个让它成为可能的小技巧:

…
ENDLOCAL & SET var=%var%
…
Run Code Online (Sandbox Code Playgroud)

解析此行时,该SETLOCAL命令仍然有效,因此%var%将评估为最近存储的值var.当执行该行时,var变量会立即丢失其值ENDLOCAL,但SET命令已经包含其值,只是替换,所以var接收它,让每个人都满意.

根据@Jeremy Murray的评论,ENDLOCAL如果你包含ENDLOCAL了在括号中包含的单个块中读取变量的命令,你也可以访问更改后的值:

…
(
ENDLOCAL
SET var=%var%
anything else
)
…
Run Code Online (Sandbox Code Playgroud)

效果将是相同的,因为括号内的命令都被解析和执行为单个单元:第一它们所有解析,然后它们都被执行.

  • 如果需要,您还可以将endlocal置于paren语句中以执行多个集合.[想象一下这个例子中的新行,请:)](ENDLOCAL IF NOT"%RETURN_SIG%"==""SET"SIGNATURE =%RETURN_SIG%"IF"%RETURN_SIG%"==""SET"SIGNATURE =%DEFAULT_SIG% ") (2认同)