批处理学习14(for的使用-3)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

批处理学习14(for的使用-3)
For /F 文件解析的基本语法
语法
for/F["ParsingKeywords"] {%%| %}variable in (set)do command [CommandLineOptions]
使用文件解析过程处理命令输出、字符串和文件内容。

使用迭代变量定义要检查的内容或字符串,以及使用各种ParsingKeywords选项进一步修改解析方式。

使用ParsingKeywords令牌选项指定哪些令牌应该传递为迭代程序变量。

注意:在没有使用令牌选项时,/F将仅检查第一个令牌。

文件解析过程包括读取输出、字符串或文件内容、分成独立的文本行及然后将每行解析成零个或更多个令牌。

然后通过设置为令牌的迭代程序变量值,调用for循环。

默认情况下,/F传递每个文件每一行的第一个空白分隔符号。

跳过空行。

语法的不同点为:
扩展语法1:(根据set的不同情况)
1.for/F["ParsingKeywords"] {%%| %}variable in (filenameset)do command [CommandLineOptions]
2.for/F["ParsingKeywords"] {%%| %}variable in ("LiteralString")do command [CommandLineOptions]
3.for/F["ParsingKeywords"] {%%| %}variable in ('command')do command [CommandLineOptions]
扩展语法2,使用 usebackq :(根据set的不同情况)
1.for/F ["usebackq ParsingKeywords"] {%% | %}variable in ("filenameset")do command [CommandLineOptions]
2.for/F ["usebackq ParsingKeywords"] {%% | %}variable in ('LiteralString')do command [CommandLineOptions]
3.for/F ["usebackq ParsingKeywords"] {%% | %}variable in (`command`)do command [CommandLineOptions]
在这里,filenameset为文件名类 set ,LiteralString为字符串类 set ,command为命令类 set 。

filenameset参数指定一个或多个文件名称。

在继续到filenameset中的下一个文件之前,每个文件都会被打开、读取和处理。

要覆盖默认解析行为,指定"ParsingKeywords"。

这是一个引用字符串,它包含一个或多个关键字以指定不同的解析选项。

下表列出可以用于ParsingKeywords的解析关键字。

千万别被上面的语法吓到,为什么?因为语法的核心是“for/F ["ParsingKeywords"] {%%| %}variable in (set)do command [CommandLineOptions] ”。

我们先来看一个简单的示例:
在这里,for /l %%i in (1 1 15) do >>hanyeguxing.txt echo %%i向文件hanyeguxing.txt输出数列1-15,然后for /f %%i in (hanyeguxing.txt) do echo %%i读取、解析并显示这个文件的内容,最后del /q hanyeguxing.txt删除这个临时文件。

我们先看一个示例:
外层的for /l %%i in (1 1 9) do (用来构建生成行变量%%i,内层的for /l %%j in (1 1 5) do set /p=第%%i行第%%j列 <nul用来构建生成列变量%%j,并不换行的显示所有行列。

echo.用来确保每行都会在行尾被换行。

>>Hanyeguxing.txt将所有结果输出到文件Hanyeguxing.txt。

最后的结果如下:
现在,我们来看一下for /f是如何解析这个文本的,如下示例:
在这里,tokens=1,2,3,4,5就是ParsingKeywords的解析关键字,指定将哪些令牌从每行传递到每个迭代的for正文。

我们先看第一个问题,分隔符。

在for /f 中,在以下几个位置中存在分隔符,但他们的作用和默认值是不同的。

1.ParsingKeywords的解析关键字之间使用空格等分隔,默认为空格。

2.tokens=x,y,m-n中,令牌之间使用英文逗号,分隔,默认为,。

3.(set)内部,使用空格和英文逗号,分隔,默认为,或空格。

4.delims=xxx中,指定定界符集合。

这将替换空格和制表符的默认分隔符集。

5.eol=c中,指定行首字符(只一个字符),这将替换英文分号;的默认分隔符集。

在本示例中,因为没有指定delims=xxx,所以使用空格和制表符的默认分隔符集。

我们在输出文件set /p=第%%i行第%%j列 <nul 时,行中间使用空格做分隔符。

当for /f 解析时,以空格作为分隔符,分隔成若干区段,第一区段为令牌1,第二区段为令牌2,以此类推。

因为在tokens=1,2,3,4,5中,指定了令牌的迭代顺序,即将第一个令牌赋给给第一个变量,第二个令牌赋给给第二个变量,以此扩展。

在for /f "tokens=1,2,3,4,5" %%a in (Hanyeguxing.txt) do中,我们设定第一个变量为%%a,那么按照字母顺序,扩展的变量依次为%%b %%c %%d %%e。

所以,最终,第一个区段就成了%%a的值,第二个区段就成了%%b的值,依此扩展。

这里有3个问题需要注意:
1.在for /f解析文件时,将忽略文件中的空行。

2.区段的分隔符,不在for /f本体变量中出现(不使用*的情况下)。

3.for /f最多可以处理31个区段。

我们看下面的示例:
这个时候,1-3表示一个连续的令牌集,等效为1,2,3,赋值的变量依次为%%a %%b %%c。

*表示将分配附加的变量,并在解析的最后一个令牌后在行上接收剩余的文本,即赋值给变量%%d。

有3个问题需要注意:
1.*必须是tokens=1-3,*中的最后一个字符。

2.*不必非得与前面的数字用英文逗号分隔,例如tokens=1,3*等效为tokens=1,3,*。

3.*所指定的变量接收的值中,是有区段分隔符的。

根据这一特点,我们有了另一个显示区段分隔符的方法。

这个问题,在我们讲到delims=xxx时,将再次提到。

我们看下面的示例:
最终,运行后显示了寒夜孤星和初学者,但没有显示;测试,为什么呢?我们现在来说一下ParsingKeywords中的eol=c中,指
定行首字符(只一个字符),这将替换英文分号;的默认分隔符集。

换个说法:即通过eol=来设置一个行首字符,那么 for /f 在解析这个文件时将会忽略所有以这个字符开头的行。

有几个问题需要注意:
1.即使没有设置eol=,但默认是启用了英文分号;作为行首忽略的检测字符的。

这就是为什么示例25中不显示;测试的原因。

2.如果想要不使用任何字符作行首忽略字符,需要设置eol=为空。

这点与delims=很相似的。

如下示例26:
4.因为在ParsingKeywords中,英文引号是用来括ParsingKeywords的,所以英文引号是不能作为delims= 分隔符的。

5.如果设置任意字符为行首符,则英文分号不再做为默认符使用。

6.eol=只能设置一个字符。

微软是这样说的,那么按照逻辑,因为是一个字符,所以不能是汉字。

但是,在实际使用过程中,是可以使用汉字的。

如下示例27:
但是,这里有一个很重要的问题需要明确!。

相关文档
最新文档