Board logo

标题: [其他] 批处理怎样全盘获取指定文件第一个路径? [打印本页]

作者: anymany    时间: 2009-12-21 20:47     标题: 批处理怎样全盘获取指定文件第一个路径?

  1. @echo off
  2. rem 指定待搜索的文件
  3. set "FileName=BatHome_Batcher.txt"
  4. echo 正在搜索,请稍候...
  5. for %%a 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 (
  6.   if exist %%a:\nul (
  7.     pushd %%a:\
  8.     for /r %%b in ("*%FileName%") do (
  9.       if /i "%%~nxb" equ "%FileName%" (
  10.         echo.%%b
  11.       )
  12.     )
  13.     popd
  14.   )
  15. )
  16. pause
复制代码
这段代码是论坛上的,它是全盘找出文件路径,有没有什么办法让它只得到第一个路径后退出,不在继续查找,比如在我的c盘和d盘各有一个qq.exe,只用这段代码找出c盘的qq.exe的路径,然后显示出来,退出,就不在查找D E F G H I J K L M N O P Q R S T U V W X Y Z了。
作者: keen    时间: 2009-12-21 21:33

  1. @echo off
  2. rem 指定待搜索的文件
  3. set "FileName=qq.exe"
  4. echo 正在搜索,请稍候...
  5. for %%a 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 (
  6.   if exist %%a:\nul (
  7.     pushd %%a:\
  8.     for /r %%b in ("*%FileName%") do (
  9.       if /i "%%~nxb" equ "%FileName%" (
  10.         echo.%%b
  11. goto end
  12.       )
  13.     )
  14.     popd
  15.   )
  16. )
  17. :end
  18. pause
复制代码

作者: neorobin    时间: 2009-12-21 21:37

  1. @echo off
  2. for /r c: %%b in (qq.exe) do (
  3.      if exist "%%~fb" (echo "%%~fb")&pause&exit /b
  4. )
复制代码

作者: anymany    时间: 2009-12-22 00:28

多谢两位,我开始对这段代码不理解,看了两位的贴子发现那段代码应该是实现了循环,对循环又有一深层的理解
作者: batman    时间: 2009-12-22 17:40     标题: 回复 2楼 的帖子

pushd和popd堆栈组合是多余的,直接在for /r中指明路径就可以了啊
作者: keen    时间: 2009-12-22 18:08     标题: 回复 5楼 的帖子

想知道batman兄,怎么在for /r中指明动态的路径?
作者: zqz0012005    时间: 2009-12-22 19:04     标题: 回复 5楼 的帖子

batman走向腐败,中午饭局上酒喝多了^_^
哈哈。。。
作者: temp    时间: 2009-12-22 20:09

原帖由 neorobin 于 2009-12-21 21:37 发表
@echo off
for /r c: %%b in (qq.exe) do (
     if exist "%%~fb" (echo "%%~fb")&pause&exit /b
)
谢谢你的代码,可惜看不懂,运行也没看到任何结果

请问是什么原因呢?

修改成如下也没结果%%~fb
  1. @echo off
  2. rem 指定待搜索的文件
  3. set "FileName=IEXPLORE.EXE"
  4. echo 正在搜索,请稍候...
  5. for %%a in (C D E F G) do (
  6.   if exist %%a:\nul (
  7.     pushd %%a:\
  8.     for /r %%b in ("*%FileName%") do (
  9.       if /i "%%~fb" equ "%FileName%" (
  10.         echo.%%b
  11.         goto end
  12.       )
  13.     )
  14.     popd
  15.   )
  16. )
  17. :end
  18. pause
复制代码

作者: temp    时间: 2009-12-22 20:13

原帖由 batman 于 2009-12-22 17:40 发表
pushd和popd堆栈组合是多余的,直接在for /r中指明路径就可以了啊
能不能帮忙直接写出简洁高效的代码呢

我没有基础,只能照猫画虎

谢谢!
作者: neorobin    时间: 2009-12-22 20:15     标题: 回复 8楼 的帖子

如果你电脑上 C: 盘确实有 qq.exe 文件, 并且 它 没有隐藏属性, 是会有显示的
下面的代码可检测我说的条件是否成立
  1. dir c:\qq.exe /s /b
复制代码
根据 17 楼 zqz0012005 指出的错误已作出更改

[ 本帖最后由 neorobin 于 2009-12-23 01:17 编辑 ]
作者: neorobin    时间: 2009-12-22 20:22     标题: 回复 8楼 的帖子

3 楼的代码, 我是实测过的,  请确认你电脑上 C: 盘确实有 qq.exe 文件(文件名没有任何其它的字符), 并且 它 没有隐藏属性,
而且你是将代码保存为 bat 文件后运行的
我电脑上的显示结果如下
"C:\Program Files\Tencent\QQ\Bin\QQ.exe"
请按任意键继续. . .
作者: temp    时间: 2009-12-22 20:44     标题: 回复 11楼 的帖子

谢谢! 我测试的代码如下,窗口一闪就没了,测试环境是WIN2003
  1. @echo off
  2. for /r c: %%b in (IEXPLORE.EXE) do (
  3.      if exist "%%~fb" (echo "%%~fb")&pause&exit /b
  4. )
复制代码

作者: neorobin    时间: 2009-12-22 20:51     标题: 回复 12楼 的帖子

抱歉, 我对 WIN2003 不了解, 我用的 WINXP,
请问 dir c:IEXPLORE.EXE /s /b 可有显示结果
用你 12 楼的代码, 我的测试结果:
"C:\WINDOWS\system32\dllcache\iexplore.exe"
请按任意键继续. . .

建议你先打开一个 cmd 窗口, 再把 保存的 BAT 文件拖进 CMD 窗口中运行, 以便查看是否有任何出错信息,
最好把代码中的 @echo off 这行去掉

[ 本帖最后由 neorobin 于 2009-12-22 20:54 编辑 ]
作者: temp    时间: 2009-12-22 21:01     标题: 回复 13楼 的帖子

提示找不到文件,BAT原文件如下:
  1. @echo off
  2. dir c:IEXPLORE.EXE /s /b
  3. pause
复制代码
我最关心的如下,Illegal.txt包含两个已知的进程名,怎样修改都不显示
Illegal.txt:
IEXPLORE.EXE
regedit.exe
  1. @echo off
  2. for /f %%h in (Illegal.txt) do (echo %%h)
  3. set "FileName=%%h"
  4. echo 正在搜索,请稍候...
  5. for %%a in (C D E F) do (
  6.   if exist %%a:\nul (
  7.     pushd %%a:\
  8.     for /r %%b in ("*%FileName%") do (
  9.       if /i "%%~nxb" equ "%FileName%" (
  10.         echo.%%b
  11.         goto end
  12.       )
  13.     )
  14.     popd
  15.   )
  16. )
  17. :end
  18. pause
复制代码

作者: neorobin    时间: 2009-12-22 21:13

  1. dir c:\IEXPLORE.EXE /ah /s /b
复制代码
根据 17 楼 zqz0012005 指出的错误已作出更改
用上面的代码可显示 c: 盘 设置了隐藏属性 的 IEXPLORE.EXE
如果仍没结果, 表明 C: 盘没有 IEXPLORE.EXE 文件, 或者 WIN2003 有特别的不同, 让这个命令找不到文件
建议你用系统搜索功能全盘查找 IEXPLORE.EXE 文件, 看看这个文件究竟在哪, 以及是否有隐藏属性
搜索选项上, 搜索系统文件夹, 搜索隐藏文件和目录, 搜索子文件夹都打上勾

[ 本帖最后由 neorobin 于 2009-12-23 01:19 编辑 ]
作者: temp    时间: 2009-12-22 21:17

原帖由 neorobin 于 2009-12-22 20:51 发表
抱歉, 我对 WIN2003 不了解, 我用的 WINXP,
请问 dir c:IEXPLORE.EXE /s /b 可有显示结果
用你 12 楼的代码, 我的测试结果:
"C:\WINDOWS\system32\dllcache\iexplore.exe"
请按任意键继续. . .

建议你先打开 ...


这样有显示
  1. @echo off
  2. dir c:\ "IEXPLORE.EXE"
  3. pause
复制代码

结果如下
  1. 驱动器 C 中的卷没有标签。
  2. 卷的序列号是 EC2D-70F6
  3. c:\ 的目录
  4. 2003-03-12  00:49                 0 AUTOEXEC.BAT
  5. 2003-03-12  00:49                 0 CONFIG.SYS
  6. 2009-10-08  19:59               646 Documents
  7. 2003-03-12  01:02    <DIR>          Documents and Settings
  8. 2009-10-04  09:07    <DIR>          Program Files
  9. 2009-11-09  18:49    <DIR>          WINDOWS
  10. 2003-03-12  00:49    <DIR>          wmpub
  11.                3 个文件            646 字节
  12. C:\Documents and Settings\Administrator\桌面 的目录
  13. 找不到文件
  14. 请按任意键继续. . .
复制代码

作者: zqz0012005    时间: 2009-12-22 21:25

neorobin也犯了这个说了很多次的经典错误
驱动器: 表示指定驱动器中的当前目录
驱动器:\ 表示指定驱动器中的根目录
  1. @echo off
  2. dir %~d0
  3. pause
  4. cd\
  5. dir %~d0
  6. pause
复制代码

作者: zqz0012005    时间: 2009-12-22 21:27     标题: 回复 16楼 的帖子

dir c:\ "IEXPLORE.EXE" 相当于
dir c:\ & dir "IEXPLORE.EXE"

dir等命令可以接受多个参数。
作者: neorobin    时间: 2009-12-22 21:32

根据 temp 的意图, 请使用下面的代码, 并保证 Illegal.txt 和 这个bat在同一个目录
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%h in (Illegal.txt) do (
  3.   for %%a in (C D E F) do (
  4.     cd /d %%a:\
  5.     for /r %%b in (%%h) do (
  6.       if exist "%%~fb" (echo "%%~fb")
  7.     )
  8.   )
  9. )
  10. pause
复制代码
我的运行结果如下:
"C:\WINDOWS\system32\dllcache\iexplore.exe"
"C:\Program Files\internet explorer\IEXPLORE.EXE"
"E:\TEMP\PFiles\Internet Explorer\IEXPLORE.EXE"
"F:\SOFT_INS\PFiles\Internet Explorer\IEXPLORE.EXE"
"C:\WINDOWS\regedit.exe"
"C:\WINDOWS\system32\dllcache\regedit.exe"
"F:\GRTMPVOL_CN (I)\I386\REGEDIT.EXE"
"F:\WINXPSH\I386\REGEDIT.EXE"
"F:\XPSP3INS\I386\REGEDIT.EXE"
请按任意键继续. . .
可以再改一下,即使隐藏的文件也会显示出来
  1. @echo off
  2. for /f "delims=" %%h in (Illegal.txt) do (
  3.   for %%a in (C D E F) do (
  4.     dir "%%a:\%%h" /ah /s /b 2>nul
  5.     dir "%%a:\%%h" /s /b 2>nul
  6.   )
  7. )
  8. pause
复制代码

[ 本帖最后由 neorobin 于 2009-12-23 01:22 编辑 ]
作者: neorobin    时间: 2009-12-22 21:38     标题: 回复 17楼 的帖子

ZQZ 说得很正确,
15 楼代码应改为
(cd /d c:\)& dir IEXPLORE.EXE /ah /s /b
来使用
作者: zqz0012005    时间: 2009-12-22 22:02     标题: 回复 19楼 的帖子

cd /d 会改变工作目录,不如pushd好使

回复 20楼 的帖子
可以直接
dir C:\iexplore.exe /ah /s /b
作者: neorobin    时间: 2009-12-22 22:17     标题: 回复 21楼 的帖子

嗯, 确实可直接 dir C:\iexplore.exe /ah /s /b
不过不重视 工作目录时, 用cd /d 简便一点, 免得 pushd 还要 popd 的
作者: temp    时间: 2009-12-22 23:32     标题: 回复 19楼 的帖子

非常感谢,你写的正是我想要的

同时感谢楼上诸位
作者: temp    时间: 2009-12-23 21:59

对不起发错了,请斑竹删除

[ 本帖最后由 temp 于 2009-12-23 22:37 编辑 ]
作者: temp    时间: 2009-12-23 22:17

对不起发错了,请斑竹删除

[ 本帖最后由 temp 于 2009-12-23 22:37 编辑 ]
作者: zqz0012005    时间: 2009-12-23 22:28

不同的话题请分开发帖。
作者: temp    时间: 2009-12-23 22:32     标题: 回复 26楼 的帖子

对不起!
发错地方了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2