中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教for语句中出现的^符号的含义![已结]
作者:
标题: 请教for语句中出现的^符号的含义![已结] 上一主题 | 下一主题
logictianjin
初级用户





积分 58
发帖 25
注册 2006-11-29
状态 离线
『楼 主』:  请教for语句中出现的^符号的含义![已结]



  Quote:
for /f "tokens=3" %%b in ('dir /-c %%a:\^|findstr "可用字节"')

1.请拆解说明一下这个FOR命令,并注明一下^起了什么作用
2.如果^是转义的作用,请说明一下为什么要用转义!

[ Last edited by logictianjin on 2007-4-11 at 01:08 PM ]

2007-4-11 01:57
查看资料  发短消息 网志   编辑帖子
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 2 楼』:  

的确是转义的作用
不转的话 | 直接在这句中起它的特殊作用
转了|只是个一般字符

2007-4-11 02:45
查看资料  发短消息 网志   编辑帖子
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 3 楼』:  

在for内使用^是因为|管道符在cmd内有着分割命令的作用

for /f "tokens=3" %%b in ('dir /-c %%a:\|findstr "可用字节"')这一行不使用^那么cmd会识别为

for /f "tokens=3" %%b in ('dir /-c %%a:\

findstr "可用字节"')

2007-4-11 06:18
查看资料  发短消息 网志   编辑帖子
logictianjin
初级用户





积分 58
发帖 25
注册 2006-11-29
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by everest79 at 2007-4-10 05:18 PM:
在for内使用^是因为|管道符在cmd内有着分割命令的作用

for /f "tokens=3" %%b in ('dir /-c %%a:\|findstr "可用字节"')这一行不使用^那么cmd会识别 ...

在for内使用^是因为|管道符在cmd内有着分割命令的作用对于这句话不太理解.
下面是ntcmds帮助中对于 | 的解释:
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。

在此例中,()中的字符串已经用单引号括了起来,这是将其中的字符串看做是一个命令 可如果加了^符号,那不就成了让|不起作用,只作为一个单独的符号来显示吗? 越说越糊涂了,可否再详细的讲一讲!

2007-4-12 00:54
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




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


只需记着在for命令in后的括号里面,管道符前面都要加^前导符,这是规定。


   此帖被 +2 点积分    点击查看详情   
评分人:【 logictianjin 分数: +2  时间:2007-4-12 02:07


2007-4-12 01:02
查看资料  发送邮件  发短消息 网志   编辑帖子
logictianjin
初级用户





积分 58
发帖 25
注册 2006-11-29
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by lxmxn at 2007-4-11 12:02 PM:

只需记着在for命令in后的括号里面,管道符前面都要加^前导符,这是规定。

呵呵,大哥解释的确实通俗易懂,而且非常好记,可我希望从根本上理解这个问题,能否告诉下,如果想知道这个问题的究竟,需要参阅哪些资料?再次感谢!

2007-4-12 01:16
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




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


你可以搜索一下 willsort 兄关于for命令的详细分析相关的贴子。


2007-4-12 01:18
查看资料  发送邮件  发短消息 网志   编辑帖子
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by logictianjin at 2007-4-11 11:54 AM:

在for内使用^是因为|管道符在cmd内有着分割命令的作用对于这句话不太理解.
下面是ntcmds帮助中对于 | 的解释:
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。

在此例中,()中的字符串已经用单引号括了起来,这是将其中的字符串看做是一个命令 可如果加了^符号,那不就成了让|不起作用,只作为一个单独的符号来显示吗? 越说越糊涂了,可否再详细的讲一讲!

在教材中|&也是一种命令,可以组合其它被充许的命令,你反过来理解不就是分割吗
CMD解释命令是逐行的,当读入一行组合命令如echo a&echo b时,他在内部处理时自然会将这行拆分为两个命令行(echo a与echo b,这里是抽象举例),但也在这两个命令行中形成了一个继承或条件关系,先在这里称之为组合初始化
FOR %variable IN (set) DO command
CMD在解释FOR命令时,首先的工作是将一个完整的FOR命令读入,但在读取(set)中若发现|&符号,便会进行上述的组合初始化工作,很显然,CMD会在这里报错,命令是不能正确执行的,但为什么加上^符号便可以正常执行,而不是让CMD将|&当做单纯的字符来处理?
其实CMD的确将加了^的|&符号当做字符来处理了,而只所以能正常执行,是因为这一步处理是发生在CMD读入FOR整个命令行的过程中,而不是FOR接管后将(set)提交给CMD的过程中,下边来看看过程

CMD读入前:for /f %i in (echo a^&echo b) do echo %i

CMD读入后:for /f %i in (echo a&echo b) do echo %i

FOR提交时:CMD<(echo a&echo b)

2007-4-12 08:09
查看资料  发短消息 网志   编辑帖子
logictianjin
初级用户





积分 58
发帖 25
注册 2006-11-29
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by everest79 at 2007-4-11 07:09 PM:


在教材中|&也是一种命令,可以组合其它被充许的命令,你反过来理解不就是分割吗
CMD解释命令是逐行的,当读入一行组合命令如echo a&echo b ...

非常感谢 完全明白了,如果还有看了不明白的朋友请追帖,我来给解释就可以了,哈哈,把问题参透的感觉真是好!

2007-4-12 09:45
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




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


个人感觉光有理论还不行,关键是要多实践,多发现问题。


   此帖被 +15 点积分         点击查看详情   
评分人:【 everest79 分数: +15  时间:2007-4-12 10:47


2007-4-12 10:28
查看资料  发送邮件  发短消息 网志   编辑帖子
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 11 楼』:  

嘿嘿《UP

2007-4-12 10:47
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




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


To everest79:

嘿嘿,多谢兄的鼓励哈。


2007-4-12 14:07
查看资料  发送邮件  发短消息 网志   编辑帖子
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 13 楼』:  

个人的实践不能成为理论
那别人的理论来实践才踏实

2007-11-25 20:58
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
lving
新手上路





积分 11
发帖 6
注册 2009-10-20
状态 离线
『第 14 楼』:  

一直很迷糊

2009-10-24 14:05
查看资料  发送邮件  发短消息 网志   编辑帖子
lovelymorning
初级用户





积分 131
发帖 72
注册 2008-2-24
状态 离线
『第 15 楼』:  

楼上说得没错。。。ms说得更是没错。。。。官方语言嘛。。。

cmd,处理命令时,都是先读取整句命令,然后进行预处理

不管你这条命令多复杂,写了多少行。。。cmd,都视为一条命令

就说上面的 for,for的 集里面,可以有好多命令组合。。do也可以写好多命令

但对于cmd来说,这些,都是一条命令,for命令。。。

for /f "tokens=3" %%b in ('dir /-c %%a:\|findstr "可用字节"')

如果写成这样。。。cmd读取时,这是一条for命令,但是,for之后没有do,语法错误

也可以理解成   这条命令,被 | 分成了两条。。。

第一条是 for /f "tokens=3" %%b in ('dir /-c %%a:\  

第二条是 findstr "可用字节"')

这两条,都是错误命令,先不说for错误,就光 括号 ,有前括没回括。。。而findstr缺少所查找文件

所以,从哪个方面来说,这命令,都是错误命令


而加上 ^,那么,| 对于for来说,就是普通字符,但是,对于for里面的集来说,就是一个特殊符号

为何呢?

cmd读取时,是一条for命令,完整读入

因为有 ^ ,所以 | 是普通字符,所以,命令是正确的。。

经过cmd对for的预处理,只有一个的 ^ 被cmd脱去。。。

而当cmd处理for的集时,因为 ^ 已经脱去了,所以变成了

dir /-c %%a:\|findstr "可用字节"

这个样子。。。| 没人转义它,那它就是实实在在的特殊字符了。。所以,命令正确

个人见解。。。实际上,要解释这个,就得从cmd的预处理机制和 | 命令作用以及cmd对 | 命令的处理机制来解释。。。

如果从这方面来解释。。估计,越看越晕的

反正,记住,for的 集中,如果要用到    |   ||  &   &&  >   >>   等特殊字符时,都需要转义,,,这样就同错了。。

想知为何,建议去看一下cmd预处理机制和对特殊命令的处理机制

   此帖被 +1 点积分    点击查看详情   
评分人:【 rivch 分数: +1  时间:2010-4-25 01:48


2009-10-24 21:23
查看资料  发送邮件  发短消息 网志   编辑帖子

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: