在for循环中或if语句中多条命令都需要获取返回值等情况下,set变量显得无效,第二条命令开始变量的值都不会变。此处涉及批处理中的变量延迟问题
开启关闭方法
1. cmd下开启/关闭延迟环境变量
在cmd下开启或延迟环境变量用/v参数:
cmd /v:on //开启延迟环境变量
cmd /v:off //关闭延迟环境变量
2. 批处理中开启/关闭延迟环境变量
在批处理中开启或关闭延迟环境变量用setlocal命令:
setlocal EnableDelayedExpansion //开启延迟环境变量
setlocal DisableDelayedExpansion //关闭延迟环境变量
示例1:
@echo off & setlocal DisableDelayedExpansion
set aa=0
echo %aa%
if %aa%==0 (
set aa=1
echo %aa%
) else (
echo 输出结果2
)
pause>nul
输出结果是
0
0
开启了变量延迟后
@echo off & setlocal EnableDelayedExpansion
set aa=0
echo %aa%
if %aa%==0 (
set aa=1
echo !aa! rem这时如果仍然用百分号%来引用变量是不起作用的,必须用感叹号!,如!errorlevel!。
) else (
echo 输出结果2
)
pause>nul
输出结果
0
1
示例2:
for循环
@echo off&setlocal DisableDelayedExpansion
set a=2
echo a=%a%
for /L %%i in (4,1,10) do (
set a=%%i
echo a=%a%
)
pause>nul
结果
a=2
a=2
a=2
a=2
a=2
a=2
a=2
a=2
开启延迟变量
@echo off & setlocal EnableDelayedExpansion
set a=2
echo a=%a%
echo 开始进入for循环
for /L %%i in (4,1,10) do (
set a=%%i
echo a=!a!
)
pause>nul
结果
a=2
开始进入for循环
a=4
a=5
a=6
a=7
a=8
a=9
a=10