中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-15 12:48
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [已结]如何全盘查找某文件并把它的路径加到环境变量中
可打印版本  3,731 / 14
第1楼 wentimao 发表于 2006-06-04 06:49
初级用户 发帖 27 积分 110
[已结]如何全盘查找某文件并把它的路径加到环境变量中
如何全盘查找某文件,满足一个条件就停止搜索,并把它的路径加到环境变量path中

[ Last edited by willsort on 2006-6-14 at 17:41 ]
第2楼 namejm 发表于 2006-06-06 13:51
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  请问你的"满足一个条件就停止搜索"的"一个条件"是什么意思?
  按照一般的理解,就是找到第一个文件就停止查找。
  但是查询的顺序不一样(是按照盘符顺序的C D E……?还是先在本目录下查找再在当前盘下查找再然后才是C D E……的顺序?),导致找到"第一个文件"的"第一个"就不一样。
  姑且认为是按照C D E……盘符的顺序查找,找到第一个文件之后就停止搜索,要实现你的要求,以下代码可能有所帮助:
第3楼 willsort 发表于 2006-06-06 18:53
元老会员 发帖 1,512 积分 4,432
Re namejm:

兄的代码大致是有效的,但也存在着一些问题:

1、%%i:之后应该紧随一个表示根目录的“\”,否则dir将以当前目录为起始路径搜索;你的cd\只能保证当前盘是以根目录为起始路径,而无法保证其它磁盘;而你所提到的“dir命令不能查询本脚本程序所在盘符下的所有文件”则是错误的。

2、:add之前应加一句goto :eof,否则流程会出现问题;

3、:add之下的for语句,会使位于同一磁盘的多个目标路径中最后匹配的一个添加到%path%中;

4、dir /s使用的是深度优先算法,这在目标存在于一些较浅的路径时,搜索效率降低;当然,现在还没有太好的广度优先算法的现有工具或命令可以使用,用批处理自己编写,具有一定的复杂度,效率上也不一定更加优秀。
第4楼 wentimao 发表于 2006-06-06 22:17
初级用户 发帖 27 积分 110
在do里加一句cd%%i:\ 2>nul
然后再dir就可以了吧

[ Last edited by wentimao on 2006-6-6 at 22:30 ]
第5楼 namejm 发表于 2006-06-06 23:07
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Re willsort:

  1、%%i:之后应该紧随一个表示根目录的“\”,否则dir将以当前目录为起始路径搜索;你的cd\只能保证当前盘是以根目录为起始路径,而无法保证其它磁盘;而你所提到的“dir命令不能查询本脚本程序所在盘符下的所有文件”则是错误的。
  ——看到楼主以前说过,dir c:test.txt和dir c:\test.txt是有区别的,当时没有仔细验证,以为dir /s c:test.txt就是全盘查找语句,所以用上了cd\语句,还得出了“dir命令不能查询本脚本程序所在盘符下的所有文件”的错误结论。看来自己粗心了。
2、:add之前应加一句goto :eof,否则流程会出现问题;
  ——恩,版主是个细心之人。写代码太过匆忙,居然把这个地方漏了,再次发现自己是个马大哈。
3、:add之下的for语句,会使位于同一磁盘的多个目标路径中最后匹配的一个添加到%path%中;
  ——当初测试的时候,只在C盘根目录下放了test.txt,没有在更多的地方放置测试文件,又是一大疏漏,直接导致了这段代码是个失败的示例。再次测试的时候,发现了一个细节:如果test.txt放在一个带空格的目录下的话,path命令将不能正确执行。 
 
  修改后的代码如下,但是暂时没法解决path不能执行带空格的路径的问题:


[ Last edited by namejm on 2006-6-6 at 23:12 ]
第6楼 hyuanqing 发表于 2006-06-06 23:35
新手上路 发帖 3 积分 14
麻烦各位指点解释一下这个批处理
@echo off
:: 把按照盘符顺序查到的第一个指定文件加入到查询路径中去
:: 当路径带空格时不能正确执行
del list.txt>nul 2>nul
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
dir /a /b /s %%i:\test.txt>list.txt 2>nul && goto :add
)
echo 不存在该文件
pause && goto :eof
:add
for /f %%i in (list.txt) do (
find "test.txt" list.txt>nul 2>nul && path=%path%;%%i && goto end
)
goto :eof
:end
del list.txt>nul 2>nul
path
pause
如何全盘查找某文件,满足一个条件就停止搜索,并把它的路径加到环境变量path中。这是刚看的一段代码,其中有几个地方不明白,麻烦各位指点一下!谢谢
del list.txt>nul 2>nul 这里是什么意思?(为什么用del呢?还有>nul 2>nul这是什么用法?)
pause && goto :eof 这里也不明白,以前写直接用个标号就好了,这里为什么要用:eof呢?两个&&代表什么意思呢?
path=%path% (一直都不明白的这两个百分号的用法)
小弟刚刚接触批处,还很多不懂的地方,请多多指教:)
第7楼 willsort 发表于 2006-06-06 23:38
元老会员 发帖 1,512 积分 4,432
Re namejm:

不知道你最近的测试过程,不过单从代码上看,使用find似乎并不能解决含空格目录的问题,反而增加了冗余代码。这里应该使用"delims="参数。

第8楼 willsort 发表于 2006-06-06 23:44
元老会员 发帖 1,512 积分 4,432

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:合并主题 {21070}麻烦各位指点解释一下这个批处理 -> 6楼
说明:操作主题与本主题存在上下文的直接联系
处罚:因属论坛新人,不予积分处罚
提示:请访问 {7326}论坛新手必读,所有人的基本行为准则
───────────────── 版务记录 ─────────────────
第9楼 namejm 发表于 2006-06-07 00:28
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Re willsort:

  在以前的印象中,一直以为用for嵌套的时候对变量的引用很麻烦,所以一直不敢尝试用for嵌套,现在看了版主的代码,简洁而实用,PF。——for真是太强大了。
第10楼 namejm 发表于 2006-06-07 00:41
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Re hyuanqing:

  del list.txt>nul 2>nul 这里是什么意思?(为什么用del呢?还有>nul 2>nul这是什么用法?)
  ——这里用了del,是为了防止以下语句输出到list.txt的时候会在list.txt内容的后面追加内容,但是考虑到下面的语句中用的是>而不是>>,这句应该是多余的。>nul 2>nul意思是无论语句执行成功与否,都不在屏幕上显示执行结果。
  pause && goto :eof 这里也不明白,以前写直接用个标号就好了,这里为什么要用:eof呢?两个&&代表什么意思呢?
  ——goto :eof意思是直接跳到批处理程序的结尾,在一般情况下相当于exit命令,一个&的意思是同时执行&连接的两条语句,而两个&则表示如果&&的前一句语句执行成功,则执行&&之后的语句。另:如果用||,则表示如果||的前一句语句执行失败,则执行||之后的语句。
  path=%path% (一直都不明白的这两个百分号的用法)
  ——百分号的意思是引用前面定义过的变量。这应该属于批处理语法的基础了。

[ Last edited by namejm on 2006-6-7 at 16:24 ]
第11楼 Climbing 发表于 2006-06-08 01:29
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
我觉得你们的代码虽然一个比一个完善,但都忽略了一个重要的问题,那就是,你们所搜索到的路径中都包括文件名本身,而这个文件名是不应该被放到搜索路径path中的,否则好象搜索路径就失去了意义。



不过这个批处理好象最终的结果还是将找到的最后一个路径加入了PATH,看来必要时需要启用延迟环境变量扩展。
第12楼 willsort 发表于 2006-06-08 01:41
元老会员 发帖 1,512 积分 4,432
Re Climbing:

路径中带有文件名确实是个问题,修改代码前也曾注意到它,只是修改中将它忘记了,而最后没有测试修改代码。

至于将最后路径加入 %path% 则难于理解,&&goto :eof 应该没有什么太大的问题。
第13楼 Climbing 发表于 2006-06-08 10:22
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
Re Wil:

不好意思,是我理解错了,我原来以为是将每个搜索到的路径都加入PATH,原来只是将找到的第一个加入。
第14楼 regvip2008 发表于 2007-10-28 14:26
初级用户 发帖 87 积分 187
楼上各位高手的言论,让我等新手受益匪浅!
第15楼 yptd 发表于 2008-05-31 01:58
新手上路 发帖 6 积分 13
菜鸟东拼起来的P,指点下~~~~~~



@echo off
setlocal enabledelayedexpansion
for %%i in (D E F G H I) do (
(for /f "delims=" %%p in ('dir /a /b /s %%i:\1.rar') do (
set var=%%p&&goto :loop
)) 2>nul
)

:loop

set "route=%var%"
set layers_discard=1
if "%route:~-1%"=="\" set "route=%route:~0,-1%"
for /l %%i in (1,1,%layers_discard%) do call :intercept "%%route%%"
:end
echo "%route%"
pause
goto :eof
:intercept
for /f "delims=" %%i in (%1) do set "route=%%~dpi"
if "%route:~-2,1%"==":" (goto end) else set "route=%route:~0,-1%"
goto :eof


[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023