中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何全盘查找某文件并把它的路径加到环境变量中
作者:
标题: [已结]如何全盘查找某文件并把它的路径加到环境变量中 取消高亮 | 上一主题 | 下一主题
wentimao
初级用户





积分 110
发帖 27
注册 2006-6-3
状态 离线
『楼 主』:  [已结]如何全盘查找某文件并把它的路径加到环境变量中

如何全盘查找某文件,满足一个条件就停止搜索,并把它的路径加到环境变量path中

[ Last edited by willsort on 2006-6-14 at 17:41 ]



xp,cmd
2006-6-4 06:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  请问你的"满足一个条件就停止搜索"的"一个条件"是什么意思?
  按照一般的理解,就是找到第一个文件就停止查找。
  但是查询的顺序不一样(是按照盘符顺序的C D E……?还是先在本目录下查找再在当前盘下查找再然后才是C D E……的顺序?),导致找到"第一个文件"的"第一个"就不一样。
  姑且认为是按照C D E……盘符的顺序查找,找到第一个文件之后就停止搜索,要实现你的要求,以下代码可能有所帮助:
@echo off
:: 把按照盘符顺序查到的第一个指定文件加入到查询路径中去
:: 因为dir命令不能查询本脚本程序所在盘符下的所有文件
:: 所以要用cd\返回到根目录下以实现全盘查询
cd\
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
:add
for /f %%i in (list.txt) do path=%path%;%%i
del list.txt>nul 2>nul
path
pause


2006-6-6 13:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

Re namejm:

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

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

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

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

      4、dir /s使用的是深度优先算法,这在目标存在于一些较浅的路径时,搜索效率降低;当然,现在还没有太好的广度优先算法的现有工具或命令可以使用,用批处理自己编写,具有一定的复杂度,效率上也不一定更加优秀。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-6 18:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wentimao
初级用户





积分 110
发帖 27
注册 2006-6-3
状态 离线
『第 4 楼』:  

在do里加一句cd%%i:\ 2>nul
然后再dir就可以了吧

[ Last edited by wentimao on 2006-6-6 at 22:30 ]



xp,cmd
2006-6-6 22:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:  

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不能执行带空格的路径的问题:
@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
[ Last edited by namejm on 2006-6-6 at 23:12 ]

2006-6-6 23:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hyuanqing
新手上路





积分 14
发帖 3
注册 2006-6-6
状态 离线
『第 6 楼』:  麻烦各位指点解释一下这个批处理

@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% (一直都不明白的这两个百分号的用法)
小弟刚刚接触批处,还很多不懂的地方,请多多指教:)

2006-6-6 23:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  

Re namejm:

      不知道你最近的测试过程,不过单从代码上看,使用find似乎并不能解决含空格目录的问题,反而增加了冗余代码。这里应该使用"delims="参数。
@echo off
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 (
    (for /f "delims=" %%p in ('dir /a /b /s %%i:\test.txt') do (
        set path=%path%;%%p&&goto :eof
    )) 2>nul
)
echo 不存在该文件
pause && goto :eof




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-6 23:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 8 楼』:  


───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:合并主题 {21070}麻烦各位指点解释一下这个批处理 -> 6楼
说明:操作主题与本主题存在上下文的直接联系
处罚:因属论坛新人,不予积分处罚
提示:请访问 {7326}论坛新手必读,所有人的基本行为准则[转帖]
───────────────── 版务记录 ─────────────────




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-6 23:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 9 楼』:  

Re willsort:

  在以前的印象中,一直以为用for嵌套的时候对变量的引用很麻烦,所以一直不敢尝试用for嵌套,现在看了版主的代码,简洁而实用,PF。——for真是太强大了。

2006-6-7 00:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  

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 ]

2006-6-7 00:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 11 楼』:  

我觉得你们的代码虽然一个比一个完善,但都忽略了一个重要的问题,那就是,你们所搜索到的路径中都包括文件名本身,而这个文件名是不应该被放到搜索路径path中的,否则好象搜索路径就失去了意义。
@echo off
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 (
    (for /f "delims=" %%P in ('dir /a /b /s %%i:\test.txt') do (
        set path=%path%;%%~dpsP&&goto :eof
    )) 2>nul
)
echo 不存在该文件
pause && goto :eof
不过这个批处理好象最终的结果还是将找到的最后一个路径加入了PATH,看来必要时需要启用延迟环境变量扩展。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-6-8 01:29
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 12 楼』:  

Re Climbing:

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

      至于将最后路径加入 %path% 则难于理解,&&goto :eof 应该没有什么太大的问题。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 01:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 13 楼』:  

Re Wil:

不好意思,是我理解错了,我原来以为是将每个搜索到的路径都加入PATH,原来只是将找到的第一个加入。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-6-8 10:22
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
regvip2008
初级用户





积分 187
发帖 87
注册 2007-10-23
状态 离线
『第 14 楼』:  

楼上各位高手的言论,让我等新手受益匪浅!

2007-10-28 14:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yptd
新手上路





积分 13
发帖 6
注册 2007-2-26
状态 离线
『第 15 楼』:  

菜鸟东拼起来的P,指点下~~~~~~

  Quote:
@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



2008-5-31 01:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: