![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-13 13:53 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [讨论]FOR的命令行分析机制 |
| 可打印版本 14,055 / 26 |
| 第1楼 willsort | 发表于 2006-06-22 19:11 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
[讨论]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/
运行XMSDSK 后,在他的虚拟盘目录下,循环FOR就不支持*统配符了? http://www.cn-dos.net/forum/viewthread.php?tid=15744 FOR /? in CMD@WinXP
|
|
| 第2楼 220110 | 发表于 2006-06-23 23:48 |
| 荣誉版主 发帖 313 积分 718 | |
|
看过很多FOR 的应用,不在于对目录的遍历,而更多的是使用FOR来解析.所以我猜测是因此而没有多少人知道并理解你所说的这个特性.
[ Last edited by 220110 on 2006-6-23 at 23:52 ] |
|
| 第3楼 xjmxjm1234 | 发表于 2006-06-24 18:19 |
| 中级用户 发帖 166 积分 361 | |
|
是不是 FOR IN DO 要大写啊
|
|
| 第4楼 tghksj | 发表于 2007-01-17 05:34 |
| 社区乞丐 发帖 90 积分 -49 | |
|
可惜我来的时候willsort大师已经走了....
个人感觉/R 与 /D 参数 完全可以被/F 和无参数取代. |
|
| 第5楼 sleet1986 | 发表于 2007-01-17 06:58 |
| 初级用户 发帖 34 积分 77 来自 景德镇 | |
|
支持2楼的说法!!
|
|
| 第6楼 jackyggt | 发表于 2007-03-16 07:50 |
| 初级用户 发帖 38 积分 76 | |
|
支持
|
|
| 第7楼 axi | 发表于 2007-03-16 08:09 |
| 中级用户 发帖 93 积分 238 来自 GZ | |
|
for in do 的功能太大了,有望批处理高手们多谈谈这方面的应用,使我们这些批处理新手从中获益。多谢。
|
|
| 第8楼 jianyaogao | 发表于 2007-03-18 03:40 |
| 初级用户 发帖 22 积分 49 | |
|
学习学习
|
|
| 第9楼 allowtimechange | 发表于 2007-03-22 08:28 |
| 新手上路 发帖 2 积分 4 | |
|
谢谢楼主的分享了
|
|
| 第10楼 hngaoshou | 发表于 2007-03-28 22:07 |
| 社区乞丐 发帖 77 积分 -16 | |
|
谢谢
|
|
| 第11楼 stornager | 发表于 2007-03-29 05:03 |
| 中级用户 发帖 131 积分 328 | |
|
真强大,我一定要学会运用
|
|
| 第12楼 13579246810 | 发表于 2007-03-29 05:56 |
| 初级用户 发帖 21 积分 45 | |
|
学习了
大师 你很了不起! |
|
| 第13楼 mtiankong | 发表于 2007-04-20 05:37 |
| 初级用户 发帖 38 积分 70 | |
|
学习 学习 再学习~~~
|
|
| 第14楼 luobotou | 发表于 2007-05-17 15:49 |
| 新手上路 发帖 7 积分 16 来自 河南省南阳市 | |
|
复制学习了..好东西呀..
|
|
| 第15楼 studythedos | 发表于 2007-05-17 22:44 |
| 初级用户 发帖 45 积分 91 | |
|
看了都有点迷了..
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |