荣尔仁荣毅仁:批处理中的for语句小结 - 批处理教学&资料 - 批处理之家 ─ 做最实用的批处理论坛 - Powered by Discuz!

来源:百度文库 编辑:九乡新闻网 时间:2024/05/07 04:45:30



个人自己总结, 参考了英雄的部分资料,很粗糙,有什么不足,大家补正! 复制内容到剪贴板
代码:
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
pause