延迟变量
---------siwuxie095
命令:
setlocal enabledelayedexpansion
扩展本地环境变量延迟 或 延迟环境变量扩展
set:设置; local:本地(环境变量) |
enable:能够; delayed:延迟; expansion:扩展 |
setlocal enabledelayedexpansion 扩展本地环境变量延迟 或 延迟环境变量扩展 |
复合语句:一对括号()里的所有命令〔即便只有一条命令〕是复合语句;通过管道命令 & 、
&& 、| 、|| 连接起来的命令也是复合语句
使用了 setlocal enabledelayedexpansion 后,
如果在复合语句外引用变量,则使用 %var% 或 !var! 都可以
如果在复合语句中引用复合语句即时得到的变量,则必须使用 !var!
在复合语句中还使用 %var%,那么得到的变量将是复合语句之前 var 的值,
此时如果 var 在复合语句之前没有定义,那么值为空值
如:
@echo off set a=4 set a=5 & echo %a% pause |
sublime中:
运行一览:输出为 4 而不是 5
批处理读取命令时是按行读取,在处理之前要完成必要的预处理工作,其中就包括
对该命令行中的变量赋值,在运行到 set a=5 & echo %a% 之前,先把这一句整句读取,
并做预处理,对变量 a 赋值,那么 %a% 就是 4
解决方法:批处理变量延迟
如:
@echo off setlocal enabledelayedexpansion set a=4 set a=5 & echo !a! pause |
sublime中:
运行一览:
如果不用延迟变量:
@echo off set a=4 set a=5 echo %a% pause |
sublime中:
效果也是一样,都会输出 5
但实际上,延迟变量不是可有可无的,某些情况下(如:在复合语句中),
没有延迟变量,程序就无法正确运行
复合语句下:
如:
@echo off setlocal enabledelayedexpansion set num=100 for /l %%i in (1,1,%num%) do (set S%%i=1) for /l %%i in (1,1,%num%) do (echo !S%%i!) pause |
sublime中:
运行一览:输出100个 1
这里的(echo !S%%i!),虽然只有一句,但依然是复合语句,只有用 !S%%i!,
才能回显实时的数值
若用 %S%%i%,全是空值,无法显示,如下:输出100个 ECHO 处于关闭状态
再如:
@echo off setlocal enabledelayedexpansion set abc=123 & echo !abc! pause |
sublime中:
运行一览:
这里 set abc=123 & echo !abc!,也是复合语句
计算机无法实时获取复合语句内的变量,%var% 获取的是复合语句前变量的值,
要想实时获取复合语句中变量的动态值,就要使用延迟变量,且符号为:!var!
变量延迟的适用范围:
在复合语句中,且要实时获得变量的动态值,就要使用延迟变量
再如:
@echo off rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1 for /l %%i in (1 1 10) do ( set var=%%i echo %var% ) pause |
sublime中:
运行一览:输出10个 ECHO 处于关闭状态
如果set var=abc:
@echo off set var=abc rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1 for /l %%i in (1 1 10) do ( set var=%%i echo %var% ) pause |
sublime中:
运行一览:
如果:
@echo off set var=abc rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1 for /l %%i in (1 1 5) do ( set var%%i=%%i echo %var% ) echo %var1% %var2% %var3% %var4% %var5% pause |
sublime中:
运行一览:
这表明:在复合语句中,并不是没有给变量赋值,只是因为没有开启
延迟变量,就没办法在复合语句中提取到它,要等复合语句运行完毕后
才能提取到。
即:在复合语句中提取变量值,变量值是复合语句前的值,等复合语句运行完毕后,
此时可以正确提取变量在复合语句中所赋的值
变量的两种表示方法:1、%var% 2、!var!
第一种是普通情况下的表示方法,第二种就是引用延迟的变量
在开启延迟变量的情况下:在复合语句外,用哪种都可以;在复合语句中
引用复合语句即时得到的变量,就要用第二种方法
如:
@echo off setlocal enabledelayedexpansion set var=abc rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1 for /l %%i in (1 1 5) do ( set var%%i=%%i ) echo %var1% %var2% %var3% %var4% %var5% echo !var1! !var2! !var3! !var4! !var5! pause |
sublime中:
运行一览:
再如:
@echo off setlocal enabledelayedexpansion set var=abc rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1 for /l %%i in (1 1 10) do ( set var=%%i echo %var% echo !var! ) pause |
sublime中:
运行一览:
延迟变量实际应用:
如:读入一个起始数字和一个终止数字,连续输出从起始数
字到终止数字之间的所有数字,数字与数字之间要有空格
@echo off setlocal enabledelayedexpansion set /p beg=请输入起始数字 : set /p end=请输入最终数字 : echo. rem 前面:白色的 l 是字母L,后面:紫色的 1 是数字 1 for /l %%i in (%beg%,1,%end%) do ( set num= %%i rem 在 <nul 前面加个空格 每个数字和数字间就会有空格 set /p var=!num:~-7! <nul set /a var=%%i%%10 if !var!==0 echo. ) pause>nul |
sublime中:
运行一览:
批处理中,call命令也可以用来延迟变量
如:
@echo off set num=1 set num=2 & call echo %%num%% pause |
sublime中:
运行一览:
可见:
使用 setlocal enabledelayedexpansion 来延迟变量,
变量符号改为感叹号(英文格式下)
使用 call 来延迟变量,就要在原来的命令前加 call,并
把变量引用的单层百分号改为双层百分号(繁琐,使用较少)
【made by siwuxie095】
posted on 2017-01-23 20:49 siwuxie095 阅读(477) 评论(0) 编辑 收藏 举报