标题: [文件操作] 批处理如何查找某个文件夹下的指定文件 [打印本页]
作者: 0428_hai 时间: 2009-8-1 09:45 标题: 批处理如何查找某个文件夹下的指定文件
本帖最后由 pcl_test 于 2016-8-3 11:54 编辑
- @echo off
- for /r %%i in (a.txt) do echo %%i是你要查找的文件吗
- pause>nul
复制代码
代码如上,我的初衷很简单,就是在当前目录及子目录下查找所有的a.txt文件并显示。
但是,结果并不能如我所愿,即使当前目录及子目录中没有这个a.txt,它也一通狂显:
……是你要查找的文件吗?
这是怎么回事儿?它显示有什么原则吗?
而我在查询的文件名上加个*,问题便解决了,可是这并不是我想要的啊,我就要查找a.txt,*a.txt的结果肯定比a.txt要多啊。
[attach]1697[/attach]
作者: namejm 时间: 2009-8-1 10:30
- @echo off
- for /f "delims=" %%i in ('dir /a-d /b /s a.txt 2^>nul') do echo "%%i"是你要查找的文件吗
- pause>nul
复制代码
作者: keen 时间: 2009-8-1 10:36 标题: 回复 1楼 的帖子
- @echo off
- for /r %%i in (a.txt) do if exist %%i echo "%%i"是你要查找的文件吗
- pause
复制代码
作者: tireless 时间: 2009-8-1 10:57
如果用 for /r,这样好一点:- @echo off
- for /r %%i in (a.txt?) do if /i %%~xi==.txt echo "%%i"是你要查找的文件吗
- pause
复制代码
如果确定没有 a.txt<任意一个字符> 这样的文件,如 a.txt1、a.txta,可以去掉上面的 if /i %%~xi==.txt。
[ 本帖最后由 tireless 于 2009-8-1 11:04 编辑 ]
作者: 0428_hai 时间: 2009-8-1 11:57
如上的问题为什么会存在呢?
这个 准确的文件名为什么会出来那么多不准确的结果?
难道是 for /r 的搜索规则就是那样?
作者: Lumiere 时间: 2009-8-1 15:35 标题: 回复 5楼 的帖子
你会那样写代码是因为你对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 编辑 ]
作者: 0428_hai 时间: 2009-8-1 22:46
原帖由 Lumiere 于 2009-8-1 15:35 发表
你会那样写代码是因为你对for还没有理解。打开cmd输入for /?查看里面有一句话,这样写的:.........
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的 ...
非常感谢这位兄弟如此细致、耐心的解释。您的回答对我理解这个问题有很大帮助。
就现在看来,我要是找当前目录和子目录中的 a.txt 的话,只能在do中用个if语句了吗?
通过修改in()看来是达不到效果了吧?
[ 本帖最后由 0428_hai 于 2009-8-1 23:02 编辑 ]
作者: Lumiere 时间: 2009-8-1 22:53 标题: 回复 7楼 的帖子
2楼管理员的代码不就没用if么?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |