中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 18:59
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教for语句中出现的^符号的含义![已结]
楼 主 请教for语句中出现的^符号的含义![已结] 发表于 2007-04-11 01:57 ·  中国 天津 电信
初级用户
积分 58
发帖 25
注册 2006-11-29 13:11
UID 72096
性别 男
状态 离线
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 ]
2 发表于 2007-04-11 02:45 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
UID 60484
状态 离线
的确是转义的作用
不转的话 | 直接在这句中起它的特殊作用
转了|只是个一般字符
3 发表于 2007-04-11 06:18 ·  中国 广东 广州 黄埔区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
在for内使用^是因为|管道符在cmd内有着分割命令的作用

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

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

findstr "可用字节"')
4 发表于 2007-04-12 00:54 ·  中国 天津 电信
初级用户
积分 58
发帖 25
注册 2006-11-29 13:11
UID 72096
性别 男
状态 离线
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)。

在此例中,()中的字符串已经用单引号括了起来,这是将其中的字符串看做是一个命令 可如果加了^符号,那不就成了让|不起作用,只作为一个单独的符号来显示吗? 越说越糊涂了,可否再详细的讲一讲!
5 发表于 2007-04-12 01:02 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

只需记着在for命令in后的括号里面,管道符前面都要加^前导符,这是规定。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
logictianjin +2 2007-04-12 02:07
6 发表于 2007-04-12 01:16 ·  中国 天津 电信
初级用户
积分 58
发帖 25
注册 2006-11-29 13:11
UID 72096
性别 男
状态 离线
Originally posted by lxmxn at 2007-4-11 12:02 PM:

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


呵呵,大哥解释的确实通俗易懂,而且非常好记,可我希望从根本上理解这个问题,能否告诉下,如果想知道这个问题的究竟,需要参阅哪些资料?再次感谢!
7 发表于 2007-04-12 01:18 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

你可以搜索一下 willsort 兄关于for命令的详细分析相关的贴子。
8 发表于 2007-04-12 08:09 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
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)
9 发表于 2007-04-12 09:45 ·  中国 天津 电信
初级用户
积分 58
发帖 25
注册 2006-11-29 13:11
UID 72096
性别 男
状态 离线
Originally posted by everest79 at 2007-4-11 07:09 PM:


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


非常感谢 完全明白了,如果还有看了不明白的朋友请追帖,我来给解释就可以了,哈哈,把问题参透的感觉真是好!
10 发表于 2007-04-12 10:28 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

个人感觉光有理论还不行,关键是要多实践,多发现问题。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
everest79 +15 2007-04-12 10:47
11 发表于 2007-04-12 10:47 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
嘿嘿《UP
12 发表于 2007-04-12 14:07 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

To everest79:

嘿嘿,多谢兄的鼓励哈。
13 发表于 2007-11-25 20:58 ·  中国 江苏 苏州 吴江区 电信
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
UID 99089
性别 男
状态 离线
个人的实践不能成为理论
那别人的理论来实践才踏实
14 发表于 2009-10-24 14:05 ·  中国 黑龙江 哈尔滨 联通
新手上路
积分 11
发帖 6
注册 2009-10-20 14:32
UID 153381
性别 男
状态 离线
一直很迷糊
15 发表于 2009-10-24 21:23 ·  中国 广东 揭阳 电信
初级用户
★★
积分 131
发帖 72
注册 2008-02-24 14:31
UID 111317
性别 男
状态 离线
楼上说得没错。。。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-04-25 01:48
论坛跳转: