在批处理脚本中使用ENABLEDELAYEDEXPANSION时,在调用ENDLOCAL之后,其中创建的变量是否仍然存在?
我明白,你的问题基本上是关于SETLOCAL命令及其影响,无论使用哪个ENABLEDELAYEDEXPANSION选项(或任何其他选项).
我的简短回答是:不,假设变量在进入SETLOCAL范围之前不存在.
我的答案如下:
对范围内的变量所做的所有更改SETLOCAL在退出范围时(即到达时ENDLOCAL)将被丢弃.这包括:
定义以前未定义的变量:
@ECHO OFF
<nul SET /P q=1.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
SETLOCAL
SET ttt=
<nul SET /P q=2.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
ENDLOCAL
<nul SET /P q=3.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
Run Code Online (Sandbox Code Playgroud)
这输出:
1.undefined
2.defined
3.undefined
Run Code Online (Sandbox Code Playgroud)取消定义先前定义的变量:
@ECHO OFF
SET ttt=1
<nul SET /P q=1.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
SETLOCAL
SET ttt=
<nul SET /P q=2.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
ENDLOCAL
<nul SET /P q=3.
IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
Run Code Online (Sandbox Code Playgroud)
输出是:
1.defined
2.undefined
3.defined
Run Code Online (Sandbox Code Playgroud)更改变量的值:
@ECHO OFF
SET ttt=1
ECHO 1.ttt=%ttt%
SETLOCAL
SET ttt=2
ECHO 2.ttt=%ttt%
ENDLOCAL
ECHO 3.ttt=%ttt%
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
1.ttt=1
2.ttt=2
3.ttt=1
Run Code Online (Sandbox Code Playgroud)正如我在开头所说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)
效果将是相同的,因为括号内的命令都被解析和执行为单个单元:第一它们所有解析,然后它们都被执行.