for /F 的 usebackq 选项

前面章节中学习了 for 语句的基础知识和扩展语句。本章将介绍 usebackq 命令的用法。

usebackq 命令的功能和意义不是很明朗,据说是由机器自动添加进去的,因此它变得可有可无,我们写代码时可无,机器执行时可有。但可以肯定的是,启用该选项时,它会改变“FOR /F“解析文本的功能,集合内原有引号功能失效,因此需要变成新的引号。

usebackq 处理有空格的文件名

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
请按任意键继续. . .

usebackq 处理文本字符串

还可以在 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
请按任意键继续. . .

usebackq处理 CMD 命令

最后,可以用 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 变量已被增强。你可以使用下列选项语法去增强 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
请按任意键继续. . .
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号