Batch file 启用和禁用延迟扩展,它做什么?

Batch file 启用和禁用延迟扩展,它做什么?,batch-file,Batch File,我在许多批处理文件中看到过SETLOCAL ENABLEDELAYEDEXPANSION&SETLOCAL DISABLEDELAYEDEXPANSION,但是这些命令实际上做什么呢?ENABLEDELAYEDEXPANSION指示cmd识别语法!瓦尔访问var的当前值禁用延迟扩展关闭此功能,因此!瓦尔变成了一个简单的文本字符串 在块语句(一系列带括号的语句)中,解析整个块,然后执行。在解析块时,块内的任何%var%都将替换为该变量的值——在执行块之前——这同样适用于。。。DO(块) 使用!瓦尔

我在许多批处理文件中看到过
SETLOCAL ENABLEDELAYEDEXPANSION
&
SETLOCAL DISABLEDELAYEDEXPANSION
,但是这些命令实际上做什么呢?

ENABLEDELAYEDEXPANSION
指示
cmd
识别语法
!瓦尔访问
var
当前值<代码>禁用延迟扩展
关闭此功能,因此
!瓦尔变成了一个简单的文本字符串

在块语句
(一系列带括号的语句)
中,解析整个块,然后执行。在解析块时,块内的任何
%var%
都将替换为该变量的值——在执行块之前——这同样适用于。。。DO(块)

使用
!瓦尔
代替
%var%
访问复制自的
var
的更改值(如dbenham在其第一条注释中所示)

假设此代码:

If "%getOption%" equ  "yes" (
   set /P option=Enter option: 
   echo Option read: %option%
)
前面的代码将不起作用,因为在解析IF命令时(在执行之前),只替换了一次%option%值。您需要“延迟”变量值扩展,直到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:Before Delayed:Before Delayed:Before

请注意,使用
SETLOCAL ENABLEDELAYEDEXPANSION
时,您不能回显so:

echo my sentence! 123
将输出为:

我的句子123


通过延迟扩展,您将能够使用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
)
可能重复的