使用 ENABLEDELAYEDEXPANSION
在批处理脚本中使用 ENABLEDELAYEDEXPANSION 时,调用 ENDLOCAL 后在其中创建的变量是否仍然存在?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在批处理脚本中使用 ENABLEDELAYEDEXPANSION 时,调用 ENDLOCAL 后在其中创建的变量是否仍然存在?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
我理解,您的问题基本上是关于 SETLOCAL 命令及其效果,无论使用什么
ENABLEDELAYEDEXPANSION
选项(或任何其他选项)。我的简短回答是:否,假设变量在进入
SETLOCAL
范围之前不存在。我的较长答案如下:
在
SETLOCAL
范围内对变量所做的所有更改在退出范围时(即到达ENDLOCAL
时)都会被丢弃。这包括:定义以前未定义的变量:
<前><代码>@ECHO 关闭
输出:
<前><代码>1.未定义
2.定义
3.未定义
取消定义先前定义的变量:
<前><代码>@ECHO 关闭
设置ttt=1
<nul SET /P q=1。
IF DEFINED ttt(ECHO 已定义) ELSE(ECHO 未定义)
设定本地
设置TT=
<nul SET /P q=2。
IF DEFINED ttt(ECHO 已定义) ELSE(ECHO 未定义)
本地化
<nul SET /P q=3。
IF DEFINED ttt(ECHO 已定义) ELSE(ECHO 未定义)
输出为:
<前><代码>1.定义
2.未定义
3.定义
更改变量的值:
<前><代码>@ECHO 关闭
设置ttt=1
回声1.ttt=%ttt%
设定本地
设置ttt=2
回声2.ttt=%ttt%
本地化
回声3.ttt=%ttt%
这会产生以下输出:
<前><代码>1.ttt=1
2.ttt=2
3.ttt=1
正如我在开始时所说,上述内容适用于
SETLOCAL
无论您是否将其与其他选项一起使用。总之,我想说的是,可以保存
SETLOCAL
范围内计算的结果,以便在ENDLOCAL
之后使用。这里有一个小技巧可以实现这一点:在解析这一行时,
SETLOCAL
命令仍然有效,因此%var%
被评估为您最近存储到var
中的值。当该行执行时,var
变量在ENDLOCAL
之后立即丢失其值,但SET命令已经包含其值,只是被替换,所以var
收到了它,每个人都满意。根据 @Jeremy Murray 的评论,如果您包含
ENDLOCAL
以及在所包含的单个块中读取变量的命令,您还可以在ENDLOCAL
之后访问更改后的值括号中:效果是相同的,因为括号内的命令都作为一个单元进行解析和执行:首先它们全部被解析,然后它们全部被执行。
I understand, your question is basically about the
SETLOCAL
command and its effects, regardless of theENABLEDELAYEDEXPANSION
option (or any other one) used.My short answer is: No, assuming the variables didn't exist prior to entering
SETLOCAL
's scope.My longer answer is as follows:
All the changes made to a variable within the scope of
SETLOCAL
are discarded upon exiting the scope (i.e. upon reachingENDLOCAL
). This includes:defining a previously undefined variable:
This outputs:
undefining a previously defined variable:
The output is:
changing a variable's value:
And this produces the following output:
As I said in the beginning, the above applies to
SETLOCAL
regardless of whether you use it with additional options or not.In conclusion I'd like to say that it is possible to save the result calculated within
SETLOCAL
's scope, for use afterENDLOCAL
. Here's a little trick that makes it possible:At the time of parsing this line, the
SETLOCAL
command is still in effect, so%var%
gets evaluated to the value you've stored intovar
most lately. When the line is executed, thevar
variable loses its value immediately afterENDLOCAL
, but the SET command already contains its value, just substituted, sovar
receives it back, to everybody's satisfaction.As per @Jeremy Murray's comment, you could also get access to the changed value after
ENDLOCAL
if you includedENDLOCAL
and the command(s) reading the variable in a single block enclosed in parentheses:The effect would be the same because bracketed commands are both parsed and executed as a single unit: first they are all parsed, then they are all executed.