添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于批处理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条语句;

例如:当你想把 bbs.bathome.net 这串字符中的点号换为短横线并显示出来的话,可以使用 for /f "delims=. tokens=1-3" %%i in (" 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


运行一下:

并没有实现目的,按照第一个帖子所写的,我们把|前面的空格也加进去做分隔符看看:



那我们把|后面的空格也加进去做分隔符,把前面的空格删掉再看看:



这时我们回过头来, 是不是分割符前面多的空格导致了最终的错误呢?我们姑且试试

我们 把文本内容的第一个空格删除掉



我们最终修改试试:



最后,总结起来:

就是我们选取的分割符的前面不能有空格,否则会导致输出错误。要想保证工整,分割符后面也最好不要有空格干扰。


就简单记录到这里,后面如果有遇到别的,会在这里继续补充。

编辑于 2021-04-09 23:20

文章被以下专栏收录