我见过SETLOCAL ENABLEDELAYEDEXPANSION
&许多批处理文件中SETLOCAL DISABLEDELAYEDEXPANSION
但命令实际上做了什么?
答案 0 :(得分:18)
enabledelayeexpansion
指示cmd
识别访问!var!
current
值var
的语法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
)