批处理之家's Archiver

cjiabing 发表于 2010-10-6 09:55

FOR/F的选项usebackq的用法

[align=left][b][font=宋体][size=12pt]以前刚开始学FOR时写的,很白菜。但对USEBACKQ总结的还可以,送给新手。[/size][/font][/b][/align]
[align=left][b][font=宋体][size=12pt](五)[/size][/font][/b][font=Times New Roman][b][size=12pt]usebackq[/size][/b][font=宋体][size=12pt][/size][/font][/font][/align]
[align=left][font=宋体][size=12pt]一句话总结:注意引号用法。[/size][/font][/align]
[align=left][font=宋体][size=12pt]该命令的功能和意义不是很明朗,据说是由机器自动添加进去的,因此它变得可有可无,我们写代码时可无,机器执行时可有。[/size][/font][/align]
[align=left][font=宋体][size=12pt]但可以肯定的是,启用该选项时,它会改变“FOR /F“解析文本的功能,集合内原有引号功能失效,因此需要更变成新的引号。[/size][/font][/align][align=left][font=宋体][size=3][/size][/font][/align]
[align=left][font=宋体][size=12pt][/size][/font][/align]
[align=left][b][size=12pt][font=Times New Roman]1[/font][/size][/b][b][font=宋体][size=12pt]、[/size][/font][/b][b][size=7pt][font=Times New Roman] [/font][/size][/b][b][font=宋体][size=12pt]当集合中的文件名[/size][/font][/b][b][font=宋体][size=12pt]含有空格时使用双引号。[/size][/font][/b][font=宋体][size=12pt][/size][/font][/align]
[align=left][font=宋体][size=12pt]语法:[/size][/font][/align]
[align=left][font=Times New Roman][size=12pt][/size][font=宋体][size=12pt][code]FOR /F  "usebackq"  %%I  IN  (“FileNameSet”)  DO Command2[/code][/size][/font][/font][/align]
[align=left][font=宋体][size=12pt]用法:[/size][/font][/align]
[align=left][font=宋体][size=12pt]集合中的文件名或路径含有空格时,需要用双引号将两者括起来,保持文件名或路径的完整性,在FOR命令中使用[/size][/font][size=12pt][font=Times New Roman]"usebackq"[/font][/size][font=宋体][size=12pt]显得必要[/size][/font][font=宋体][size=12pt]。[/size][/font][/align][align=left][font=宋体][size=3][/size][/font][/align]
[align=left][font=宋体][size=12pt]集合中的文件名没有空格:[/size][/font][/align]
[align=left][font=Times New Roman][size=12pt][/size][font=宋体][size=12pt][/size][/font][/font][/align][code]@echo off
For /f %%a in (C:\note.txt) do echo %%a
pause>nul[/code]
[align=left][font=宋体][size=12pt]显示结果:[/size][/font]
[/align][align=left][font=宋体][size=12pt]能正常读取文档[/size][/font][size=12pt][font=Times New Roman]note.txt[/font][/size][font=宋体][size=12pt]里的内容。[/size][/font]
[/align][align=left][font=宋体][size=12pt]集合中的文件名含有空格,无法读取文本[/size][/font][size=12pt][font=Times New Roman]note.txt[/font][/size][font=宋体][size=12pt]里的内容:[/size][/font][/align][align=left][font=宋体][size=3][/size][/font][/align]
[align=left][font=Times New Roman][size=12pt][/size][font=宋体][size=12pt][/size][/font][/font][/align][code]@echo off
for /f %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a
pause>nul[/code]
[align=left][font=宋体][size=12pt]显示结果:[/size][/font]
[/align][align=left][font=宋体][size=12pt]系统找不到文件[/size][/font][size=12pt][font=Times New Roman]C:\Documents[/font][/size][font=宋体][size=12pt]。。[/size][/font]
[/align][align=left][font=宋体][size=12pt]即使加上双引号也只是将其作为字符串显示:[/size][/font][/align]
[align=left][font=Times New Roman][size=12pt][/size][font=宋体][size=12pt][/size][/font][/font][/align][code]@echo off
for /f %%a in (“C:\Documents and Settings\Administrator\桌面\note.txt”) do echo %%a
pause>nul[/code]
[align=left][font=宋体][size=12pt]显示结果:[/size][/font]
[/align][align=left][font=Times New Roman][size=12pt]C:\Documents[/size][/font]
[/align][align=left][font=宋体][size=12pt]使用[/size][/font][size=12pt][font=Times New Roman]"usebackq"[/font][/size][font=宋体][size=12pt]但不加双引号,会找不到路径:[/size][/font][/align][code]@echo off

for /f "usebackq" %%a in (C:\Documents and Settings\Administrator\桌面\note.txt) do echo %%a

pause>nul[/code][align=left][font=宋体][size=12pt]显示结果:[/size][/font]
[/align][align=left][font=宋体][size=12pt]系统找不到文件[/size][/font][size=12pt][font=Times New Roman] C:\Documents[/font][/size][font=宋体][size=12pt]。。[/size][/font]
[/align][align=left][font=宋体][size=12pt]正确的方式:使用[/size][/font][size=12pt][font=Times New Roman]"usebackq"[/font][/size][font=宋体][size=12pt]并且在集合中用双引号将含有空格的文件名包含住。[/size][/font][/align][code]@echo off

for /f "usebackq" %%a in ("C:\Documents and Settings\Administrator\桌面\note.txt") do echo %%a

pause>nul[/code][align=left][font=宋体][size=12pt]显示结果:成功显示文档[/size][/font][size=12pt][font=Times New Roman]note.txt[/font][/size][font=宋体][size=12pt]里的内容。[/size][/font][/align][align=left][font=宋体][size=3][/size][/font][/align]
[align=left][font=宋体][size=12pt]讲解:[/size][/font][/align]
[align=left][font=宋体][size=12pt]这里所说的是文件名,如“[/size][/font][size=12pt][font=Times New Roman]note.txt[/font][/size][font=宋体][size=12pt]”[/size][/font][font=宋体][size=12pt],是区别于后面所说的字符串的。[/size][/font]
[/align][align=left][font=宋体][size=12pt]我的理解,字符串是集合里直接用于屏幕显示的语句,如“我爱北京天安门”,它不是用于执行命令的,也不同于文件名。[/size][/font][/align]
[align=left][font=宋体][size=12pt][font=宋体][size=12pt]文件名用于代表指定的计算机文件,[/size][/font]用于间接显示字符串和打开文件或命令的,如文件名“[/size][/font][size=12pt][font=Times New Roman]note.txt[/font][/size][font=宋体][size=12pt]”[/size][/font][font=宋体][size=12pt]它本身不直接显示在屏幕上,如果直接显示就是字符串,如果它的目的是打开文本里的信息那它是文件名。[/size][/font][/align]
[align=left][font=宋体][size=12pt]当文件名或路径中间带有空格的时候,如“[/size][/font][size=12pt][font=Times New Roman]Documents and Settings[/font][/size][font=宋体][size=12pt]”[/size][/font][font=宋体][size=12pt],应该使用[/size][/font][size=12pt][font=Times New Roman]usebackq[/font][/size][font=宋体][size=12pt]和双引号。这是USEBACKQ最常用的地方。[/size][/font][/align][align=left][font=宋体][size=3][/size][/font][/align]
[size=12pt][font=Times New Roman][align=left][b]2、当使用usebackq处理文字字符串时使用单引号。[font=宋体][size=12pt][/size][/font][/b][/align]
[align=left][font=宋体][size=12pt]格式:[/size][/font][/align][code]FOR /F "usebackq" %%variable IN ('command') DO command [command-parameters][/code][align=left][font=宋体][size=12pt]注意:[/size][/font]
[/align][align=left][size=12pt]'command'[/size][font=宋体][size=12pt]使用的是“单引号”,区别于上面[/size][/font][size=12pt](`set`)[/size][font=宋体][size=12pt]的“后引号”[/size][/font]
[/align][align=left][font=宋体][size=12pt]例[/size][/font][size=12pt]:[/size][font=宋体][size=12pt][/size][/font][/align][code]@echo off
for /f "usebackq delims=" %%a in ('甲兵时代') do echo.%%a
pause>nul[/code][align=left][font=宋体][size=12pt]显示结果:[/size][/font]
[/align][align=left][size=12pt]甲兵时代[/size]

[/align][align=left][font=宋体][size=12pt]讲解:[/size][/font]
[/align][align=left][font=宋体][size=12pt]前面提到,字符串是用于直接屏幕显示的语句,显然“[/size][/font][font=宋体][size=12pt]甲兵时代[/size][/font][font=宋体][size=12pt]”[/size][/font][font=宋体][size=12pt]被直接显示到屏幕上了。这里只是强调[/size][/font][size=12pt]usebackq[/size][font=宋体][size=12pt]也可以显示字符串,而且使用单引号,不同于不用[/size][/font][size=12pt]usebackq[/size][font=宋体][size=12pt]时使用的双引号。[/size][/font]
[/align][align=left][font=宋体][size=12pt]不使用[/size][/font][size=12pt]usebackq[/size][font=宋体][size=12pt]也可以显示字符串,例:[/size][/font][/align][align=left][font=宋体][/font][/align][code]@echo off
for /f "delims=" %%a in ("甲兵时代") do echo.%%a
pause>nul[/code][align=left][font=宋体][size=12pt]显示结果同上[/size][/font]
[/align][align=left][font=宋体][size=12pt]注意:不使用[/size][/font][size=12pt]usebackq[/size][font=宋体][size=12pt]显示字符串时,字符串中有空格时必须用英文状态下的双引号。更多请阅读下一节的案例“伟大的中国人民万岁[/size][/font]
[font=宋体][size=12pt]万岁[/size][/font]
[font=宋体][size=12pt]万万岁”。[/size][/font]
[/align][align=left]
[/font][/size][b][size=12pt][font=Times New Roman]3[/font][/size][/b][b][font=宋体][size=12pt]、当集合内是可执行的命令时使用“后引号”。[/size][/font][/b][font=宋体][size=12pt][/size][/font][/align]
[align=left][font=宋体][size=12pt]语法:[/size][/font][/align][code]FOR /F "usebackq" %%variable IN (`command`) DO command [command-parameters] [/code][align=left][font=宋体][size=12pt]注意:[/size][/font]
[/align][align=left][font=宋体][size=12pt]后引号在键盘上[/size][/font][size=12pt][font=Times New Roman]ESC[/font][/size][font=宋体][size=12pt]键的下面,“[/size][/font][size=12pt][font=Times New Roman]~[/font][/size][font=宋体][size=12pt]”[/size][/font][font=宋体][size=12pt]键。英文状态下轻按一下。[/size][/font][/align][align=left][font=宋体][size=3][/size][/font][/align]
[align=left][font=宋体][size=12pt]例:[/size][/font][/align][code]@echo off
For /f "usebackq delims=" %%i  in  (`dir`) do echo %%i
Pause[/code]
显示结果:
查询代码当前位置的文件。
讲解:
`dir`由于使用了usebackq和后引号,因此它表示命令执行,即括号内的`dir`是FOR以外的一个命令,它在DO后面的echo之前先执行了。

