|
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后的括号里面,管道符前面都要加^前导符,这是规定。
|
|
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 楼』:
个人感觉光有理论还不行,关键是要多实践,多发现问题。
|
|
2007-4-12 10:28 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
|
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
状态 离线
|
|
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 |
|