先看一段代码:
@echo offset var1=6set var2=%var1%&echo %var2%pause
执行后的结果为:Echo处于关闭状态
刚看到这个结果后一脸懵逼,经过一番百度了解到原来Windows批处理处理机制是按行读取,每行执行前先做预处理(类似%var%都会被扩展到实际值),这就自然在执行第三行前已经被预处理成了:
set var2=6&echo
我们知道当单独输入echo,后面什么都不加的情况下是输出当前echo的开关状态,代码首行用了@echo off命令,这里自然是显示:Echo处于关闭状态。
好在Windows批处理提供了变量延迟机制(在代码前加入:Setlocal enabledelayedexpansion语句),即延迟变量扩展,这样在执行的时候还是:
set var2=%var1%&echo %var2%
不过这里有个规定,即在使用Setlocal enabledelayedexpansion时要对延迟变量使用!var!格式而不是%var%,完整代码:
@echo off&Setlocal enabledelayedexpansionset var1=6set var2=%var1%&echo !var2!pause
这样代码执行结果输出:6
注意:
- 用()括起来的算同一个行,即括号内的会同时被预处理,如if,for后面的();
- Setlocal enabledelayedexpansion作用于脚本,可使用endlocal提前结束作用范围;