前面章节中学习了 for 语句的基础知识和扩展语句。本章将介绍 usebackq 命令的用法。
usebackq 命令的功能和意义不是很明朗,据说是由机器自动添加进去的,因此它变得可有可无,我们写代码时可无,机器执行时可有。但可以肯定的是,启用该选项时,它会改变“FOR /F“解析文本的功能,集合内原有引号功能失效,因此需要变成新的引号。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或空格分隔符号。请注意,此 for 函数体的语句引用 %i 来获得第二个符号,引用 %j 来获得第三个符号,引用 %k 来获得第三个符号后的所有剩余符号。对于带有空格的文件名,你需要用双引号将文件名括起来。为了用这种方式来使用双引号,还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串。
%i 在 for 语句中显式声明,%j 和 %k 是通过tokens= 选项隐式声明的。可以通过 tokens= 一行指定最多 26 个符号,只要不试图声明一个高于字母 "z" 或"Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;而且,不能同时使用超过 52 个(a-zA-Z 等于 26+26)。
注意:如果将上面代码放到批处理脚本运行,需要将 %i 改成 %%i;因为在 CMD 窗口使用一个 %,而在批处理文件中需要使用两个%。
实例:演示文件名带有空格时,使用双引号和不使用双引号的区别。
@echo off REM 将抛出“系统找不到文件 test”错误 for /F "usebackq" %%a in (test text.txt) do ( echo %%a ) REM 正确 for /F "usebackq" %%a in ("test text.txt") do ( echo %%a ) pause
输出结果:
C:\Users\Administrator\Desktop\bat> test.bat 系统找不到文件 test。 姓名|年龄|成绩 张三|28|87 李四|32|92 赵六|30|78 请按任意键继续. . .
还可以在 for /F 语句中直接分析字符串,需要使用单引号将 file-set 括起来。这样,该字符串会被当做一个文件中的内容来进行解析。
实例:直接在 file-set 中使用单引号来解析字符串。
@echo off REM 解析失败 for /F "usebackq tokens=1-3" %%a in ("张三|28|87") do ( echo %%a ) REM 解析成功 for /F "usebackq tokens=1-3" %%a in ('张三 28 87') do ( echo %%a echo %%b echo %%c ) pause
输出结果:
C:\Users\Administrator\Desktop\bat> test.bat 系统找不到文件 张三|28|87。 张三 28 87 请按任意键继续. . .
最后,可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 file-set 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到内存中,并被当作文件分析。如以下例子所示:
@echo off FOR /F "usebackq delims==" %%i IN (`set`) DO ( echo %%i ) pause
会枚举当前环境中的环境变量名称。输出结果:
C:\Users\Administrator\Desktop\bat> test.bat ALLUSERSPROFILE APPDATA ChocolateyInstall ChocolateyLastPathUpdate CLASSPATH ... 省略 ... 请按任意键继续. . .
FOR 变量已被增强。你可以使用下列选项语法去增强 for 变量:
%~I 删除任何引号("),扩展 %I
%~fI 将 %I 扩展到一个完全合格的路径名
%~dI 仅将 %I 扩展到一个驱动器号
%~pI 仅将 %I 扩展到一个路径
%~nI 仅将 %I 扩展到一个文件名
%~xI 仅将 %I 扩展到一个文件扩展名
%~sI 扩展的路径只含有短名
%~aI 将 %I 扩展到文件的文件属性
%~tI 将 %I 扩展到文件的日期/时间
%~zI 将 %I 扩展到文件的大小
%~$PATH:I 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
可以组合修饰符来得到多重结果:
%~dpI 仅将 %I 扩展到一个驱动器号和路径
%~nxI 仅将 %I 扩展到一个文件名和扩展名
%~fsI 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I 搜索列在路径环境变量的目录,并将 %I 扩展到找到的第一个驱动器号和路径
%~ftzaI 将 %I 扩展到类似输出线路的 DIR
实例:获取每个文件的路径,文件名称,文件大小以及文件扩展名。
@echo off FOR %%i IN (*) DO ( echo PATH=%%~dpi NAME=%%~nxi SIZE=%%~zi EXT=%%~xi ) pause
输出结果:
C:\Users\Administrator\Desktop\bat> test.bat PATH=C:\Users\Administrator\Desktop\bat\ NAME=call.bat SIZE=0 EXT=.bat PATH=C:\Users\Administrator\Desktop\bat\ NAME=for.txt SIZE=4382 EXT=.txt PATH=C:\Users\Administrator\Desktop\bat\ NAME=hello.bat SIZE=25 EXT=.bat PATH=C:\Users\Administrator\Desktop\bat\ NAME=ping.txt SIZE=1323 EXT=.txt PATH=C:\Users\Administrator\Desktop\bat\ NAME=test.bat SIZE=98 EXT=.bat PATH=C:\Users\Administrator\Desktop\bat\ NAME=text_content.txt SIZE=50 EXT=.txt 请按任意键继续. . .