setlocal
开始批处理文件中环境改动的本地化操作,执行setlocal后的环境改动仅限于批处理文件,还原设置必须执行endlocal
bat处理机制
set a=1
按行读取,执行前先做预处理,将变量值扩展到实际值
set b=%a%
预处理时为,set b=1
if、for等括号内的内容,是当做一条语句来处理,而不是多条语句
if %a%==1 (
set a=2
echo %a%
)
预处理时为,set a=2 & echo 1
因此,需要使用变量延迟,确保前一条语句运行后再运行后一条语句
变量延迟
// 开启变量延迟
setlocal enabledelayedexpansion
// 关闭变量延迟
setlocal disabledelayedexpansion
变量要使用
! !
,不能用% %
举例
运行结果为 ECHO 处于关闭状态。
第三行预处理为set var2=1 & echo,相当于执行了echo,所以结果就会输出 ECHO 处于关闭状态。
@echo off
set var1=1
set var2=%var1% & echo %var2%
pause
单独成行,先后运行,使用
% %
,运行结果为 1
@echo off
set var1=1
set var2=%var1%
echo %var2%
pause
同时运行,添加
变量延迟
,使用!!
,运行结果为 1
setlocal enabledelayedexpansion
@echo off
set var1=1
set var2=%var1% & echo !var2!
pause