无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 816|回复: 31
打印 上一主题 下一主题

[讨论] 怎么用bat脚本搜索各分区根目录特定文件名的文件

[复制链接]
跳转到指定楼层
1#
发表于 2024-11-30 13:40:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1G空间100元 于 2024-11-30 13:45 编辑

怎么用bat脚本搜索各分区根目录特定文件名的文件,并提取该文件的完整路径,全盘只有一个唯一文件名,而且放根分区,没放文件夹内,但是不清楚放哪个分区中,只需要提取这个文件的所在分区的盘符或完整路径,不需要查看文件的内容
假设这里的文件名为baiduseo.txt

只用搜索各分区的根目录 不需要搜索文件夹和其子目录
因为文件名具有唯一性 搜索到一个文件后 就不需要再继续搜索
2#
发表于 2024-11-30 14:00:26 来自手机 | 只看该作者
本帖最后由 winpefk 于 2024-11-30 14:07 编辑

你可以尝试一下find for windows,bash for windows,然后一个bash脚本:
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

    find $i: -d1 -name "name_of_file"
done

点评

用AI找到了相关的答案  发表于 2024-11-30 14:07
回复

使用道具 举报

3#
 楼主| 发表于 2024-11-30 14:04:43 | 只看该作者
本帖最后由 1G空间100元 于 2024-11-30 14:19 编辑

AI回答了但是这个脚本执行有问题:

@echo off
setlocal enabledelayedexpansion

set "filename=baiduseo.txt"
set "found="

for %%d 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 (
    if exist %%d:\ (
        if exist %%d:\%filename% (
            set "found=%%d:\%filename%"
            goto :found
        )
    )
)

:notfound
echo 文件 %filename% 在任何分区的根目录中未找到。
goto :eof

:found
echo 文件 %filename% 位于:!found!
goto :eof

:eof
pause



回复

使用道具 举报

4#
 楼主| 发表于 2024-11-30 14:05:07 | 只看该作者
脚本说明:
‌设置变量‌:

filename 变量存储你要查找的文件名(baiduseo.txt)。
found 变量用于存储找到的文件的完整路径。
‌遍历磁盘分区‌:

使用 for %%d 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) 循环遍历从C到Z的所有可能分区。
if exist %%d:\ 检查分区是否存在。
if exist %%d:\%filename% 检查该分区的根目录中是否存在指定的文件。
‌找到文件‌:

如果找到文件,将文件的完整路径存储在 found 变量中,并跳转到 :found 标签。
在 :found 标签下,输出找到的文件的路径,并使用 goto :eof 结束脚本。
‌未找到文件‌:

如果遍历所有分区后仍未找到文件,跳转到 :notfound 标签,输出未找到文件的消息,并使用 goto :eof 结束脚本。
将上述脚本保存为 .bat 文件(例如 search_file.bat),然后双击运行它。脚本会遍历各个分区的根目录,查找名为 baiduseo.txt 的文件,并在找到后立即输出其路径并退出。
回复

使用道具 举报

5#
发表于 2024-11-30 14:23:14 | 只看该作者
本帖最后由 wangyibin 于 2024-11-30 14:24 编辑

Grok-Beta 模型 回答 请自行验证!

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. REM 定义要搜索的文件名
  4. set "filename=baiduseo.txt"

  5. REM 定义一个变量来存储找到的文件路径
  6. set "foundfile="

  7. REM 获取所有驱动器列表
  8. for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "DriveType=3" get DeviceID /value') do (
  9.     set "drive=%%i"
  10.     if exist "!drive!%filename%" (
  11.         set "foundfile=!drive!%filename%"
  12.         echo 文件已找到: !foundfile!
  13.         goto :end
  14.     )
  15. )

  16. :end
  17. if defined foundfile (
  18.     echo %foundfile%
  19. ) else (
  20.     echo 文件未找到。
  21. )

  22. endlocal
复制代码

点评

助人为乐  详情 回复 发表于 2024-11-30 19:56
好像不行 明明我将baiduseo.txt放于G盘 搜索不到  详情 回复 发表于 2024-11-30 14:33

评分

参与人数 1无忧币 +3 收起 理由
yyz2191958 + 3

查看全部评分

回复

使用道具 举报

6#
 楼主| 发表于 2024-11-30 14:33:10 | 只看该作者
本帖最后由 1G空间100元 于 2024-11-30 14:34 编辑
wangyibin 发表于 2024-11-30 14:23
Grok-Beta 模型 回答 请自行验证!

好像不行 明明我将baiduseo.txt放于G盘根目录
搜索不到,另外有些系统已经没有wmic,用这个命令也不通用
回复

使用道具 举报

7#
发表于 2024-11-30 15:04:22 | 只看该作者
GPT-4o 模型 回答 加入 不使用 wmic 命令 请自行验证

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. :: 定义要搜索的文件名
  4. set filename=baiduseo.txt

  5. :: 获取所有磁盘驱动器盘符
  6. for /f "tokens=2 delims=" %%d in ('fsutil fsinfo drives') do (
  7.     set drive=%%d
  8.     echo Searching drive !drive!\

  9.     :: 搜索该分区根目录下是否有目标文件
  10.     dir !drive!\%filename% /a /b >nul 2>&1
  11.     if not errorlevel 1 (
  12.         echo File found: !drive!\%filename%
  13.         exit /b
  14.     )
  15. )

  16. echo File not found.
  17. endlocal
复制代码


解释:
  • fsutil fsinfo drives:获取系统上所有的驱动器(分区)。这个命令返回的是所有可用的磁盘分区的盘符信息,例如:C:\ D:\ E:\ 等。
  • for /f "tokens=2 delims=\" %%d:从 fsutil 返回的驱动器列表中提取每个盘符(例如 C:, D:)。
  • dir !drive!\%filename% /a /b >nul 2>&1:dir 命令查找每个分区根目录下是否有目标文件,并通过 /a 参数确保能够搜索隐藏文件(如有必要),通过 /b 参数简化输出。>nul 2>&1 将输出重定向,以避免显示无用的目录信息。
  • if not errorlevel 1:如果 dir 命令成功找到文件(返回码为 0),则表示文件存在,脚本将输出文件路径并结束执行。

使用方法:
  • 将此脚本保存为 .bat 文件(例如:find_baiduseo.bat)。
  • 双击运行该脚本,脚本会在所有磁盘分区的根目录下查找 baiduseo.txt 文件,找到后显示路径并停止搜索。

额外注意事项:
  • 确保你运行脚本时有足够的权限访问所有磁盘分区。如果没有权限,某些分区可能会被忽略。
  • 该脚本只在根目录下查找,不会深入子目录。
  • 如果 G 盘上有该文件却找不到,可能是由于文件的权限设置问题或磁盘的挂载问题。你可以手动检查 G:\ 根目录是否真的存在该文件。
回复

使用道具 举报

8#
发表于 2024-11-30 15:49:51 | 只看该作者
@echo off
for %%a in (C D E F G H I J K L M N O P Q R S T U V W Y Z) do if exist "%%a:\baiduseo.txt" set panfu=%%a:
echo %panfu%
pause

点评

这个可以 前面AI回答的不行  发表于 2024-11-30 21:14
回复

使用道具 举报

9#
发表于 2024-11-30 16:09:45 | 只看该作者
学习一下!
回复

使用道具 举报

10#
发表于 2024-11-30 16:12:35 | 只看该作者
纯bat就好吧
@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 (if exist "%%i:\baiduceo.txt" (set "vol=%%i:"))
echo %vol%&pause

点评

会提示:ECHO 处于关闭状态  详情 回复 发表于 2024-11-30 21:27
好人  详情 回复 发表于 2024-11-30 19:57

评分

参与人数 1无忧币 +3 收起 理由
yyz2191958 + 3

查看全部评分

回复

使用道具 举报

11#
发表于 2024-11-30 17:58:17 | 只看该作者
学习了
回复

使用道具 举报

12#
发表于 2024-11-30 19:56:06 | 只看该作者
wangyibin 发表于 2024-11-30 14:23
Grok-Beta 模型 回答 请自行验证!

助人为乐
回复

使用道具 举报

