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