Board logo

标题: [讨论]FOR的命令行分析机制 [打印本页]

作者: willsort     时间: 2006-6-22 19:11    标题: [讨论]FOR的命令行分析机制
To All:

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

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

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

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

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

FOR/R syntax bug
http://groups.google.com/group/alt.msdos.batch.nt/browse_thread/thread/84b80fadc616f74a/

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


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

FOR /? in CMD@WinXP

FOR /D %variable IN (set) DO command

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

FOR /R path] %variable IN (set) DO command

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

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

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

作者: xjmxjm1234     时间: 2006-6-24 18:19
是不是 FOR IN DO 要大写啊

作者: tghksj     时间: 2007-1-17 05:34
可惜我来的时候willsort大师已经走了....

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

作者: sleet1986     时间: 2007-1-17 06:58
支持2楼的说法!!

作者: jackyggt     时间: 2007-3-16 07:50
支持

作者: axi     时间: 2007-3-16 08:09
for in do 的功能太大了,有望批处理高手们多谈谈这方面的应用,使我们这些批处理新手从中获益。多谢。

作者: jianyaogao     时间: 2007-3-18 03:40
学习学习

作者: allowtimechange     时间: 2007-3-22 08:28
谢谢楼主的分享了

作者: hngaoshou     时间: 2007-3-28 22:07
谢谢

作者: stornager     时间: 2007-3-29 05:03
真强大,我一定要学会运用

作者: 13579246810     时间: 2007-3-29 05:56
学习了

大师 你很了不起!

作者: mtiankong     时间: 2007-4-20 05:37
学习 学习 再学习~~~

作者: luobotou     时间: 2007-5-17 15:49
复制学习了..好东西呀..

作者: studythedos     时间: 2007-5-17 22:44
看了都有点迷了..

作者: tianqing     时间: 2007-5-23 13:49
学习中…………………………各位辛苦了。支持了

作者: mcy7771     时间: 2007-6-5 20:35
看了都有点迷了..

作者: qinbuer     时间: 2007-6-5 22:06
学习,飘过

作者: qaz1223     时间: 2007-6-14 02:59
我一定要学会运用

作者: wangmeng052     时间: 2007-6-14 07:41
收藏起来研究。

作者: tsz20088     时间: 2007-6-14 20:16
谢谢楼主,又学了好东西!

作者: rockdong     时间: 2007-8-29 10:23
For 的使用,我还是理解的很浅,以后还要继续努力啊!

作者: rosepig     时间: 2008-8-2 10:18
willsort走了,留给我们后辈的更多的是他对待问题的认真态度,和对知识深刻独到理解的印象。

作者: luowei14     时间: 2008-8-2 22:28
回个贴。。以备后用。。。

作者: JD     时间: 2010-7-1 13:00
学习 学习 再学习~~~

作者: yiyue7     时间: 2010-7-2 21:11    标题: HEHEHEHE
GOOD FOR

作者: zch1366     时间: 2010-7-3 17:09
学习学习