中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 自己总结关于FOR /F中usebackq的用法
« [1] [2] »
作者:
标题: 自己总结关于FOR /F中usebackq的用法 取消高亮 | 上一主题 | 下一主题
tianlijian
初级用户





积分 120
发帖 45
注册 2007-3-13
状态 离线
『楼 主』:  自己总结关于FOR /F中usebackq的用法

先声明一下以下文章,是个人查找一些相关资料后自己总结出来的,由于自己刚学dos不久,所以文中的观点并不全正确,希望大家能够希望大家能够不吝赐教。                        by-無名氏
先来说一下我cmd的当前目录中放有

      
  • ab.txt(里面写着file:ab.txt)
      
  • a b.txt(里面写着b.txtfile:a (space) b.txt)


看的时候大家注意IN 后面括号中的文字。

首先我们来看看,for中不采用usebackq时的情况。
实验一:
@FOR /F "tokens=*"  %i IN (ab.txt) DO @ECHO %i
    结果:file:ab.txt
实验二:
@FOR /F "tokens=*"  %i IN (a b.txt) DO @ECHO %i
    结果:系统找不到文件 a。
总结:(IN后面的,下同)括号中的文字不加东西(这里的东西指双引号,单引号,还有back quoted。关于back quoted我将在下面说明)时,指的是文件,但文件中不能有空格,否则就会出错。
实验三:
@FOR /F "tokens=*" %i IN ('ECHO Hello') DO @ECHO %i
    结果:Hello
总结:这里结果是hello表示这里的ECHO应该是当作一个命令来执行的,即把ECHO Hello的结果传给%i
实验四:
@FOR /F "tokens=*" %i IN ("ECHO Hello") DO @ECHO %i
    结果:ECHO Hello
总结:这个结果的ECHO Hello,表明这里的echo 不是当作dos中的命令来处理,而是当作字符来处理。
实验五:
@FOR /F "tokens=*" %i IN (`ECHO Hello`) DO @ECHO %i
    结果:系统找不到文件 `ECHO。
说明关于这个例子,你也许会认为和第二个相同,如果你仔细看的话会发现有一点不同,这个用的是back quoted。你可以先暂时跳过这个,等看完下面的在回来看这个。



下面看看使用usebackq的效果:
在做下面实验以前先做一些准备工作,首先我把cmd /?中关于usebackq部分拷过来。

  Quote:
specifies that the new semantics are in force,
where a back quoted string is executed as a
command and a single quoted string is a
literal string command and allows the use of
double quotes to quote file names in
filenameset.

看到这个帮助,我认为这里讲了usebackq的三种用法,单引号,双引号,back quote.在下面的实验中我会一个一个来讲的。(注意区分单引号和back quote)

实验六:
@FOR /F "usebackq tokens=*" %i IN (ab.txt) DO @ECHO %i
    结果:file:ab.txt
实验七:
@FOR /F "usebackq tokens=*" %i IN (a b.txt) DO @ECHO %i
    结果:系统找不到文件 a。
总结:括号中文字不加东西时,与不使用usebackq的作用是相同(参考实验一,实验二):即都表示的是文件,但文件中不能有空格,否则就会出错。
到了这里也许会有人想,如果我的文件里面有空格该怎么办呢?下面的这个实验,就会帮你解决这个问题。
实验八:
@FOR /F "usebackq tokens=*" %i IN ("a b.txt") DO @ECHO %i  
    结果:file:a (space) b.txt
总结:当使用usebackq这个关键字之后,双引号中的文字不在代表字符串(参见例四),而且代表文件名了。即使文件中有空格也可以使用。
那么当使用usebackq关键字之后,但又想使用字符串,要该么办,其实这时是用单引号来代表字符串。看下面的实验。
@FOR /F "usebackq tokens=*" %i IN ('ECHO hello') DO @ECHO %i  
    结果:ECHO hello
总结:这个和实验四的结果一样,证明了,单引号里面的是字符串。
实验九:
@FOR /F "usebackq tokens=*" %i IN (`ECHO hello`) DO @ECHO %i  
    结果:hello
注意了这里不是单引号,而是back quote,这个结果说明,当使用back quote时里面的是命令。也就相当于不使用usebackq关键字的单引号。当然,如果你可以把ECHO hello其它dos命令,把执行的结果传给%i,如果你输入的不是dos命令,比如abc Hello,cmd会提示你abc不是命令。

[ Last edited by tianlijian on 2007-3-16 at 08:33 PM ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 sxhzx 分数: +1  时间:2008-12-28 19:38


2007-3-17 04:37
查看资料  发送邮件  发短消息 网志   编辑帖子
tianlijian
初级用户





积分 120
发帖 45
注册 2007-3-13
状态 离线
『第 2 楼』:  

预留贴,以后将给出一个更简洁的总结

[ Last edited by tianlijian on 2007-3-16 at 05:29 PM ]

   此帖被 +10 点积分       点击查看详情   
评分人:【 lxmxn 分数: +10  时间:2007-3-17 12:08


附件 1: usebackq.png (2007-3-17 06:29, 12.75 K,下载次数: 19)


2007-3-17 04:41
查看资料  发送邮件  发短消息 网志   编辑帖子
snk502
新手上路




积分 2
发帖 1
注册 2007-2-8
状态 离线
『第 3 楼』:  

谢谢楼主对FOR的细节作出这些详细的总结
我是新手
对FOR语句不明白
看了你的总结令我知道这些细节
再次多谢楼主

2007-3-17 08:06
查看资料  发送邮件  发短消息 网志   编辑帖子
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

  总结得不错,加分了先。

  兄试试下面这个有趣的命令,看有什么结果:
for /f "usebackq delims=" %i in ('echo hello') do @echo %i


2007-3-17 12:11
查看资料  发送邮件  发短消息 网志   编辑帖子
tianlijian
初级用户





积分 120
发帖 45
注册 2007-3-13
状态 离线
『第 5 楼』:  

好像在某些情况下结果是这个
echo hello

还有些情况下结果是这个
echo hello
Ť \。不到文件 Ɉ

不明白为什么?

[ Last edited by tianlijian on 2007-3-17 at 03:07 AM ]

2007-3-17 16:05
查看资料  发送邮件  发短消息 网志   编辑帖子
tianlijian
初级用户





积分 120
发帖 45
注册 2007-3-13
状态 离线
『第 6 楼』:  

试了好多次还是不知道为什么,上面两种情况都会出现,第一种好像要多一些。
   我开始认为是不是使copy to clipboar进行复制时里面有看不见的字符,但后来觉得也不是这样。
   还有一个现象,我发现有时时候copy过去的东西在cmd上点右键后,会直接显示结果,有时候还要按一下回车?

2007-3-17 16:25
查看资料  发送邮件  发短消息 网志   编辑帖子
oilio
高级用户

前进者


积分 641
发帖 303
注册 2007-1-10
状态 离线
『第 7 楼』:  

大家再把得到的那个怪的结果再粘贴到命令行里面看一下,我想这个才是计算机真正想说的。



我相信总有一天,总会遇到一个人可以相濡以沫、相吻以湿!
2007-3-19 01:00
查看资料  发短消息 网志   编辑帖子
tianlijian
初级用户





积分 120
发帖 45
注册 2007-3-13
状态 离线
『第 8 楼』:  

还是不明白到底是什么意思?
为什么有时是这个结果,而有时却是另外一个结果?

[ Last edited by tianlijian on 2007-3-18 at 03:13 PM ]



test
2007-3-19 04:11
查看资料  发送邮件  发短消息 网志   编辑帖子
z310394543
初级用户




积分 48
发帖 23
注册 2007-10-24
状态 离线
『第 9 楼』:  

为什么我在CMD下的结果都是echo hello?

2007-10-29 22:51
查看资料  发送邮件  发短消息 网志   编辑帖子
z310394543
初级用户




积分 48
发帖 23
注册 2007-10-24
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by tianlijian at 2007-3-19 04:11 AM:
还是不明白到底是什么意思?
为什么有时是这个结果,而有时却是另外一个结果?

[ Last edited by tianlijian on 2007-3-18 at 03:13 PM ]

会得到一个奇怪的结果,

2007-10-29 22:59
查看资料  发送邮件  发短消息 网志   编辑帖子
sglxy
中级用户

MS-DOS爱好者


积分 397
发帖 87
注册 2002-12-15
状态 离线
『第 11 楼』:  

佩服楼主的精神。

2008-1-30 18:41
查看资料  发短消息 网志   编辑帖子
h2thesun
初级用户





积分 34
发帖 14
注册 2007-12-13
状态 离线
『第 12 楼』:  

总结得不错。版主的例子让人奇怪。

2008-3-3 21:00
查看资料  发送邮件  发短消息 网志   编辑帖子
sinbao
初级用户





积分 184
发帖 73
注册 2007-5-24
状态 离线
『第 13 楼』:  


@echo off
FOR /F "usebackq tokens=*" %%i IN (`"C:\a.bat" 'ab cd'`) DO ECHO %%i
pause
c:\a.bat内容是@echo _____%1
我希望的输出结果是
_____ab cd
然而实际却是
_____'ab

2008-4-3 16:40
查看资料  发短消息 网志   编辑帖子
sinbao
初级用户





积分 184
发帖 73
注册 2007-5-24
状态 离线
『第 14 楼』:  

改了一下还是不行
@echo off
FOR /F "usebackq tokens=*" %%i IN (`"C:\a.bat" "ab cd"`) DO ECHO %%i
pause
输出结果是:
'C:\a.bat" "ab' is not recognized as an internal or external command,
operable program or batch file.

2008-4-3 16:42
查看资料  发短消息 网志   编辑帖子
p1509101
中级用户

海浪人生


积分 206
发帖 103
注册 2007-7-4
状态 离线
『第 15 楼』:  

呵呵 学到了一点

2008-4-3 17:02
查看资料  发送邮件  发短消息 网志   编辑帖子
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: