在批处理脚本中使用ENABLEDELAYEDEXPANSION时,调用ENDLOCAL后,其中创建的变量是否仍然存在?
答案 0 :(得分:5)
我理解,您的问题基本上是关于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)
输出:
1.undefined
2.defined
3.undefined
取消定义先前定义的变量:
@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)
输出结果为:
1.defined
2.undefined
3.defined
更改变量的值:
@ECHO OFF
SET ttt=1
ECHO 1.ttt=%ttt%
SETLOCAL
SET ttt=2
ECHO 2.ttt=%ttt%
ENDLOCAL
ECHO 3.ttt=%ttt%
这会产生以下输出:
1.ttt=1
2.ttt=2
3.ttt=1
正如我在开头所说,上述内容适用于SETLOCAL
,无论您是否使用其他选项。
总之,我想说可以保存在SETLOCAL
范围内计算的结果,以便在ENDLOCAL
之后使用。这是一个让它成为可能的小技巧:
…
ENDLOCAL & SET var=%var%
…
在解析这一行时,SETLOCAL
命令仍然有效,因此%var%
会被评估为您存储到var
中的值最近。当行执行时,var
变量在ENDLOCAL
之后立即丢失其值,但SET命令已经包含其值,只是被替换,因此var
收到它回来了,让每个人都满意。
根据@Jeremy Murray的评论,如果你包括ENDLOCAL
并且在括号中的单个块中读取变量的命令,你也可以在ENDLOCAL
之后访问更改后的值:
…
(
ENDLOCAL
SET var=%var%
anything else
)
…
效果是一样的,因为括号内的命令都被解析并作为一个单元执行:首先它们全部解析,然后它们都被执行。