[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创] 浅谈批处理命令for中的变量扩展

浅谈for命令中的变量扩展
       首先表明本人并不赞同用变量扩展这个概念,因为用这个概念是不利于新手的理
解的。同时本人认为用保留变量信息这个概念可能更为贴切,我们姑且先如此定义
吧。
       新手们可能在别人的代码中见过%%~ni %%~xi %%~dpi这样的字符,于是很多新手
于是发问了:这个东东是什么啊?老手们便丢下一句话“变量扩展”或写下for /?。
有心一点的新手便会打开cmd输入for /?来查看帮助信息,结果往往是看得一头雾水,
不知道仍是不知道,今天我们就来解决这个问题了。
      大家先用以下代码搭建好以下环境:
  1. @echo off
  2. md d:\temp
  3. cd.>d:\temp\abcd.efgh
  4. start d:\temp
复制代码
再在当前目录中新建test.bat,内容如下:
  1. @echo off
  2. for /f %%a in ('dir /s /b a*') do (
  3.     echo %%a:文件完整信息
  4.     echo %%~da:保留文件所在驱动器信息
  5.     echo %%~pa:保留文件所在路径信息
  6.     echo %%~na:保留文件名信息
  7.     echo %%~xa:保留文件后缀信息
  8.     echo %%~za:保留文件大小信息
  9.     echo %%~ta:保留文件修改时间信息
  10.     echo %%~dpa:保留文件所在驱动器和所在路径信息
  11.     echo %%~nxa:保留文件名及后缀信息
  12.     echo %%~pnxa:保留文件所在路径及文件名和后缀信息
  13.     echo %%~dpna:保留文件驱动器、路径、文件名信息
  14.     echo %%~dpnxa:保留文件驱动器、路径、文件名、后缀信息
  15. )
  16. pause>nul
复制代码
运行这个批处理大家就会明白了。。。
       大家只要记住在这其中d p n x (t z)这些字符分别是代表的是什么意思就可以了,
同时这些字符是可以互相任意搭配的,如%%~dzxa主要看你想保留下文件(变
量)的哪些信息了。
***共同提高***

说的真详细,容易理解!!

TOP

说说延迟环境变量

人们普遍认为延迟环境变量的开启只能用
setlocal   enabledelayedexpansion.......endlocal
当然你的语句很长,用上面的方法是方便,但是你的语句就一句话时,没必要用上面的方法开启延迟变量。那用什么呢?
用cmd /vn......cmd /v:offf    这种方式开启的延迟变量和上面的方法开启的延迟变量是一样的效果。
知识点一:
延迟变量的机理我并不清楚,但是我是这么理解的,我把最初的变量理解为静态的,值不可变的,而我把延迟变量!t!理解为动态的一个序列
-------------------------------------------------------------------
序号  a1   a2   a3 ......
-----------------------------------------------------------------
    值  v1    v2    v3.....
---------------------------------------------------------------------
我再次重申,我对延迟变量的机理并不清楚,我也没必要搞清楚,我只需要知道延迟变量就是一个序列就可以了。

另一个知识点:
在批文件中使用cmd ,这个cmd等于一个语句的结束标识号。什么意思?比如my.bat的代码如下:
  1. echo 111
  2. echo  222
  3. cmd /k  echo hehe
  4. echo 333
复制代码
那么点击my.bat的结果就是只执行到 hehe这里,后面的语句不起作用。所以说在bat中
cmd=句号。


下面看我的实例:
eq.1
  1. @echo off
  2. echo 000
  3. set t=111
  4. 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
  1. @echo off
  2. echo 000
  3. set t=111
  4. cmd /t:0a /k "echo 123 & echo %t%"
复制代码
说明:使用开关c,k后,cmd前的参数与cmd所在行的参数会传递到cmd中去,但cmd行后参数不会被
传递,因为cmd行后的命令不起作用。

eg.3
  1. @echo off
  2. echo 000
  3. set t=111
  4. cmd /t:0a /k "echo 123 & echo %t% &set tt=222&echo %tt%"
复制代码
说明:cmd 行后的新环境变量tt的值已经存在,但是却不能在cmd的行后以%tt%调用,这是只能启用延迟
环境变量!tt!看下一例子.cmd默认是没有启用延迟变量的。

eg.4
  1. @echo off
  2. echo 000
  3. set t=111
  4. 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中输入
  1.   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 然后再输入语句:
  1. 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 开启最后再关闭延迟环境变量
  1. @echo off
  2. cmd /v:on /k "set t=1 &echo !t! &set t=2 &echo !t! &set t=3 &echo !t! &cmd /v:off "
复制代码

eg.7for中的延迟变量开启
  1. @echo off
  2. 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 编辑 ]

TOP

温故而知新,签到一下!
BAT - Beautiful, Amazing, Tool !------- Rockets

TOP

标记下,了解了. .

TOP

ad

还是不怎么了解 呵呵

TOP

谢谢man了,我现在终于懂了,以前总是看不懂
是非只因多开口,烦恼皆因强出头。

TOP

后缀是suffix,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

TOP

真的很强大的!学习ing

TOP

回复 11楼 的帖子

for /?
In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

想知道4楼的

%%~a、%%~fa 代表什么?

TOP

学习,最喜欢看你的帖
详细,易懂

TOP

只对DIR命令有效?

可以不可以多举几个例子?

TOP

哈哈 我也来上楼主的课咯
嗯 不错不错

TOP

老规矩,上课签到~~~

TOP

返回列表