关于批处理for语句的学习以及遇到的问题
本篇文章用于简单记录for命令的简略学习之用,仅供参考~~
批处理for语句从入门到精通[20101225更新]
其实,认真看完这个帖子,基本对for语句了解的也差不多,只是运用熟练程度没那么好而已,所以有兴趣的同学可以好好的看一下,我也是找了很久才看到这篇帖子的。
这篇帖子已知错误的指出在这里可能有说明:
关于如何决定该使用 for /f 的哪种句式?
for /f %%i in (……) do (……) 语句有好几种变形语句,不同之处在于第一个括号里的内容:有的是用单引号括起来,有的是用双引号包住,有的不用任何符号包裹,具体格式为:
1、for /f %%i in (文件名) do (……)
2、for /f %%i in ('命令语句') do (……)
3、for /f %%i in ("字符串") do (……)
1、当你希望读取文本文件中的内容的话,第一个括号中不用任何符号包裹,应该使用的是第1条语句;
例如:你想显示test.txt中的内容,那么,就使用 for /f %%i in (test.txt) do echo %%i;
2、当你读取的是命令语句执行结果中的内容的话,第一个括号中的命令语句必须使用单引号包裹,应该使用的是第2条语句;
例如:你想显示当前目录下文件名中含有test字符串的文本文件的时候,应该使用 for /f %%i in ('dir /a-d /b *test*.txt') do echo %%i 这样的语句;
3、当你要处理的是一个字符串的时候,第一个括号中的内容必须用双引号括起来,应该是用的是第3条语句;
例如:当你想把 http:// bbs.bathome.net 这串字符中的点号换为短横线并显示出来的话,可以使用 for /f "delims=. tokens=1-3" %%i in (" http:// bbs.bathome.net ") do echo %%i-%%j-%%k 这样的语句。
很显然,第一个括号里是否需要用符号包裹起来,以及使用什么样的符号包裹,取决于要处理的对象属于什么类型:如果是文件,则无需包裹;如果是命令语句,则用单引号包裹;如果是字符串,则使用双引号括起来。
总结下来:for语句有6种句型:
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。
关于for /f解析文本,我所遇到的一些问题汇总:
特别注意:
1、如果我们截取的文本分隔符为引号时,需要按照如下书写:
大家如果有细心观察的话,都知道引号默认是不可以作为for /f delims的分割符的。但如果遇到了分割符是引号的话,就需要做特殊处理了。
引号作为for /f delims的分割符按照以下书写做转义处理:
例如:
@echo off
for /f tokens^=1*^ delims^=^" %%a in ("sd"z"vc") do echo %%b
pause
引号做分隔符有两种书写方式
for /f tokens^=1-3^ delims^=^"
for /f tokens^=1-3delims^=^"
大家仔细观察的话,都能看出来是tokens与delims语句之间有没有空格符做间隔这点不同而已, 有空格就需要加转义符号对空格做转义处理 。
关于tokens的简单介绍:
tokens=有时表示提取全部。
tokens=m表示提取第m列。
tokens=m,n表示提取第m列和第n列。
tokens=m-n表示提取第m列至第n列。
Tokens=*表示删除每行前面的空格。忽略行首的所有空格。
tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。
tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。
2、我们截取的文本使用分隔符分割时,分隔符前面有空格时,就无法正常分割了。
举个栗子:
批处理怎样把一行文本截取其中的文字变列?
我们把它复制到txt文本里。
则写成批处理为:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3,4 delims=|" %%a in (a.txt) do (
echo %%a^|%%d
echo %%b^|%%d
echo %%c^|%%d
)
pause
运行一下:
并没有实现目的,按照第一个帖子所写的,我们把|前面的空格也加进去做分隔符看看:
那我们把|后面的空格也加进去做分隔符,把前面的空格删掉再看看:
这时我们回过头来, 是不是分割符前面多的空格导致了最终的错误呢?我们姑且试试 :
我们 把文本内容的第一个空格删除掉 。
我们最终修改试试:
最后,总结起来:
就是我们选取的分割符的前面不能有空格,否则会导致输出错误。要想保证工整,分割符后面也最好不要有空格干扰。
就简单记录到这里,后面如果有遇到别的,会在这里继续补充。