Quote: | |
******************************************************************************************************************************** er-------------------- 这就是在不断犯错中成长------十分感谢 zqz 版主的 解释---- 现把他的解释 和 其中的链接放在 一楼 方便大家学习------ zqz 版主 10 楼: 你所转的willsort的帖子内容其实并不是Bug,而是for的一种运行机制。 http://www.bathome.net/viewthread.php?tid=4804&page=1#pid30833 引用: 2、for、for /r 其实并不枚举文件,它们的循环对象就是字符串,除了一个例外:循环集含有通配符*、?。 8楼说的Bug是,如果循环过程中有文件名变动或新文件生成,有时会导致某些文件循环两次(暂未发现文件遍历不到的情况),也就是说循环过程被扰乱了。但这个bug只是偶尔出现甚至不会出现,难以追踪。 zqz 11 楼: 在linux中,命令中的普通通配符是由shell完成扩展的。 例如 ls *.txt 如果当前目录有1.txt 2.txt两个文件,则*.txt被shell自动扩展为实际文件名,因此ls实际执行的命令是 ls 1.txt 2.txt 类似地,echo *.txt 将显示1.txt 2.txt而不是字面上的*.txt 所以有时经常需要对通配符转义或用引号括起来防止shell的自动扩展。 cmd中for的运行机制与此类似(注意只是类似而不等同)。 |
2、for、for /r 其实并不枚举文件,它们的循环对象就是字符串,除了一个例外:循环集含有通配符*、?。
for %%a in (*) do echo %%a
这个时候你没办法将*、?当作普通字符,加^转义也不行。
for /r 的循环方式是对每个目录执行一次,在循环集里的字符串前面加上目录名(构成%%a)。
类似于for /l 的循环方式是对每个数执行一次。
欢迎光临 批处理之家 (http://bbs.bathome.net/) | Powered by Discuz! 7.2 |