| for语句总结 |
| 1、for 后面没有任何参数 |
| set str=a b c |
| set str=a,b,c |
| set str=a=b=c |
| set str=a;b;c |
| for %%i in (%str%) do echo %%i |
| 四种符号相隔abc: 空格、逗号、等号、分号 |
| |
| 2、for /l |
| for /l %%i in (1 1 100) do echo %%i |
| for /l %%i in (100 -1 1) do echo %%i |
| (1 1 100) (1,1,100) (1;1;100) (1=1=100) |
| 四种符号相隔1 1 100: 空格、逗号、等号、分号 |
| |
| 3、for /f |
| for /f ["option"] %%i in (filename) do command |
| for /f ["option"] %%i in ("string") do command |
| for /f ["option"] %%i in ('command') do command |
| option: eol=c 忽略以c开头的行,默认忽略 ;开头的行 |
| skip=n 忽略前n行 |
| delims=xxx 以 每个 x 为分隔符,默认以空格为分隔符 |
| tokens=x,y,m-n 提取分隔后的第几部分,和delims联合用,默认提取第一部分 |
| usebackq 一种特殊用法(见后面) |
| 当option为usebackq时,用法如下: |
| for /f "usebackq" %%i in ("filename") do command |
| for /f "usebackq" %%i in ('string') do command |
| for /f "usebackq" %%i in (`commamd`) do command |
| 有人会问,这个参数究竟有什么作用? |
| 答:当你要解析的文件的路径中带有空格,比如你要解析的文件路径为C:\Documents and Settings\Administrator\桌面\hero.txt。 |
| 如果不用usebackq参数,你将得不到正确的结果。 |
| 如果你这样写的话 |
| @echo off |
| for /f %%i in ("C:\Documents and Settings\Administrator\桌面\hero.txt") do echo %%i |
| pause |
| 结果只是解析了一个字符串而不是文件。 |
| 如果你这样写的话 |
| @echo off |
| for /f %%i in (C:\Documents and Settings\Administrator\桌面\hero.txt) do echo %%i |
| pause |
| 结果会提示找不到C:\Documents。 |
| 而如果这样写 |
| @echo off |
| for /f "usebackq" %%i in ("C:\Documents and Settings\Administrator\桌面\hero.txt") do echo %%i |
| pause |
| 你就可以得到正确的结果。 |
| 4、for /r |
| for命令中的“/r”参数是个比较有用的参数,下面将具体讲解。 |
| 基本格式:FOR /r 路径 %%variable in (set) do something |
| 检查以“路径”为根的目录树。如果在 /r 后没有指定目录,则使用当前目录。 |
| 如果集(set)为一个单点(.)字符,则枚举该目录树。 |
| 例1: |
| 显示出c盘下所有的txt文件。 |
| @echo off |
| for /r c:\ %%i in (*.txt) do echo %%i |
| pause |
| 例2: |
| 枚举当前目录下的所有子目录及子目录的目录…… |
| @echo off |
| for /r %%i in (.) do echo %%i |
| pause |
| 不过在所得的目录后面都会带一个“.”。 |
| 例3: |
| 在当前目录的父目录中寻找txt文件。 |
| @echo off |
| for /r .. %%i in (*.txt) do echo %%i |
| pause |
| 解说:本例中的“..”代表当前目录的父目录。 |
| 例4: |
| 在论坛中常有人这样写 |
| @echo off |
| for /r . %%i in (*.txt) do echo %%i |
| pause |
| 这里的“.”可以去掉,表示的是当前目录。 |
| |
| “/r”参数还有一些地方需要我们注意--集(set)中的元素会被识别为字符串而 |
| 非文件名除非有通配符修饰。 |
| 例5: |
| @echo off |
| for /r %%i in (hero.txt) do echo %%i |
| pause |
| 这里的hero.txt不会被识别为文件名,而仅仅被识别为字符串。如果你想在指定 |
| 的目录中搜索文件hero.txt,请看下两个例子。 |
| 例6: |
| @echo off |
| for /r %%i in (*hero.txt) do echo %%i |
| pause |
| 本例中由于有通配符“*”,故“*hero.txt”被识别为文件名。 |
| 例7: |
| @echo off |
| for /r %%i in (hero.txt) do if exist %%i echo %%i |
| pause |
| 这样我们就可以找到真正存在的hero.txt文件了。 |
| |
| 5、for /d |
| 基本格式:FOR /d %%variable in (set) do something |
| 如果集(set)中包含通配符,则识别为目录名,否则将被识别为字符串。 |
| 作用是--遍历当前目录下(set)中所指定的目录。 |
| 例1: |
| @echo off |
| for /d %%i in (hero) do echo %%i |
| pause |
| 本例中由于集(hero)中不含有通配符,故“hero”仅仅被识别为字符串。 |
| |
| 例2: |
| @echo off |
| for /d %%i in (*hero) do echo %%i |
| pause |
| 本例中由于集(*hero)中含有通配符*,故“*hero”被识别为文件名,结果 |
| 遍历了当前目录下所有与*hero匹配的目录。 |
| |
| 6、FOR 变量参照的替换已被增强。您现在可以使用下列选项语法: |
| |
| ~I - 删除任何引号("),扩充 %%I |
| %%~fI - 将 %%I 扩充到一个完全合格的路径名 |
| %%~dI - 仅将 %%I 扩充到一个驱动器号 |
| %%~pI - 仅将 %%I 扩充到一个路径 |
| %%~nI - 仅将 %%I 扩充到一个文件名 |
| %%~xI - 仅将 %%I 扩充到一个文件扩展名 |
| %%~sI - 扩充的路径只含有短名 |
| %%~aI - 将 %%I 扩充到文件的文件属性 |
| %%~tI - 将 %%I 扩充到文件的日期/时间 |
| %%~zI - 将 %%I 扩充到文件的大小 |
| %%~$PATH:I - 查找列在路径环境变量的目录,并将 %%I 扩充 |
| 到找到的第一个完全合格的名称。如果环境变量名 |
| 未被定义,或者没有找到文件,此组合键会扩充到 |
| 空字符串 |
| 可以组合修饰符来得到多重结果: |
| %%~dpI - 仅将 %%I 扩充到一个驱动器号和路径 |
| %%~nxI - 仅将 %%I 扩充到一个文件名和扩展名 |
| %%~fsI - 仅将 %%I 扩充到一个带有短名的完整路径名 |
| %%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %%I 扩充 |
| 到找到的第一个驱动器号和路径。 |
| %%~ftzaI - 将 %%I 扩充到类似输出线路的 DIR |
| 这里只给出一个例子,具体的读者可以在实际应用中细细体会。 |
| 例: |
| @echo off |
| for /r %%i in (*.txt) do echo %%~zi %%~ni |
| pause |
| 结果:显示当前目录及其子目录下的所有txt文档,左半部分显示文件的大小,右半部分是文件名(不包含扩展名)。 |
| 解说:“%%~zi”代表文件的大小,“%%~ni”代表文件名(不包含扩展名)。 |
| 加上~,去掉双引号 |
| f:全路径 |
| d:盘符(d:driver) |
| p:相对路径 |
| n:名字(n:name) |
| x:扩展名(x:extension) |
| s:全路径的短名,例如:C:\DOCUME~1\ADMINI~1\ |
| a:文件属性,(a:attrib) |
| t:文件的日期、时间(t:date、time) |
| z:文件大小(z:size) |
| 例: |
| @echo off |
| echo %0 |
| echo %~0 |
| echo %~f0 |
| echo %~d0 |
| echo %~p0 |
| echo %~n0 |
| echo %~x0 |
| echo %~s0 |
| echo %~a0 |
| echo %~t0 |
| echo %~z0 |
| echo %~dp0 |
| echo %~nx0 |
| echo %~fs0 |
| pauseCOPY |