Fork me on GitHub

延迟变量

---------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编辑  收藏  举报

导航