使用ENABLEDELAYEDEXPANSION

时间:2011-07-07 14:52:30

标签: batch-file cmd

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

1 个答案:

答案 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
)
…

效果是一样的,因为括号内的命令都被解析并作为一个单元执行:首先它们全部解析,然后它们都被执行。