启用和禁用延迟扩展,它有什么作用?

时间:2014-03-09 04:38:38

标签: batch-file

我见过SETLOCAL ENABLEDELAYEDEXPANSION&许多批处理文件中SETLOCAL DISABLEDELAYEDEXPANSION但命令实际上做了什么?

4 个答案:

答案 0 :(得分:18)

enabledelayeexpansion指示cmd识别访问!var! currentvar的语法disabledelayedexpansion!var!关闭了这个工具,因此(a parenthesised series of statements)变成了一个文字字符串。

在块语句%var%中,解析整个块并执行然后。块中的任何FOR ... DO (block)将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于!var!。< / p>

使用%var%代替var访问已更改的{{1}}值。

答案 1 :(得分:4)

How do you use SETLOCAL in a batch file?复制(正如dbenham在他的第一条评论中指出的那样)。

假设此代码:

If "%getOption%" equ  "yes" (
   set /P option=Enter option: 
   echo Option read: %option%
)

以前的代码不起作用因为在解析IF命令时(在执行之前),只更换一次%选项%值。您需要“延迟”变量值扩展,直到SET / P命令修改了变量值:

setlocal EnableDelayedExpansion
If "%getOption%" equ  "yes" (
   set /P option=Enter option: 
   echo Option read: !option!
)

检查一下:

set var=Before
set var=After & echo Normal: %var%  Delayed: !var!

输出为:Normal: Before Delayed: After

答案 2 :(得分:0)

ALSO 请注意,SETLOCAL ENABLEDELAYEDEXPANSION您无法回复 !!!!!! 所以:

echo my sentence! 123

将被视为:

  

我的第123句

答案 3 :(得分:0)

通过延迟扩展,您将能够使用FOR命令令牌访问命令参数:

setlocal enableDelayedExpansion
set /a counter=0
for /l %%x in (1, 1, 9) do (
 set /a counter=!counter!+1
 call echo %%!counter! 
)
endlocal

如果要使用for循环解析参数,可能会有用

在通过变量访问变量时有帮助:

 @Echo Off
 Setlocal EnableDelayedExpansion
 Set _server=frodo
 Set _var=_server
 Set _result=!%_var%!
 Echo %_result%

并且可以在检查是否定义了带有特殊符号的变量时使用:

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)