转载请注明连接。
一、概述
for命令开关有很多,/L,/F,/R。这里仅对含有/F的for进行分析,这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。
1.命令格式:
(1).FOR /F ["options"] %%i IN (file) DO command
(2).FOR /F ["options"] %%i IN ("string") DO command--注意双引号
(3).FOR /F ["options"] %%i IN ('command') DO command--注意单引号
2.参数说明:
file代表一个或多个文件,可以使用通配符。
string 代表字符串
command代表命令
["options"]选项有多个:
二、详细介绍
1.FOR /F %%i IN (file) DO command
怎么遍历文件中的内容呢?下面的语句可以:
for /f %%i in (d:\out.txt) do echo %%i
执行过程:for会先打开out.txt,然后读出out.txt里面的所有内容,把它作为一个集合,并且以每一行(文件中无分隔符情况下)作为一个元素,用%%i依次代替每个元素,然后执行do后面的命令。
for /f会默认以每一行(无分隔符)来作为一个元素,但是有分隔符怎么办?假如out.txt内容变成如下:
那么for /f %%i in (d:\out.txt) do echo %%i就无法将所有的内容显示出来。显示结果如下:
因为命令默认是以空格和TAB为分隔符,所以它遇到分割符之后,默认只取第一个,就将分割符后面的都丢掉了。
如果我们还想把每一行再分解更小的内容,该怎么办呢?for命令提供了更多的参数,它们就是:delims和tokens
delims :告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
比如,我们执行下面的命令:
for /f "delims= " %%i in (d:\out.txt) do echo %%i
显示的结果:
第1行第1列
第2行第1列
第3行第1列
这个命令和for /f %%i in (d:\out.txt) do echo %%i的效果是一样的。
如果我们想要每一行的后面的元素,那又如何呢?这个时候就可以利用tokens参数,它的作用就是当你通过delims将每一行分为更小的元素时,由tokens来控制要取哪一个或哪几个。
还是上面的例子,执行如下命令:
for /f "tokens=2 delims= " %%i in (d:\out.txt) do echo %%i
执行结果:
第1行第2列
第2行第2列
第3行第2列
如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,全部显示则使用通配符tokens=*。
注意:如果显示多个元素(非*),比如这里的tokens=2-3,语句应该写成这样:
for /f "tokens=2,3 delims= " %%i in (d:\out.txt) do echo %%i %%j
怎么多出一个%%j?
这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j。
执行结果为:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
又如下面语句:
for /f "tokens=2,* delims= " %%i in (d:\out.txt) do echo %%i %%j
它显示从第二列到最后的一列,执行结果为:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
用%%i代替第二列,用%%j代替剩余的所有。
最后还有skip,eol和usebackq。
skip就是要忽略文件的前多少行,eol用来指定当一行以什么符号开始时,就忽略它。比如:
for /f "skip=2 tokens=*" %%i in (d:\out.txt) do echo %%i
结果为:
第3行第1列 第3行第2列 第3行第3列
用skip来告诉for跳过前两行。
再如,当out.txt内容变成:
#第1行第1列 第1行第2列 第1行第3列
#第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
for /f "eol=# tokens=*" %%i in (d:\out.txt) do echo %%i
结果是:
第3行第1列 第3行第2列 第3行第3列
用eol来告诉for忽略以“.”开头的行。
usebackq就是反转的意思,他把字符串("out.txt")当做文件,或者把命令('command')当做字符串。
例如:
for /f "usebackq eol=# tokens=*" %%i in ("d:\out.txt") do echo %%i
结果是:
第3行第1列 第3行第2列 第3行第3列
如果不加usebackq,则"d:\out.txt"会被当成字符串。
又例如:
for /f "usebackq tokens=*" %%i in ('echo helloworld!') do echo %%i
结果:
echo helloworld,这里命令被当成了字符串。
如果没有usebackq
for /f "tokens=*" %%i in ('echo helloworld!') do echo %%i
结果:
helloworld!
2.FOR /F ["options"] %%i IN ("string") DO command
例子:
for /f "tokens=2,* delims= " %%i in ("this is an example!") do echo %%i %%j
结果:
is an example!
对于字符串的处理类似于文件的处理,此处不再赘述。
3.FOR /F ["options"] %%i IN ('command') DO command