以前刚开始学FOR时写的,很白菜。但对USEBACKQ总结的还可以,送给新手。
(五)usebackq
一句话总结:注意引号用法。
该命令的功能和意义不是很明朗,据说是由机器自动添加进去的,因此它变得可有可无,我们写代码时可无,机器执行时可有。
但可以肯定的是,启用该选项时,它会改变“FOR /F“解析文本的功能,集合内原有引号功能失效,因此需要更变成新的引号。
1、 当集合中的文件名含有空格时使用双引号。
语法:
- FOR /F "usebackq" %%I IN (“FileNameSet”) DO Command2
复制代码
用法:
集合中的文件名或路径含有空格时,需要用双引号将两者括起来,保持文件名或路径的完整性,在FOR命令中使用"usebackq"显得必要。
集合中的文件名没有空格:
- @echo off
- For /f %%a in (C:\note.txt) do echo %%a
- pause>nul
复制代码
显示结果:
能正常读取文档note.txt里的内容。
集合中的文件名含有空格,无法读取文本note.txt里的内容:
- @echo off
- for /f %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
- pause>nul
复制代码
显示结果:
系统找不到文件C:\Documents。。
即使加上双引号也只是将其作为字符串显示:
- @echo off
- for /f %%a in (“C:\Documents and Settings\Administrator\桌面\note.txt”) do echo %%a
- pause>nul
复制代码
显示结果:
C:\Documents
使用"usebackq"但不加双引号,会找不到路径: - @echo off
-
- for /f "usebackq" %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
-
- pause>nul
复制代码
显示结果:
系统找不到文件 C:\Documents。。
正确的方式:使用"usebackq"并且在集合中用双引号将含有空格的文件名包含住。 - @echo off
-
- for /f "usebackq" %%a in ("C:\Documents and Settings\Administrator\桌面\note.txt") do echo %%a
-
- pause>nul
复制代码
显示结果:成功显示文档note.txt里的内容。
讲解:
这里所说的是文件名,如“note.txt”,是区别于后面所说的字符串的。
我的理解,字符串是集合里直接用于屏幕显示的语句,如“我爱北京天安门”,它不是用于执行命令的,也不同于文件名。
文件名用于代表指定的计算机文件,用于间接显示字符串和打开文件或命令的,如文件名“note.txt”它本身不直接显示在屏幕上,如果直接显示就是字符串,如果它的目的是打开文本里的信息那它是文件名。
当文件名或路径中间带有空格的时候,如“Documents and Settings”,应该使用usebackq和双引号。这是USEBACKQ最常用的地方。
2、当使用usebackq处理文字字符串时使用单引号。
格式: - FOR /F "usebackq" %%variable IN ('command') DO command [command-parameters]
复制代码
注意:
'command'使用的是“单引号”,区别于上面(`set`)的“后引号”
例: - @echo off
- for /f "usebackq delims=" %%a in ('甲兵时代') do echo.%%a
- pause>nul
复制代码
显示结果:
甲兵时代
讲解:
前面提到,字符串是用于直接屏幕显示的语句,显然“甲兵时代”被直接显示到屏幕上了。这里只是强调usebackq也可以显示字符串,而且使用单引号,不同于不用usebackq时使用的双引号。
不使用usebackq也可以显示字符串,例: - @echo off
- for /f "delims=" %%a in ("甲兵时代") do echo.%%a
- pause>nul
复制代码
显示结果同上
注意:不使用usebackq显示字符串时,字符串中有空格时必须用英文状态下的双引号。更多请阅读下一节的案例“伟大的中国人民万岁
万岁
万万岁”。
3、当集合内是可执行的命令时使用“后引号”。
语法: - FOR /F "usebackq" %%variable IN (`command`) DO command [command-parameters]
复制代码
注意:
后引号在键盘上ESC键的下面,“~”键。英文状态下轻按一下。
例: - @echo off
- For /f "usebackq delims=" %%i in (`dir`) do echo %%i
- Pause
复制代码
显示结果:
查询代码当前位置的文件。
讲解:
`dir`由于使用了usebackq和后引号,因此它表示命令执行,即括号内的`dir`是FOR以外的一个命令,它在DO后面的echo之前先执行了。
其实不使用usebackq一样可以达到以上效果,如:
- @echo off
- For /f "delims=" %%i in ('dir') do echo %%i
- Pause
复制代码
去掉usebackq之后,集合内的后引号改成单引号,运行结果与使用usebackq一致。
命令区别于文件名和字符串的地方是,命令是批处理中设定可以作用于其他命令、文件名和字符串执行相应任务的字母和标点符号。而文件名和字符串通常是被动地接受命令的安排的。因此,命令是早先设计好的,我们只是自由地组合它们而已。
4、总结
未使用usebackq和使用usebackq时集合内的符号比较:
| 未使用参数usebackq时:
| 使用参数usebackq时:
| 双引号””
| 表示字符串,即"string"。
| 当文件路径或名称中有空格时,用双引号括起来。
| 单引号’’
| 表示执行命令,即'command' 。
| 表示字符串,即'string' 。
| 后引号``
| (未研究)
| 表示命令执行,即`command`。
|
[ 本帖最后由 cjiabing 于 2010-10-6 11:44 编辑 ] |