@time 2019-07-09
@author Ruo_Xiao
1、变量扩展
当写一个 bat 脚本时,解释器会读取命令行完整指令,若解释器发现指令里面有变量时,需要对变量进行替换,那么识别变量的方法就是用“%”将变量括起来。替换之后,再进行指令的匹配操作,最后执行命令。
整体过程为:
(1)读取完整指令。
(2)对变量进行替换。
(3)匹配指令。
上述的第2步就是变量扩展步骤,也就是解释器识别变量的步骤。
栗子:
@echo off
set var=50
echo %var%
变量扩展完之后,实际显示的命令为
echo 50
2、延迟环境变量扩展
上述操作对于 echo 等其他单行指令是有效的,但是对于嵌套指令来说就有问题,如下栗所示:
@echo off
for %%i in (1,1,3) do (
set var=%%i
echo %var%
)
结果如下所示:
原因是 Bat 解释器将整个 for 语句当做一条完整的指令,进行变量扩展时,会将 “set var=%%i” 变为 “set var=”,因为 for 语句之前,i 变量并没有赋值,所示只能给 var 赋值为空。最后的 “echo %var%” 就变为 “echo ”,那么只能显示 echo 的开关状态了。
为了解决上述问题,Bat 增加了延时环境变量扩展的功能,该功能的作用就是延时变量扩展,先将 for 语句中各个指令执行一遍,再进行变量扩展,从而实现了代码结果的正常化。
增加延时环境变量的指令为:
setlocal enabledelayedexpansion
……
endlocal
两条指令之间的命令中,变量用 “!” 包起来来表示。
(SAW:Game Over!)