所谓延迟变量扩展,实际上是指批处理运行命令时将变量扩展时机延迟到命令运行时,而不是加载时。 @echo off set a=1 if %a%==1 set a=2 & echo %a% pause 输出结果为: 1 原因是在 if 语句开始正式运行之前,批处理脚本引擎已经将该条语句扩展为 if 1==1 set a=2 & echo 1 为了避免%a%被过早扩展,我们就可以引入延迟变量扩展机制 @echo off & setlocal enabledelayedexpansion set a=1 if %a%==1 set a=2 & echo !a! pause 输出结果为: 2 上面例子中粗体的部分也可以看出延迟变量扩展的语法: 1. 使用 setlocal enabledelayedexpansion 启用延迟变量扩展 2. 用 !a! 来使用变量 a; 注意 %a% 仍可使用,但会被过早扩展,即使已经启用延迟变量扩展 @echo off & setlocal enabledelayedexpansion set a=1 if %a%==1 set a=2 & echo %a% pause 输出结果为: 1 除了上述用法之外,延迟变量扩展还可用于变量的嵌套,比如: @echo off set cd=5 set a=c set b=d echo %a%%b% ==> 输出 cd
要输出%a%%b%所指向的环境变量的值,就要启用延迟变量扩展 @echo off & setlocal enabledelayedexpansion set cd=5 set a=c set b=d echo !%a%%b%! ==> 输出 5 下面是另外一个嵌套循环变量的例子 @echo off & setlocal enabledelayedexpansion set a=abcdefghijk for /l %%i in (1,1,10) do ( cls echo !a:~0,%%i! ping 10 127.1 > nul ) pause
来源: http://www.cppblog.com/bidepan2023/archive/2009/01/02/54561.html