批处理中tlocalenabledelayedexpansion
批处理中tlocal enabledelayedexpansion的作⽤详细整理
设置本地为延迟扩展。其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的⼀关!所以这⼀部分希望你能认真看。
为了更好的说明问题,我们先引⼊⼀个例⼦。
例1:
代码如下:
@echo off
t a=4
t a=5&echo %a%
pau
结果:4
解 说:为什么是4⽽不是5呢?在echo之前明明已经把变量a的值改成5了?让我们先了解⼀下批处理运⾏命令的机制:批处理读取命令时是按⾏读取的(另外例 如for命令等,其后⽤⼀对圆括号闭合的所有语句也当作⼀⾏),在处理之前要完成必要的预处理⼯作,这其中就包括对该⾏命令中的变量赋值。我们现在分析⼀ 下例1,批处理在运⾏到这句“t a=5&echo %a%”之前,先把这⼀句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)⽽为了能够感知环境变 量的动态变化,批处理设计了变量延迟。简单来说,在读取了⼀条完整的语句之后,不⽴即对该⾏的变量赋值,⽽会在某个单条语句执⾏之前再进⾏赋值,也就是说 “延迟”了对变量的赋值。那么如何开启变量延迟呢?变量延迟⼜需要注意什么呢?
举个例⼦说明⼀下:
例2:
代码如下:
@echo off
tlocalenabledelayedexpansion
拔河绳t a=4
t a=5&echo !a!
pau
结果:5
解 说:由于启动了变量延迟,得到了正确答案。变量延迟的启动语句是“tlocalenabledelayedexpansion”,并且变量要⽤⼀对叹
号“!!”括起来(注意要⽤英⽂的叹号),否则就没有变量延迟的效果。分析⼀下例2,⾸先 “tlocalenabledelayedexpansion”开启变量延迟,然后“t a=4”先给变量a赋值为4,“t a=5&echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该⾏变量赋值,⽽是在运⾏过程中给变量赋值,因此 此时a的值就是5了)。再举⼀个例⼦巩固⼀下。 例3:
代码如下:
@echo off
tlocalenabledelayedexpansion
太极拳好处for /l %%i in (1,1,5) do ( t a=%%i echo !a! )
pau
结果:12345
解 说:本例开启了变量延迟并⽤“!!”将变量扩起来,因此得到我们预期的结果。如果不⽤变量延迟会出现什么结果呢?结果是这样的:ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。即没有感知到for语句中的动态变化。
batman的说明
我来简要说⼀下吧:颜色搭配口诀
t:设置
local:本地(环境变量)
enable:能够
delayed:延迟
expansion:扩展
tlocal enabledelayedexpansion就是扩展本地环境变量延迟,
⽐较下⾯两段代码:
代码如下:
@echo off
for /l %%i in (1,1,10) do (
t "str=%%i"
echo %str%
)
pau>nul
代码如下:
@echo off&tlocal enabledelayedexpansion
for /l %%i in (1,1,10) do (
t "str=%%i"
echo !str!
)
pau>nul
第⼀段代码只会显⽰10⾏“ECHO 处于关闭状态。”,⽽第⼆段代码则会正确显⽰1-10的10⾏数字。这是为什么呢?因为在两段代码的for循环前str都是没有被定义的,⽽由于第⼀段代码没有开启变量延迟,所以str值⼀直是没有定义,因⽽显⽰出了10⾏报
错信息;⽽第⼆段代码开启了变量延迟,在for循环中每次赋予str的值被传递下去,因⽽会正确显⽰10⾏数字,但这⾥的str变量符必须要写成!str!,这是没有道理可讲的,只要记住就好了。
tlocal enabledelayedexpansion 是什么意思?
现货开户>12月份
是:设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展",
在cmd执⾏命令前会对脚本进⾏预处理,其中有⼀个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进⾏识别,并且查找这个变量对应的值,再⽽将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执⾏命令。在解释之前,先看⼏个例⼦的区别:
例⼀:
t value=kkkkkkk
echo %value%
将这段代码保存到⼀个后缀为bat的⽂本⽂件中。然后打开dos,进到对应⽬录下,执⾏这个⽂件,结果如下:
左眉尾有痣C:\Documents and Settings\Administrator\桌⾯\ln\temp\bat>t value=kkkkkkk
C:\Documents and Settings\Administrator\桌⾯\ln\temp\bat>echo kkkkkkk
kkkkkkk
最 后⼀⾏是结果,但是在结果之前,还有两句,t value=kkkkkkk 和 echo kkkkkkk,但是在语句中,我们并没有写echo kkkkkkk的语句,这表明⾄少在执⾏到echo %value% 这句时,对变量进⾏的值的替换。这就是变量的扩展。
那么什么是变量的延迟扩展呢?
如 果⼤家知道C++的“静态变量”概念,那就应该知道,c++编译的时候,会对静态变量进⾏值的替换,但这个替换是基于静态的前提下,那么进⾏变量扩展时, 也是这样,但如果出现动态的情况会怎样?在cmd执⾏中,发⽣动态的⼀种情况是在 for语句中进⾏变量赋值,例如:
例⼆:
代码如下:
@echo off
for /l %%i in (1,1,3) do (
t k=%%i ::对k进⾏循环赋值
echo %k% %%i
)
执⾏这样的脚本,出现如下结果:
_1
_2
_3
结果出现这三句话。_ 表⽰空格
注:k没有赋初值,则替换为空。
例三:
代码如下:
@echo off
t k=yyy
for /l %%i in (1,1,3) do (
t k= %%i ::对k进⾏循环赋值
echo %k% %%i
)
结果:
yyy 1
yyy 2
yyy 3
注:k有赋初值,则都替换为yyy。、
实例四:
代码如下:
@echo off
tlocal enabledelayedexpansion
t k= 3
for /l %%i in (1,1,3) do (
t k=%%i
echo %k% %%i
)
结果:
3 1
3 2a的意思
3 3
这⾥已经是⽤了延迟变量,为什么还会出现这种情况呢?再看实例五: 实例五:
代码如下:
@echo off
tlocal enabledelayedexpansion
t k= 3
for /l %%i in (1,1,3) do (
境界的拼音t k=%%i
echo !k! %%i
)
结果:
1 1
2 2
3 3
原来在延迟变量扩展中,要使⽤!来引⽤变量。