Board logo

标题: [原创] 浅谈批处理命令for中的变量扩展 [打印本页]

作者: batman    时间: 2008-10-18 20:26     标题: 浅谈批处理命令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主要看你想保留下文件(变
量)的哪些信息了。
作者: qq641255849    时间: 2008-10-18 22:58

抢个沙发先
D是drive
P是path
n是name
x是后缀?
z是size?
t是time?
就能猜出那么多

虽说变量拓展难懂,但是很有用哦...
作者: pusofalse    时间: 2008-10-23 12:58

x ....extension?
作者: Cameron    时间: 2008-11-2 20:24

%%~a、%%~fa?
作者: nomyself    时间: 2008-11-3 08:45

cn-dos太大了,东西很多。

重温p处理,bathome很不错哦。

以前不理解的现在豁然开朗。
作者: kennybao    时间: 2008-11-15 13:25

很不错,通过示例代码 将复杂的东西 展示出来,通俗易懂,很方便我等学习进步啊。CMD里面的解释真差,看了还是不知道如何运用。还是这个好。谢谢,希望以后多点这样的 示例代码 教学帖子。
作者: MarkovChain    时间: 2008-12-1 02:19

老规矩,上课签到~~~
作者: steven007    时间: 2008-12-23 07:47

哈哈 我也来上楼主的课咯
嗯 不错不错
作者: pengpangxiong    时间: 2009-1-7 19:41     标题: 只对DIR命令有效?

可以不可以多举几个例子?
作者: p05401144    时间: 2009-1-8 15:16

学习,最喜欢看你的帖
详细,易懂
作者: inittab    时间: 2009-4-16 11:33

想知道4楼的

%%~a、%%~fa 代表什么?
作者: Batcher    时间: 2009-4-16 11:53     标题: 回复 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

作者: sjzong    时间: 2009-4-16 13:26

真的很强大的!学习ing
作者: xmaoh234    时间: 2009-5-9 13:09

后缀是suffix,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
作者: sjminh    时间: 2009-12-13 19:19

谢谢man了,我现在终于懂了,以前总是看不懂
作者: qinshenyizhong    时间: 2010-7-16 14:42     标题: ad

还是不怎么了解 呵呵
作者: doupip    时间: 2010-10-29 13:28

标记下,了解了. .
作者: rockets    时间: 2011-2-18 15:25

温故而知新,签到一下!
作者: myzam    时间: 2011-2-24 19:01     标题: 说说延迟环境变量

人们普遍认为延迟环境变量的开启只能用
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 编辑 ]
作者: g99    时间: 2012-3-28 16:04

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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2