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