其实不使用usebackq一样可以达到以上效果,如:
[code]@echo off
For /f "delims=" %%i in ('dir') do echo %%i
Pause[/code][align=left][font=宋体][size=12pt]去掉usebackq之后,集合内的后引号改成单引号,运行结果与使用usebackq一致。[/size][/font]
[/align][align=left][font=宋体][size=12pt]命令区别于文件名和字符串的地方是,命令是批处理中设定可以作用于其他命令、文件名和字符串执行相应任务的字母和标点符号。而文件名和字符串通常是被动地接受命令的安排的。因此,命令是早先设计好的,我们只是自由地组合它们而已。[/size][/font]
[/align][align=left][font=宋体][size=12pt][/size][/font][/align]
[align=left][b][font=宋体][size=12pt]4[/size][/font][/b][b][font=宋体][size=12pt]、总结[/size][/font][/b][/align]
[align=left][font=宋体][size=12pt]未使用[/size][/font][size=12pt][font=Times New Roman]usebackq[/font][/size][font=宋体][size=12pt]和使用[/size][/font][size=12pt][font=Times New Roman]usebackq[/font][/size][font=宋体][size=12pt]时集合内的符号比较:[/size][/font][/align]
[table][tr][td=1,1,70][align=left][font=宋体][size=12pt][/size][/font][/align]
[/td][td=1,1,231][align=left][font=宋体][size=12pt]未使用参数[/size][/font][size=12pt][font=Times New Roman]usebackq[/font][/size][font=宋体][size=12pt]时:[/size][/font][/align]
[/td][td=1,1,267][align=left][font=宋体][size=12pt]使用参数[/size][/font][size=12pt][font=Times New Roman]usebackq[/font][/size][font=宋体][size=12pt]时:[/size][/font][/align]
[/td][/tr][tr][td=1,1,70][align=left][font=宋体][size=12pt]双引号[/size][/font][font=Times New Roman][size=12pt]””[/size][font=宋体][size=12pt][/size][/font][/font][/align]
[/td][td=1,1,231][align=left][font=宋体][size=12pt]表示字符串,即[/size][/font][size=12pt][font=Times New Roman]"string"[/font][/size][font=宋体][size=12pt]。[/size][/font][/align]
[/td][td=1,1,267][align=left][font=宋体][size=12pt]当文件路径或名称中有空格时,用双引号括起来。[/size][/font][/align]
[/td][/tr][tr][td=1,1,70][align=left][font=宋体][size=12pt]单引号[/size][/font][font=Times New Roman][size=12pt]’’[/size][font=宋体][size=12pt][/size][/font][/font][/align]
[/td][td=1,1,231][align=left][font=宋体][size=12pt]表示执行命令,即[/size][/font][size=12pt][font=Times New Roman]'command' [/font][/size][font=宋体][size=12pt]。[/size][/font][/align]
[/td][td=1,1,267][align=left][font=宋体][size=12pt]表示字符串,即[/size][/font][size=12pt][font=Times New Roman]'string' [/font][/size][font=宋体][size=12pt]。[/size][/font][/align]
[/td][/tr][tr][td=1,1,70][align=left][font=宋体][size=12pt]后引号[/size][/font][font=Times New Roman][size=12pt]``[/size][font=宋体][size=12pt][/size][/font][/font][/align]
[/td][td=1,1,231][align=left][font=宋体][size=12pt](未研究)[/size][/font][/align]
[/td][td=1,1,267][align=left][font=宋体][size=12pt]表示命令执行,即[/size][/font][size=12pt][font=Times New Roman]`command`[/font][/size][font=宋体][size=12pt]。[/size][/font][/align]
[/td][/tr][/table][align=left][font=宋体][size=12pt][/size][/font][/align]

[[i] 本帖最后由 cjiabing 于 2010-10-6 11:44 编辑 [/i]]

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中原来一些引号的功能……并且该选项的英文名字有点特别……

[[i] 本帖最后由 cjiabing 于 2010-10-6 11:56 编辑 [/i]]

lxzzr 发表于 2010-10-6 21:10

usebackq还是少用

wxyz0001 发表于 2018-11-19 01:34

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=61627&ptid=9512]3#[/url] [i]Batcher[/i] [/b]


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

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.