[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理如何查找某个文件夹下的指定文件

本帖最后由 pcl_test 于 2016-8-3 11:54 编辑
  1. @echo off
  2. for /r %%i in (a.txt) do echo %%i是你要查找的文件吗
  3. pause>nul
复制代码
代码如上,我的初衷很简单,就是在当前目录及子目录下查找所有的a.txt文件并显示。
但是,结果并不能如我所愿,即使当前目录及子目录中没有这个a.txt,它也一通狂显:
……是你要查找的文件吗?

这是怎么回事儿?它显示有什么原则吗?
而我在查询的文件名上加个*,问题便解决了,可是这并不是我想要的啊,我就要查找a.txt,*a.txt的结果肯定比a.txt要多啊。
[attach]1697[/attach]

  1. @echo off
  2. for /f "delims=" %%i in ('dir /a-d /b /s a.txt 2^>nul') do echo "%%i"是你要查找的文件吗
  3. pause>nul
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 1楼 的帖子

  1. @echo off
  2. for /r %%i in (a.txt) do if exist %%i echo "%%i"是你要查找的文件吗
  3. pause
复制代码
(*^_^*)

TOP

如果用 for /r,这样好一点:
  1. @echo off
  2. for /r %%i in (a.txt?) do if /i %%~xi==.txt echo "%%i"是你要查找的文件吗
  3. pause
复制代码
如果确定没有 a.txt<任意一个字符> 这样的文件,如 a.txt1、a.txta,可以去掉上面的 if /i %%~xi==.txt。

[ 本帖最后由 tireless 于 2009-8-1 11:04 编辑 ]
1

评分人数

TOP

如上的问题为什么会存在呢?
这个 准确的文件名为什么会出来那么多不准确的结果?
难道是 for /r 的搜索规则就是那样?

TOP

回复 5楼 的帖子

你会那样写代码是因为你对for还没有理解。打开cmd输入for /?查看里面有一句话,这样写的:
  1. .........
  2. FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
  3.     检查以 [drive:]path 为根的目录树,指向每个目录中的
  4.     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 编辑 ]
Still with wax

TOP

原帖由 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 编辑 ]

TOP

回复 7楼 的帖子

2楼管理员的代码不就没用if么?
Still with wax

TOP

返回列表