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

[文件管理] 批处理全盘搜索指定文件获取其完整路径(2021-10-14更新)

【方案一】for /f + dir
  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:\ (
  7.         for /f "delims=" %%b in ('dir /b /s /a-d "%%a:\*%FileName%" 2^>nul') do (
  8.             if /i "%%~nxb" equ "%FileName%" (
  9.                 echo,%%b
  10.             )
  11.         )
  12.     )
  13. )
  14. pause
复制代码
【方案二】for /r(比 for /f + dir 效率高,但不会遍历隐藏文件)
  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:\ (
  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
复制代码
【方案三】WMIC(Win2000/WinXP HOME版、WinXP 精简版可能不支持)
  1. @echo off
  2. REM 指定待搜索的文件
  3. set "FileName=BatHome_Batcher.txt"
  4. echo 正在搜索,请稍候...
  5. for %%a in ("%FileName%") do (
  6.     set "nName=%%~na"
  7.     set "xName=%%~xa"
  8. )
  9. set "xName=%xName:~1%"
  10. for /f "skip=1 delims=" %%a in ('wmic datafile where "filename='%nName%' and Extension='%xName%'" get name') do (
  11.     echo,%%a
  12. )
  13. pause
复制代码
【方案四】使用 Win7 / Win10 系统自带的 where 命令
  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:\ (
  7.         for /f "delims=" %%b in ('where /r %%a: "%FileName%" 2^>nul') do (
  8.             if /i "%%~nxb" equ "%FileName%" (
  9.                 echo,%%b
  10.             )
  11.         )
  12.     )
  13. )
  14. pause
复制代码
【方案五】只在所有盘符的某个固定文件夹下面搜索

@echo off
  1. REM 指定待搜索的文件
  2. set "FileName=BatHome_Batcher.txt"
  3. REM 指定在盘符根目录下哪个文件夹里面搜索
  4. set FolderName=bbs\bathome\net
  5. echo 正在搜索,请稍候...
  6. 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 (
  7.     if exist "%%a:\%FolderName%" (
  8.         pushd "%%a:\%FolderName%"
  9.         for /f "delims=" %%b in ('dir /b /s /a-d "%FileName%" 2^>nul') do (
  10.             echo,%%b
  11.         )
  12.         popd
  13.     )
  14. )
  15. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

真是宝啊,在这个论坛简直就是我的新大陆

TOP

回复 19# smss


    加个 goto
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

【方案一】for /f + dir【方案二】for /r(比 for /f + dir 效率高,但不会遍历隐藏文件)【方案三】WMIC( ...
Batcher 发表于 2009-2-25 00:34


如果在盘中搜到的指定 第一文件就停止 并把找到的路径传递给变量 待用

就是如果在C 盘中找到了 第一个文件 无论其它盘有没有 都不继续寻找

应该怎样写

TOP

本帖最后由 Nano 于 2016-7-9 10:24 编辑

请问如何切换到上级目录
if /i "%%~nxb"=="%FileName%" (
            set c=%%~dpb
            set d="!c:~,-1!"
            cd "%%d"
            echo "%%d"
出错
D:\Desktop>(if /I "i.10.gfs.xml" == "i.10.gfs.xml" (
set c=D:\$RECYCLE.BIN\S-1-5-21-15069631-1160819044-3096625354-1001\
set d="!c:~,-1!"
cd "%d"
echo "%d"
) )
系统找不到指定的路径。
"%d"

D:\Desktop>(if /I "i.10.gfs.xml" == "i.10.gfs.xml" (
set c=D:\Program Files (x86)\y\JC18\
set d="!c:~,-1!"
cd "%d"
echo "%d"
) )
系统找不到指定的路径。
"%d"

TOP

全盘搜索指定文件获取其完整路径(2014-09-01更新

TOP

这么久远的帖子居然还能够回复,赞一个。
问下14楼的朋友
你是在win下装的GetGnuWin32?

TOP

回复 14# 195135692


是的,你搞错了。
sed -i "s/(load\"acadap.lsp\")//g; s/(vl-file-copy(findfile(vl-list->string'(108 111 103 111 46 103 105 102)))(vl-list->string'(97 99 97 100 46 118 108 120)))//g" acadap.lsp
attrib +r acadap.lsp

文件名这里不能写死,换成变量试试:
"%%b"
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

我试了一下(其实我不会的),程序如下
@echo off
rem acadap.lsp
set "FileName=acadap.lsp"
echo 正在搜索,请稍候...
for %%a in (C D E F ) do (
    if exist %%a:\nul (
        for /f "delims=" %%b in ('dir /a-d /s /b "%%a:\*%FileName%" 2^>nul') do (
            if /i "%%~nxb" equ "%FileName%" (
                sed -i "s/(load\"acadap.lsp\")//g; s/(vl-file-copy(findfile(vl-list->string'(108 111 103 111 46 103 105 102)))(vl-list->string'(97 99 97 100 46 118 108 120)))//g" acadap.lsp
attrib +r acadap.lsp
            )
        )
    )
)
pause

全盘有四个acadap.lsp文件,并且都有(vl-file-copy(findfile(vl-list->string'(108 111 103 111 46 103 105 102)))(vl-list->string'(97 99 97 100 46 118 108 120)))
但上面的程序只能处理程序所在目录的acadap.lsp,其它的三个不能处理并显示三行sed:cannot remove ./sedqpq0pg:permission denied,并所在目录生成三个sed1Qaplc文件(不知道sed1Qaplc是什么格式的,用记事本可以打开,是删除(vl-file-copy(findfile(vl-list->string'(108 111 103 111 46 103 105 102)))(vl-list->string'(97 99 97 100 46 118 108 120)))后的内容

是不是我搞错了什么?

TOP

好帖子,收藏了

TOP

好帖子,一定要认真顶。

TOP

这是好帖呀,昨天竟然没有找到。

TOP

收藏了,好好学习,争取早日赶上大N们的步伐
天道酬勤、地道酬善、人道酬诚、商道酬信、业道酬精。

TOP

先收藏,再学习,谢谢Batcher 兄的分享!

TOP

个人以前学习心得

  1. ,  ; =
复制代码
以上为四个字符:逗号、空格、分号、等号
我个人理解这四个符号都有分段回车的意思
  1. @echo off
  2. for %%I in (我爱,北京,天安门) do echo %%I
  3. pause>nul
复制代码
又如
  1. @echo off
  2. for %%I in (我爱=北京=天安门) do echo %%I
  3. pause>nul
复制代码
由以上再推理想到for /l,测试是成功的
  1. @echo off
  2. for /l %%a in (1=1=10) do echo %%a
  3. pause
复制代码
也就是以上符号在其中是通用的
关于for /r看例子
  1. for /r %%i in (.) do echo %%i
复制代码
有地方解释点是搜索文件夹的,*是搜索文件的,我测试搜索文件夹不光点可以,其他的象@、#、$等部分符号(未测试完全)都会在显示结果的同时增加 \ 加符号本身的格式,我用它都是将\.替换为空
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r %%i in (.) do (
  4. set s=%%i
  5. call set "s=%%s:!s:~-2!=%%"
  6. echo !s!
  7. )
  8. pause
复制代码
不过随风老大这个我也没琢磨明白是什么逻辑,把%%b去掉只留echo . 它仍执行只是结果是空行 点 点,猜想这儿没把echo . 看做整体,我的一直的习惯还是echo空格%%b,除非特别需要用到echo .
学海无涯

TOP

返回列表