中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]for命令中转义字符^的问题
作者:
标题: [已结]for命令中转义字符^的问题 上一主题 | 下一主题
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『楼 主』:  [已结]for命令中转义字符^的问题

现在学习英雄的教程,有一个语句:
for /f "tokens=2 delims= " %%i in ('systeminfo ^| find "物理内存总量"') do (
set m=%%i
)
我把其中的^拿掉也能执行。
请问这里的^有什么特殊作用吗?如果把它放到管道符|前,不等于取消了|的特殊作用,把它变成了普通字符了吗?那systeminfo命令的执行结果还能输送到它后面的语句以提供find要查找的信息吗?因为看到过很多这样的现象,不理解?

[ Last edited by HAT on 2008-12-11 at 17:42 ]

2008-12-11 15:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 2 楼』:  

我也不是很明白,但是就日常的使用经验,如果不加“ ^ ”,那么 for 语句中 in 后面的 “()”遇到“ | ”的时候,句子就会分为前后两段。
前一句是:
for /f "tokens=2 delims= " %%i in ('systeminfo
后一句是:
find "物理内存总量"') do (set m=%%i)
两句语法都不对。

加了^ 才能把'systeminfo | find "物理内存总量"' 当做一条命令放在括号里面。

2008-12-11 15:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
rs369007
初级用户





积分 147
发帖 131
注册 2008-9-22
状态 离线
『第 3 楼』:  

http://www.cn-dos.net/forum/view ... 1&highlight=%5E

2008-12-11 16:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 4 楼』:  

现在看英雄教程,有一条我不知理解对不对
('systeminfo 中的   单引号‘
会把一些特殊字符的功能给屏蔽掉,比如说|,就是让它们成为普通字符
所以一个命令行变成了两行
而^又把|的特殊功能还原了,从而达到了不让它们分行的目的。
这说明'肯定没有屏蔽^,也就是说^的优先级高。
另外都说%的优先级高。
不知这么理解对不对?

2008-12-11 16:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『第 5 楼』:  

两个‘’号,是for命令下用的,表明里面引用的是一条命令,但是系统在执行的之后,会遇到管道符号|,系统会认为是|前面的结果输入到|后面,加上^符号后,系统会把^之后的 | 当普通符号放在命令中执行。
你要说^优先级高一些,好像也对哦。

还是看3楼的那个帖子吧,看完了就明白了,我也说不清楚

2008-12-11 16:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 6 楼』:  找到答案了,

在教材中|&也是一种命令,可以组合其它被充许的命令,你反过来理解不就是分割吗
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)

2008-12-11 17:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 7 楼』:  

简单的解释

for /f "tokens=2 delims= " %%i in ('systeminfo ^| find "物理内存总量"') do (
set m=%%i
)
cmd会理解为执行以下几句
systeminfo
find "物理内存总量"
for /f "tokens=2 delims= " %%i in ("xxxx") do (set m=%%i)


for /f "tokens=2 delims= " %%i in ('systeminfo | find "物理内存总量"') do (
set m=%%i
)
少了^,cmd会理解为执行以下几句
for /f "tokens=2 delims= " %%i in ('systeminfo
find "物理内存总量"') do (set m=%%i)

2008-12-11 19:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: