Board logo

标题: FOR/F的选项usebackq的用法 [打印本页]

作者: cjiabing    时间: 2010-10-6 09:55     标题: FOR/F的选项usebackq的用法

以前刚开始学FOR时写的,很白菜。但对USEBACKQ总结的还可以,送给新手。


(五)usebackq


一句话总结:注意引号用法。


该命令的功能和意义不是很明朗,据说是由机器自动添加进去的,因此它变得可有可无,我们写代码时可无,机器执行时可有。


但可以肯定的是,启用该选项时,它会改变“FOR /F“解析文本的功能,集合内原有引号功能失效,因此需要更变成新的引号。



1 当集合中的文件名含有空格时使用双引号。


语法:


  1. FOR /F  "usebackq"  %%I  IN  (“FileNameSet”)  DO Command2
复制代码


用法:


集合中的文件名或路径含有空格时,需要用双引号将两者括起来,保持文件名或路径的完整性,在FOR命令中使用"usebackq"显得必要


集合中的文件名没有空格:


  1. @echo off
  2. For /f %%a in (C:\note.txt) do echo %%a
  3. pause>nul
复制代码

显示结果:

能正常读取文档note.txt里的内容。

集合中的文件名含有空格,无法读取文本note.txt里的内容:


  1. @echo off
  2. for /f %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
  3. pause>nul
复制代码

显示结果:

系统找不到文件C:\Documents。。

即使加上双引号也只是将其作为字符串显示:


  1. @echo off
  2. for /f %%a in (“C:\Documents and Settings\Administrator\桌面\note.txt”) do echo %%a
  3. pause>nul
复制代码

显示结果:

C:\Documents

使用"usebackq"但不加双引号,会找不到路径:

  1. @echo off
  2. for /f "usebackq" %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
  3. pause>nul
复制代码

显示结果:

系统找不到文件 C:\Documents。。

正确的方式:使用"usebackq"并且在集合中用双引号将含有空格的文件名包含住。

  1. @echo off
  2. for /f "usebackq" %%a in ("C:\Documents and Settings\Administrator\桌面\note.txt") do echo %%a
  3. pause>nul
复制代码

显示结果:成功显示文档note.txt里的内容。


讲解:


这里所说的是文件名,如“note.txt,是区别于后面所说的字符串的。

我的理解,字符串是集合里直接用于屏幕显示的语句,如“我爱北京天安门”,它不是用于执行命令的,也不同于文件名。


文件名用于代表指定的计算机文件,用于间接显示字符串和打开文件或命令的,如文件名“note.txt它本身不直接显示在屏幕上,如果直接显示就是字符串,如果它的目的是打开文本里的信息那它是文件名。


当文件名或路径中间带有空格的时候,如“Documents and Settings,应该使用usebackq和双引号。这是USEBACKQ最常用的地方。


2、当使用usebackq处理文字字符串时使用单引号。


格式:

  1. FOR /F "usebackq" %%variable IN ('command') DO command [command-parameters]
复制代码

注意:

'command'使用的是“单引号”,区别于上面(`set`)的“后引号”

:

  1. @echo off
  2. for /f "usebackq delims=" %%a in ('甲兵时代') do echo.%%a
  3. pause>nul
复制代码

显示结果:

甲兵时代

讲解:

前面提到,字符串是用于直接屏幕显示的语句,显然“甲兵时代被直接显示到屏幕上了。这里只是强调usebackq也可以显示字符串,而且使用单引号,不同于不用usebackq时使用的双引号。

不使用usebackq也可以显示字符串,例:

  1. @echo off
  2. for /f "delims=" %%a in ("甲兵时代") do echo.%%a
  3. pause>nul
复制代码

显示结果同上

注意:不使用usebackq显示字符串时,字符串中有空格时必须用英文状态下的双引号。更多请阅读下一节的案例“伟大的中国人民万岁
万岁
万万岁”。


3、当集合内是可执行的命令时使用“后引号”。


语法:

  1. FOR /F "usebackq" %%variable IN (`command`) DO command [command-parameters]
复制代码

注意:

后引号在键盘上ESC键的下面,“~键。英文状态下轻按一下。


例:

  1. @echo off
  2. For /f "usebackq delims=" %%i  in  (`dir`) do echo %%i
  3. Pause
复制代码

显示结果:
查询代码当前位置的文件。
讲解:
`dir`由于使用了usebackq和后引号,因此它表示命令执行,即括号内的`dir`是FOR以外的一个命令,它在DO后面的echo之前先执行了。

其实不使用usebackq一样可以达到以上效果,如:
  1. @echo off
  2. For /f "delims=" %%i in ('dir') do echo %%i
  3. Pause
复制代码

去掉usebackq之后,集合内的后引号改成单引号,运行结果与使用usebackq一致。

命令区别于文件名和字符串的地方是,命令是批处理中设定可以作用于其他命令、文件名和字符串执行相应任务的字母和标点符号。而文件名和字符串通常是被动地接受命令的安排的。因此,命令是早先设计好的,我们只是自由地组合它们而已。


4、总结


未使用usebackq和使用usebackq时集合内的符号比较:



未使用参数usebackq时:


使用参数usebackq时:


双引号””


表示字符串,即"string"


当文件路径或名称中有空格时,用双引号括起来。


单引号’’


表示执行命令,即'command'


表示字符串,即'string'


后引号``


(未研究)


表示命令执行,即`command`




[ 本帖最后由 cjiabing 于 2010-10-6 11:44 编辑 ]
作者: wc726842270    时间: 2010-10-6 10:41     标题: 回复 1楼 的帖子

我怎么看你的总结有点乱啊
集合不是指“文件”“字符串”“命令”么,使用符号作为第一列很难写啊
作者: Batcher    时间: 2010-10-6 11:38

为了便于记忆,我的建议是,初学者只学会第一种情况即可,其它时候一律不要使用usebackq,呵呵。
作者: cjiabing    时间: 2010-10-6 11:47     标题: 回复 2楼 的帖子

初学FOR的时候写的,难免表达不清的嘛,不过现在我也不懂如何说清楚。
集合是指文件名、字符串和命令,但在使用 usebackq 时需要明确区分,因此这里并非很乱。
作者: cjiabing    时间: 2010-10-6 11:50     标题: 回复 3楼 的帖子

谢谢大大指点!~
其实,用到 usebackq 的情况一般只有第一种,也只有这时才会想起它。另外两种一般在代码无法执行的情况下尝试。
“它会改变“FOR /F“解析文本的功能”,这句是个关键,因为由此可能获悉 usebackq 设计的初衷,但我无法透析……
比如,一般情况下使用双引号处理带空格的文件路径名,在一般的 FOR /F 中使用双引号处理字符串,但在这里只限定双引号是处理带空格的文件路径名。
一般情况下 FOR /F 中使用单引号的是命令,但这里它却被指定为处理字符串。
……
因此说 usebackq 改变了for中原来一些引号的功能……并且该选项的英文名字有点特别……

[ 本帖最后由 cjiabing 于 2010-10-6 11:56 编辑 ]
作者: lxzzr    时间: 2010-10-6 21:10

usebackq还是少用
作者: wxyz0001    时间: 2018-11-19 01:34

回复 3# Batcher


    建议很好,确实一般只用到第一种




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2