中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: [讨论]FOR的命令行分析机制 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [讨论]FOR的命令行分析机制

To All:

      FOR的命令行分析机制是很复杂,有很多可以讨论的细节,这里首先讨论的是容易惹人疑窦的遍历集合(也就是in后do前括号中的部分)的分析机制。

      在此之前,首先提出一个应用上的实际问题[1]。严格的说,这不能算是FOR的一个BUG,而是对旧有语法特性的沿袭不当。

      关于FOR的旧有语法特性,[2] 中曾有讨论,现略作整理和补充:

      1、IN语句后()中内容被称为FOR的遍历集合,其中可以包含多个元素,每个元素之间以空格、分号、等号等参数分隔符分隔。FOR将按以下过程一一处理所有的元素。

      2、如果元素中含有文件名通配符(星号或问号),则FOR将此元素理解为文件名,它将在当前路径或者元素中所指定的路径下寻找可以对应的文件。如果找到,则用其文件名逐个替换并执行DO后的语句;如果未找到,则不执行DO后的语句,也不作任何提示。

      3、如果元素中不含有文件名通配符,则FOR则将其理解为普通意义的字符串,替换并执行DO后的语句。

      4、在文件名的替换过程中,如果元素中指定了路径,那么其替换后的FOR变量中也将包含同样的路径,反之亦然。

      5、在MSDOS6及其以下版本中,不支持长文件名,因此也不支持引号包含的文件名,所以在遍历元素中同时使用引号和通配符时,将没有任何执行结果。

      简而言之,如果有通配符则进行文件名的替换,否则进行字符串的替换。

      在后来的MSDOS7.10/COMMAND@Win9x/CMD@WinNT中,这个特性继续保留,只是在此基础上增加了对含引号文件名的识别和分析。

      至于在FOR/R和FOR/D仍然为何仍然沿袭这个特性,这确实是个值得讨论的问题,因为绝大多数情况下,我们使用FOR/R或FOR/D的目的,都是要进行文件或目录名的替换,而非普通文本的替换。

      但显然,FOR命令的设计思路与我们是有分歧的,且翻阅一下FOR的命令行帮助信息[3]。此时,我们可以揣测一下这个设计思路是什么:FOR/D只是将文件名匹配切换为目录名匹配,FOR/R只是将指定目录的匹配切换为指定目录树的匹配,这均不会也不该影响文件名和字符串的匹配选择。这样的设计,使程序的改动尽可能的小,至少遍历集合分析的代码不需要太大的改动。

      然而,会有多少人知道并理解这个特性呢?

[1] FOR/R syntax bug
http://groups.google.com/group/a ... d/84b80fadc616f74a/

  Quote:
E:\>dir/s/b
File Not Found

E:\>md test

E:\>echo test>test\x.txt

E:\>for /r %f in (x.txt) do @echo %f
E:\x.txt
E:\test\x.txt

E:\>for /r %f in (x.txt*) do @echo %f
E:\test\x.txt

[2] 运行XMSDSK 后,在他的虚拟盘目录下,循环FOR就不支持*统配符了?
http://www.cn-dos.net/forum/viewthread.php?tid=15744

[3] FOR /? in CMD@WinXP

  Quote:
FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符,则指定与目录名匹配,而不与文件
    名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树,指向每个目录中的
    FOR 语句。如果在 /R 后没有指定目录,则使用当前
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。





※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-22 19:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『第 2 楼』:  

看过很多FOR 的应用,不在于对目录的遍历,而更多的是使用FOR来解析.所以我猜测是因此而没有多少人知道并理解你所说的这个特性.

[ Last edited by 220110 on 2006-6-23 at 23:52 ]

2006-6-23 23:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xjmxjm1234
中级用户

论坛第一菜鸟


积分 361
发帖 166
注册 2006-4-15
状态 离线
『第 3 楼』:  

是不是 FOR IN DO 要大写啊



Diskette  Operating  System
2006-6-24 18:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 4 楼』:  

可惜我来的时候willsort大师已经走了....

个人感觉/R 与 /D 参数 完全可以被/F 和无参数取代.



我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-17 05:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sleet1986
初级用户




积分 77
发帖 34
注册 2007-1-11
来自 景德镇
状态 离线
『第 5 楼』:  

支持2楼的说法!!



我喜欢,我选择。。
2007-1-17 06:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jackyggt
初级用户





积分 76
发帖 38
注册 2007-3-13
状态 离线
『第 6 楼』:  

支持

2007-3-16 07:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
axi
中级用户

脚本爱好者


积分 238
发帖 93
注册 2007-3-11
来自 GZ
状态 离线
『第 7 楼』:  

for in do 的功能太大了,有望批处理高手们多谈谈这方面的应用,使我们这些批处理新手从中获益。多谢。

2007-3-16 08:09
查看资料  发短消息 网志  OICQ (453623262)  编辑帖子  回复  引用回复
jianyaogao
初级用户




积分 49
发帖 22
注册 2005-8-4
状态 离线
『第 8 楼』:  

学习学习

2007-3-18 03:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
allowtimechange
新手上路





积分 4
发帖 2
注册 2007-1-9
状态 离线
『第 9 楼』:  

谢谢楼主的分享了

2007-3-22 08:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hngaoshou
社区乞丐

gaoshou



积分 -16
发帖 77
注册 2007-1-30
状态 离线
『第 10 楼』:  

谢谢



:cool:
[swf=1,1]http://img63.imageshack.us/my.php?image=58098766zh0.swf[/swf]
2007-3-28 22:07
查看资料  发送邮件  发短消息 网志  OICQ (327869085)  编辑帖子  回复  引用回复
stornager
中级用户

scriptlover


积分 328
发帖 131
注册 2007-3-25
状态 离线
『第 11 楼』:  

真强大,我一定要学会运用

2007-3-29 05:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
13579246810
初级用户





积分 45
发帖 21
注册 2007-3-14
状态 离线
『第 12 楼』:  

学习了

大师 你很了不起!

2007-3-29 05:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mtiankong
初级用户





积分 70
发帖 38
注册 2007-3-24
状态 离线
『第 13 楼』:  

学习 学习 再学习~~~

2007-4-20 05:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
luobotou
新手上路





积分 16
发帖 7
注册 2006-9-29
来自 河南省南阳市
状态 离线
『第 14 楼』:  

复制学习了..好东西呀..

2007-5-17 15:49
查看资料  发送邮件  发短消息 网志  OICQ (316482083)  编辑帖子  回复  引用回复
studythedos
初级用户





积分 91
发帖 45
注册 2007-3-14
状态 离线
『第 15 楼』:  

看了都有点迷了..

2007-5-17 22:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: