for循环有六种用法,乍一看很复杂,其实没那么复杂。个人建议直接使用4 5 6 ,因为多了个这个"usebackq",意思就是说,可以处理 文件名的全路径或者命令语句的返回结果中有空格或& 的文件。比如这种文件 D:\Program Files\a.txt,处理这种路径带空格的文件,下面的1 2 3 是无能为力的。 下面对上面六种格式,做举例说明:
for循环详细用法,请参考此文《批处理for语句从入门到精通》。
1、for /f %%i in (文件名) do (……)
2、for /f %%i in ('命令语句') do (……)
3、for /f %%i in ("字符串") do (……)
4、for /f "usebackq" %%i in ("文件名") do (……)
5、for /f "usebackq" %%i in (`命令语句`) do (……)
6、for /f "usebackq" %%i in ('字符串') do (……)
其中,4、5、6由1、2、3发展而来,他们有这样的对应关系:1-->4、2-->5、3-->6。
好在后3种情形并不常用【 编注:其实这三种情况经常会碰到,windows的文件路径通常带空格的比较多】,所以,牢牢掌握好前三种句型【 编注:最好记住后三种,因为我经常用到的都是后3种】的适用情形就可以了,否则,要在这么多句型中确定选择哪一条语句来使用,还真有点让人头脑发懵。至于 for /f 为什么要增加usebacq参数,我只为第4条语句找到了合理的解释:为了兼容文件名中所带的空格或&。它在第5、6条语句中为什么还有存在的必要,我也不是很明白,这有待于各位去慢慢发现【编注:第五条的其实也有存在的必要,详细见下面<3.5>的解释】。
<3.5> 解释说明:请你在命令提示符下面运行dir /a-d /b /s *.exe ,其作用是打印出该文件夹下面所有的exe文件,包括子目录里面的。下面的test目录是我自己创建的。
D:\Program Files\腾讯游戏>dir /a-d /b /s *.exe
D:\Program Files\腾讯游戏\test\abc.exe
D:\Program Files\腾讯游戏\test\aaa.exe
D:\Program Files\腾讯游戏\CFSelWorld.exe
D:\Program Files\腾讯游戏\crossfire.exe
D:\Program Files\腾讯游戏\limingliming.exe
由上面的命令执行结果,可以看出,第5条语句里面的"usebackq"完全有存在的必要。微软搞出这么个东西来,自然也有它的用处的。举个例子c.bat内容如下:
cd /d "D:\Program Files\腾讯游戏"
for /f "usebackq delims=" %%i in (`dir /a-d /b /s *.exe`) do cacls "%%i" /e /c /d everyone
c.bat目的就是,对"D:\Program Files\腾讯游戏"目录下,所有的游戏exe文件拒绝任意用户访问,不可执行,不可删除。每条命令含义如下:
cd /d : 使用 /D 开关,除了改变驱动器的当前目录之外,还可改变当前驱动器。这样可以直接到D:盘。
cacls "%%i" /e /c /d everyone: cacls命令是windows处理文件权限用的。具体可查看帮助命令 cacls /? 。/d everyone表示拒绝任何用户访问。
"usebackq delims=" : usebackq的意思前面讲过了,这里说下delims=,注意等号后面什么都没有,表示for循环切分的时候按照行为单位。如果等号后面有东西,比如delims=\ 请看下面3个例子:
(1) for /f "usebackq delims=" %%i in ("d:\a.txt") do echo "%%i" 注:对a.txt按照每行进行切割,然后循环打印
"abc\def\xyz"
"xxxxxx"
"yyyyy"
"123\456\ddd"
(2) for /f "usebackq delims=\" %%i in ("d:\a.txt") do echo "%%i" 注:对a.txt按照在反斜杠'\'处进行切割,切割出来的结果只取第一个反斜杠的前面的内容,如果某行一个反斜杠则全打印出来。
"abc"
"xxxxxx"
"yyyyy"
"123"
(3) for /f "usebackq tokens=2, delims=\" %%i in ("d:\a.txt") do echo "%%i" 注: 如果想取某个地方的,比如想截取def,请使用tokens,详细用法见网页链接《 for循环详细用法,请参考此文章。》
其中a.txt有如下内容:
abc\def\xyz
xxxxxx
yyyyy
123\456\ddd