13#
发表于 2024-11-30 19:57:00 | 只看该作者
lsw13227 发表于 2024-11-30 16:12
纯bat就好吧
@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 (if exist "% ...

好人
回复

使用道具 举报

14#
发表于 2024-11-30 20:11:30 | 只看该作者
本帖最后由 2012雨晨绿软 于 2024-12-1 11:54 编辑
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. 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 if exist "%%a:" for /f "delims=" %%i in ('dir /b /s /a-d "%%a:\*.txt"^|find /i "baiduseo"') do set "filespth=%%i"
  4. echo.
  5. echo   %filespth%
  6. pause
  7. exit
复制代码

测试.7z (41.19 KB, 下载次数: 5)





点评

原来光标一直闪烁是在搜索中 测试这个代码是有效的 好像也搜索子目录 就时间久一点  发表于 2024-12-1 13:24
有可能是我系统有问题?  发表于 2024-11-30 21:30
按图片中的代码执行 好像不行 一直停留在光标闪烁那  发表于 2024-11-30 21:29
回复

使用道具 举报

15#
 楼主| 发表于 2024-11-30 21:27:01 | 只看该作者
lsw13227 发表于 2024-11-30 16:12
纯bat就好吧
@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 (if exist "% ...

会提示:ECHO 处于关闭状态
回复

使用道具 举报

16#
发表于 2024-11-30 23:29:49 | 只看该作者
  1. @echo off
  2.   for /f "tokens=1* delims=: " %%1 in (' fsutil.exe fsinfo drives^|find ":" ') do set "dl=%%2"
  3.    set "dl=%dl::\=%"
  4. for %%a in ( %dl% ) do if exist "%%a:\baiduseo.txt" set panfu=%%a:
  5. echo %panfu%
  6. pause
  7. exit /b
复制代码

点评

在我的电脑上执行只会显示ECHO 处于关闭状态,另外感觉我发的代码更简单明了  详情 回复 发表于 2024-12-1 12:34
助人为乐  详情 回复 发表于 2024-12-1 09:58
这个有效  发表于 2024-12-1 02:05

评分

参与人数 1无忧币 +3 收起 理由
yyz2191958 + 3

查看全部评分

回复

使用道具 举报

17#
发表于 2024-12-1 09:58:54 | 只看该作者
回复

使用道具 举报

18#
发表于 2024-12-1 10:27:51 | 只看该作者
来了解一下
回复

使用道具 举报

19#
发表于 2024-12-1 10:48:13 | 只看该作者
学习一下
回复

使用道具 举报

20#
发表于 2024-12-1 11:42:58 | 只看该作者
先建一个记事本文件,将内容复制进去,保存并关闭,修改扩展名TXT为CMD,然后双击运行即可
回复

使用道具 举报

21#
发表于 2024-12-1 11:50:30 | 只看该作者
给你强化了一下,只搜索存在的分区

点评

原来光标一直闪烁是在搜索中 测试这个代码是有效的 好像也搜索子目录 就时间久一点  发表于 2024-12-1 13:25
回复

使用道具 举报

22#
发表于 2024-12-1 12:34:09 | 只看该作者

在我的电脑上执行只会显示ECHO 处于关闭状态,另外感觉我发的代码更简单明了

点评

哪是因为你的电脑各分区根目录下没有文件 baiduceo.txt 完整版如下:  详情 回复 发表于 2024-12-1 19:43
回复

使用道具 举报

23#
发表于 2024-12-1 14:06:58 | 只看该作者
@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 (if exist "%%i:\baiduceo.txt" (set "vol=%%i:"))
echo %vol%&pause
以上代码,当各盘都不存在baiduceo.txt时vol未赋值所以显示echo关闭状态,当有多个盘中存在baiduceo.txt时会取最后一个盘,如果想取第一个搜到的盘可以 用goto跳转。例:
@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 (if exist "%%i:\baiduceo.txt" (set "vol=%%i:"&goto :_test))
if "%vol%"=="" echo 没有一个盘中存在baiduceo.txt&pause
:_test
echo %vol%&pause
回复

使用道具 举报

24#
发表于 2024-12-1 19:43:05 | 只看该作者
本帖最后由 青青草 于 2024-12-1 19:50 编辑
2012雨晨绿软 发表于 2024-12-1 12:34
在我的电脑上执行只会显示ECHO 处于关闭状态,另外感觉我发的代码更简单明了

哪是因为你的电脑各分区根目录下没有文件 baiduceo.txt
另外,我的代码还有查找电脑所有可用盘符的功能。
完整版如下:
  1. @echo off
  2.   for /f "tokens=1* delims=: " %%1 in (' fsutil.exe fsinfo drives^|find ":" ') do set "dl=%%2"
  3.    set "dl=%dl::\=%"
  4. echo 我的电脑所有可用盘符:%dl%
  5. for %%a in ( %dl% ) do if exist "%%a:\baiduseo.txt" set panfu=%%a:
  6. if "%panfu%" NEQ ""  echo 存在文件的位置为  %panfu%\
  7. if "%panfu%"=="" echo 各分区根目录下没有文件 baiduceo.txt
  8. pause
  9. exit /b
复制代码



点评

这个可用 点赞  发表于 2024-12-1 20:28
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-26 18:25

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表