dos 环境变量延迟扩展enabledelayedexpansion详解

2019-01-29 21:08:15于海丽

以 cn-dos 联盟的willsort的这篇教程为例,(个人认为是解释的极具权威和专业的)

  但可能就是因为专业,所以才看不懂,因为学cmd批处理的并不一定都是学计算机专业的。这个鬼东西确实不太好
理解,在下也是摸爬滚打多时,总结出一点点经验,现用通俗的方法解释出来,希望能给新手些帮助,老鸟们见笑
了,若有不对的地方,欢迎指出。

  言归正传
在什么时候需要延迟变量,和该如何引用延迟变量,我想这才是大多数新手迫切想要知道的问题。
耐心看完下面的内容,我想对你应该是有帮助的。

  要想了解延迟变量,首先你要明白什么是“复合语句”好像又来了个“专业”名词,别急,这个超好理解。所谓
“复合语句”就是指一对()里的所有命令。比如for的do后面
如:

for /f "delims=" %%i in (a.txt) do ( set var=%%i echo %%i set num=%%i )

这里do后面的三句命令,在一对()里面,这就叫“复合语句”,当然不止for 还有if 等等。。。
如:

if "%var%"=="abc" ( echo ok set lis=123 )

反正就是凡是()里的所有命令,就叫“复合语句”
另外:这也是复合语句 set abc=123&echo %abc% 没错,通过管道命令&连接起来的命令,也是复合语句。

  好,了解了复合语句,现在开始讲延迟变量,也就说,在复合语句中才要使用延迟变量。
我们先不去理解什么叫“变量的扩展”这玩意叫法太专业,我到现在都不太明白,

  我们只要知道在什么时候需要使用延迟变量,如何才能正确提取到我们需要的变量就可以了,这才是我们的目的。
cmd在处理“复合语句”的时候,如果“复合语句”中用到了变量,会把变量的值当作复合语句之前变量的值来引用
。如果在此之前变量没有被赋值,就把它当成空值。

例1,

@echo off for /l %%i in (1 1 10) do ( set var=%%i echo %var% ) Pause

运行上面的代码,显示什么?显示10个echo处于关闭状态。按照逻辑,var的值应该依次是 1、2、3........10 才
对啊!

这就是因为没有开启 延迟变量 的缘故,cmd把var的值当作复合语句之前的值来引用,
而在本例中,复合语句之前并没有给var定义,所以var的值是空的,所以会显示10个echo处于关闭状态。

例2,

@echo off set var=abc for /l %%i in (1 1 10) do ( set var=%%i echo %var% ) Pause

运行上面的代码,会显示什么,大家应该知道了吧?

例3,

相关文章 大家在看
@echo off set var=abc for /l %%i in (1 1 5) do ( set var%%i=%%i echo %var% ) echo %var1% %var2% %var3% %var4% %var5% pause