DOS循环:bat/批处理for命令详解之二 (史上虽详尽的总结和说明~~)|Bat知识 Dos知识 TTTBLOG
2009-06-1645092
前言:
虽然以前对批处理也算有点研究,但一直对for命令理解不够透彻,偶尔用时也是照猫画虎的用一下。
虽然这是古董级的东西,但挺有意思的,而且有时用处也是蛮大的,所以,这次下决心研究一下,通过两个晚上的学习和测试,算是理解了90%了,很有成就感。
在这次学习过程中,我作了详细的总结和说明,在这里帖出来,供不明白的朋友参阅。自认为是写得比任何教程写得都明白,因为我是从不明白过来的,是结合自己从不理解到理解的过程写的,呕心沥血啊~~所以大胆地说是史上虽详尽的总结和说明~~
其实,这次学习主要是通过一位高手写的教程,再结合系统提供的帮助完成的。这个教程写得真的很不错,可惜忘了记下出处和作者了!刚才又在网上搜了一下,发现这篇教程到处都有转载,都找不到作者和原出处!实在感谢这位不知名的高手啊!
--TTT 200906160033
===
四、参数 /F (使用文件解析来处理命令输出、字符串及文件内容。)
---
这个参数是最难的,参数又多,先简单的解释一下:for命令带这个参数可以分析文件内容,字符串内容或某一命令输出的结果,并通过设置option得我们想要的结果。
以下是某高手的解释,感觉有点太专业了,自认为不太容易理解,也列一下:
[迭代及文件解析--使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。
请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。
默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。]
+++
格式:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN (^command^) DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN (^command^) DO command [command-parameters]
TTT说明:以上是WinXP系统中的帮助内容,你可以注意到,两者完全相同,这其实是系统的错误,第二段“如果有 usebackq 选项:”应该以下的内容:
FOR /F ["options"] %variable IN ("file-set") DO command [command-parameters]
FOR /F ["options"] %variable IN (^string^) DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters] --(`command`中的引号为反引号,是键盘上数字1左面的那个键)
+++
(TTT说明:下面是详细的解释,大部分是系统中的帮助内容,也有些错误(怪不得for命令这么难学),已经被我纠正了。)
1) OPTION关键字详解:
eol=c:指一个行注释字符的结尾(就一个)。例如:eol=; --忽略以分号打头的那些行;
skip=n:指在文件开始时忽略的行数。例如:skip=2 --忽略2行;
delims=xxx:指分隔符集。这个替换了空格和跳格键的默认分隔符集。例如:[delims=, ] --指定用逗号,空格对字符串进行分隔。
tokens=x,y,m-n:指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符是星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。例如:tokens=2,3* --将每行中的第二个和第三个符号传递给 for 程序体;tokens=2,3* ... i% --将会把取到的第二个字符串赋给i%,第三个赋给j%,剩下的赋给k%。
关于usebackq,不同版本的系统提示不同的帮助,不过都有助于理解,所以都摘抄如下:
(1),usebackq:使用后引号(键盘上数字1左面的那个键`)。未使用参数usebackq时:file-set表示文件,不能加引号,所以不能含有空格;加双引号表示字符串,即"string";加单引号表示执行命令,即^command^。使用参数usebackq时:file-set和"file-set"都表示文件,当文件路径或名称中有空格时,就可以用双引号括起来;单引号表示字符串,即^string^;后引号表示命令执行,即`command`。(此段是WinXP系统中的帮助)
(2),usebackq:指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串;并且一个单引号字符为文字字符串命令;并允许在filenameset中使用双引号扩起文件名称。
以上两条结合着看,其实已经可以明白了,我再说明一下:
其实这个参数的目的就是为了处理带有空格的文件名。如果您要处理的文件名和路径中含有空格,如果直接使用,会提示找不到文件。如果你用双引号将文件名和路径括起来。这时候将作为字符串处理,而不是作为文件了。为了应对这种情况,所以才增加了这个“usebackq”参数。如果使用了这个参数,对于括号中的加双引号的集合,系统就可以认为是文件了;真正的字符串要加单引号;命令要加反引号。
2) file-set 为一个或多个文件名。继续到 file-set 中的下一个文件之前,每份文件都已被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options"参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。
3) %i:专门在 for 语句中得到说明,%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号,只要不试图说明一个高于字母 ^z^ 或^Z^ 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,同时不能有 52 个以上都在使用中。
(TTT补充说明:
一般在tokens后只指定第一个参数,如%%i或%%a,在后面使用第二个及两个以上的参数,自动按顺序往下排即可。如前面指定的是%%a,后面则用%%b代表第二个结果,%%c代表第 三个结果。。。测试了一下tokens后指定多个变量名,没有测试成功,应该是不可以的。所以token后只能跟要使用的第一个变量名
如果使用的变量名超过了%z或%Z,就无法使用了,曾经以为会循环过来:如%%z后可以使用%%a或%%A,但经测试,这是不可以的。
如:for /f "tokens=1,2,3* delims=-, " %%y in ("aa bb,cc-dd ee") do echo %%y %%z %%A %%a --只会输出前两个字符串,后面的两个变量是无效的。)
+++
以下是系统提供的范例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k --
说明:会分析 myfile.txt 中的每一行,
eol=; --忽略以分号打头的那些行;
tokens=2,3* --将每行中的第二个和第三个符号传递给 for 程序体;
delims= , --用逗号和/或空格定界符号。
%i --这个 for 程序体的语句引用 %i 来取得取得的首个字符串(本例中为第二个符号),引用 %j 来取得第二个字符串(本例中为第三个符号)引用 %k来取得第三个符号后的所有剩余符号。
(TTT说明:上述例子和说明中明显的错误,%i应该换为%%i(帮助中有明确的说明:指定变量请使用 %%variable,而不要用 %variable,误导)
+++
TTT:下面列我做的几个例子:
1,分析文件的例子
FOR /F "eol=; tokens=1,2* delims=,- " %%i in (d: est.txt) do echo %%i %%j %%k
2,分析字符串的例子:
for /f "tokens=1,2,3* delims=-, " %%i in ("aa bb,cc-dd ee") do echo %%i %%j %%k %%l
3,分析命令输出的例子:
FOR /F "tokens=1* delims==" %%i IN (^set^) DO @echo [%%i----%%j]
如果使用了usebackq参数后,命令如下,结果与上面的完全相同。
1,分析文件的例子
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%i in ("d: est.txt") do echo %%i %%j %%k
2,分析字符串的例子:
for /f "usebackq tokens=1,2,3* delims=-, " %%i in (^aa bb,cc-dd ee^) do echo %%i %%j %%k %%l
3,分析命令输出的例子:(会枚举当前环境中的环境变量名称和值。)
FOR /F "usebackq tokens=1* delims==" %%i IN (`set`) DO @echo [%%i----%%j]
结果大家可以试一下,很容易就明白的。