你会那样写代码是因为你对for还没有理解。打开cmd输入for /?查看里面有一句话,这样写的:- .........
- FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
-
- 检查以 [drive:]path 为根的目录树,指向每个目录中的
- FOR 语句。.........
复制代码 开关/r虽然遍历目录,但是其实他的作用就是指向每个目录,假设你的D盘一级二级到n级子目录总共是100个目录,那么for /r d: %%a in (....) do 这样一个命令的执行如果你拆开来看的话,其实它就相当于每次跳转到特定的目录下,然后执行一个for %%a in (......) do命令,总共执行100次,只不过for /r把这些跳转隐式化了,明面上看不见,但是效果一样。这样的话再看%%a in (......) do命令,这个命令是for的基本命令格式,再简单不过了,括号中你写的是a.txt对吧,根据for的规则,集合如果没有通配符的话根据do后面的命令解释集合,你这里的a.txt对于for /r %%a in (.....) do 里的echo命令来说就是一个普通字符串,而不是文件。所以整个for /r语句其实相当于在每个文件夹下执行一次“for %%i in (a.txt) do echo %%i是你要查找的文件吗”其实就相当于将a.txt这个字符串显示出来,加之/r的效果,%%i的整个值是“路径+a.txt”的格式,整个这个格式就是一个字符串,比如,你d盘下有目录d:\bat的话,%%i的值就是“d:\bat\a.txt”,这个值都当做字符串,所以你有多少个文件夹就会显示多少次,不管下面有无a.txt这个文本,因为在你的for /r语句里它根本就没被当做文件。要主意的是如果do后面跟的是type之类的命令的话就又不一样了,会将其当做文件。
至于你加一个*之后,那就简单了,有通配符自然for将*a.txt作为文件处理,此时,可以正确显示,但是要知道,从你的结果来看,你的文件夹下一定没有“字符a.txt”的文件,比如ma.txt,ba.txt,如果有的话也会显示出来。
现在理解了吧?
[ 本帖最后由 Lumiere 于 2009-8-1 18:36 编辑 ] |