Board logo

标题: 请教for语句中出现的^符号的含义![已结] [打印本页]

作者: logictianjin     时间: 2007-4-11 01:57    标题: 请教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 ]
作者: NaturalJ0     时间: 2007-4-11 02:45
的确是转义的作用
不转的话 | 直接在这句中起它的特殊作用
转了|只是个一般字符
作者: everest79     时间: 2007-4-11 06:18
在for内使用^是因为|管道符在cmd内有着分割命令的作用

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

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

findstr "可用字节"')
作者: logictianjin     时间: 2007-4-12 00:54


  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)。

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

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

作者: logictianjin     时间: 2007-4-12 01:16


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

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

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

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

作者: everest79     时间: 2007-4-12 08:09


  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)
作者: logictianjin     时间: 2007-4-12 09:45


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


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

非常感谢 完全明白了,如果还有看了不明白的朋友请追帖,我来给解释就可以了,哈哈,把问题参透的感觉真是好!
作者: lxmxn     时间: 2007-4-12 10:28

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

作者: everest79     时间: 2007-4-12 10:47
嘿嘿《UP
作者: lxmxn     时间: 2007-4-12 14:07

To everest79:

嘿嘿,多谢兄的鼓励哈。

作者: huahua0919     时间: 2007-11-25 20:58
个人的实践不能成为理论
那别人的理论来实践才踏实
作者: lving     时间: 2009-10-24 14:05
一直很迷糊
作者: lovelymorning     时间: 2009-10-24 21:23
楼上说得没错。。。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预处理机制和对特殊命令的处理机制