人们普遍认为延迟环境变量的开启只能用
setlocal enabledelayedexpansion.......endlocal
当然你的语句很长,用上面的方法是方便,但是你的语句就一句话时,没必要用上面的方法开启延迟变量。那用什么呢?
用cmd /vn......cmd /v:offf 这种方式开启的延迟变量和上面的方法开启的延迟变量是一样的效果。
知识点一:
延迟变量的机理我并不清楚,但是我是这么理解的,我把最初的变量理解为静态的,值不可变的,而我把延迟变量!t!理解为动态的一个序列
-------------------------------------------------------------------
序号 a1 a2 a3 ......
-----------------------------------------------------------------
值 v1 v2 v3.....
---------------------------------------------------------------------
我再次重申,我对延迟变量的机理并不清楚,我也没必要搞清楚,我只需要知道延迟变量就是一个序列就可以了。
另一个知识点:
在批文件中使用cmd ,这个cmd等于一个语句的结束标识号。什么意思?比如my.bat的代码如下:-
- echo 111
- echo 222
- cmd /k echo hehe
- echo 333
复制代码 那么点击my.bat的结果就是只执行到 hehe这里,后面的语句不起作用。所以说在bat中
cmd=句号。
下面看我的实例:
eq.1- @echo off
- echo 000
- set t=111
- cmd /t:0a "echo 123 & echo %t%"
复制代码 说明:cmd前的命令会传递到cmd中执行,但cmd行和行后面的命令却不会执行,也就是不起作用。
另cmd后面的命令换行无效。格式为 cmd "....",按cmd的解释是 cmd后面是string。
cmd的作用实际就是创设dos命令的运行环境。让dos命令在cmd创设的环境中得到解释执行。
!t!变量其实就是一个序列,这是由%t%扩展而成的一个序列。所以叫延迟变量扩展。
序号| a1 a2 a3 a4...
-------------------------------------------
值| v1 v2 v3 v4...
eq.2- @echo off
- echo 000
- set t=111
- cmd /t:0a /k "echo 123 & echo %t%"
复制代码 说明:使用开关c,k后,cmd前的参数与cmd所在行的参数会传递到cmd中去,但cmd行后参数不会被
传递,因为cmd行后的命令不起作用。
eg.3- @echo off
- echo 000
- set t=111
- cmd /t:0a /k "echo 123 & echo %t% &set tt=222&echo %tt%"
复制代码 说明:cmd 行后的新环境变量tt的值已经存在,但是却不能在cmd的行后以%tt%调用,这是只能启用延迟
环境变量!tt!看下一例子.cmd默认是没有启用延迟变量的。
eg.4- @echo off
- echo 000
- set t=111
- cmd /t:0a /v:on /k "echo 123 & echo %t% &set tt=222&echo !tt!"
复制代码 说明:cmd中开启延迟变量的方法是cmd /v:on,关闭的方法是cmd /v:off。
v---var变量的前三字。k--keep,c--cut。
当开启了延迟变量后,就相当于创设了一个可以在cmd所在行进行值传递的一个
环境。延迟变量特别擅于处理数列问题。这和for的延迟变量类似。
用setlocal enabledelayedexpansion...endlocal语句创设的也是延迟变量环境。
当我们的语句叫多时,就用这句。当我们的语句较少时就用cmd /v:on...cmd /v:off .
eg.5 直接在命令提示符里的实验
实验1
在cmd中输入
- set t=1 &echo %t% &set t=2 &echo %t%&set t=3 &echo %t%&set t=4 &echo %t%
复制代码
看看结果
为 4,4,4,4 这里只显示的最后的t=4这个值了。
实验2
在cmd中开启延迟环境变量:cmd /v:on 然后再输入语句:- set t=1 &echo !t! &set t=2 &echo !t!&set t=3 &echo !t!&set t=4 &echo !t!
复制代码 看看结果
这时我们将看到序列1,2,3,4这说明!t!的值按序动态的在变化了。
eg.6 开启最后再关闭延迟环境变量
- @echo off
- cmd /v:on /k "set t=1 &echo !t! &set t=2 &echo !t! &set t=3 &echo !t! &cmd /v:off "
复制代码
eg.7for中的延迟变量开启
- @echo off
-
- cmd /v:on /k "for %%i in (1,2,3,4) do @(set t=%%i & @echo !t!)"
复制代码
说明:结果为1 2 3 4
总结:cmd /v:on开启短语句的程序叫方便,当程序太长就用set enabledeplaydeexpansion开启。
[ 本帖最后由 myzam 于 2011-2-24 19:13 编辑 ] |