Shell 使用单个字符串查找多个文件路径

Shell 使用单个字符串查找多个文件路径,shell,batch-file,Shell,Batch File,我试图编写一个批处理脚本,查找与输入字符串同名的文件的所有路径。现在它只能找到找到的第一个文件,我想不出一种方法让它列出多个文件的位置。我不是很有经验,我需要一些帮助 这是脚本代码的一部分: :start cls echo Enter file name with extension: set /p filename= echo Searching... for %%a in (C D E F G H U W) do ( for /f "tokens=*

我试图编写一个批处理脚本,查找与输入字符串同名的文件的所有路径。现在它只能找到找到的第一个文件,我想不出一种方法让它列出多个文件的位置。我不是很有经验,我需要一些帮助

这是脚本代码的一部分:

:start
    cls
    echo Enter file name with extension:
    set /p filename=
    echo Searching...

for %%a in (C D E F G H U W) do (
    for /f "tokens=*" %%b in ('dir /s /b "%%a:\%filename%"') do (
        set file=%%~nxb
        set datapath=%%~dpb\
        ::the path of the file without the filename included "C:\folder\folder\"
        set fullpath=%%b
        ::the path of the file with the filename included "C:\folder\folder\file"
        goto break
  )
)
:notfound
    cls
    echo Enter file name with extension:
    echo %filename%
    echo File Not Found!
    ping localhost -n 4 >nul
    goto start

:break
    if "%datapath:~-1%"=="\" set datapath=%datapath:~,-1%
    cls
    echo 3 %filename% found
    echo %fullpath1%
    echo %fullpath2%
    echo %fullpath3%
    --- || ---
我希望脚本搜索计算机,列出所有遇到的同名文件,并将这些文件的路径放入不同的变量中。
例如,如果readme.txt是输入,那么我需要具有该特定名称(readme.txt)的所有文件的所有路径的列表,并且我要为每个路径设置变量,以便之后可以使用它

input:  
readme.txt

output:  
3 files found  
C:\folder\folder\readme.txt  
C:\folder\folder\folder\readme.txt  
D:\folder\readme.txt
我认为没有必要将文件名设置为变量,因为您可以在循环中处理它们。但是,如果您确实需要变量中的它们(出于某种原因):

@echo off
setlocal enabledelayedexpansion
set filename=readme.txt
set count=0
for %%a in (C D E F G H U W) do (
  for /f "tokens=*" %%b in ('dir /s /b "%%a:\%filename%" 2^>nul') do (
    set /a count+=1
    set _file[!count!]=%%b
  )
)
set _file

您可以尝试使用以下代码:

@echo关闭
标题搜索具有相同文件名的路径
模式con cols=80行=3和颜色9E
设置/a计数=0
设置/a cnt=1
设置“FileName=Readme.txt”
设置“Report=%~dp0Report.txt”
设置“Folder2Copy=%~dp0Readme\u文件夹”
设置“Result2Copy=%~dp0Result2Copy.txt
如果存在%Folder2Copy%RD/S/Q%Folder2Copy%
如果存在%Report%Del%Report%
如果存在%Result2Copy%Del%Result2Copy%
回音(
Echo搜索具有相同文件名的路径
Rem查找固定驱动器并将其存储到变量中
SETLOCAL enabledelayedexpansion
对于('wmic LOGICALDISK where driveType^=3 get deviceID')中的/f“skip=1”%%a,执行以下操作(
对于/f“delims=“%%b in(“%%a”)do(
设置/a“计数+=1”
设置“驱动器[!计数!]=%%b”
)
)
:显示
对于(1,1,%Count%)中的/L%%i,请执行以下操作(
cls
标题请稍候…正在“!驱动器[%%i]!\”上搜索“%FileName%”
回音(
echo请稍候…正在“!驱动器[%%i]!\”上搜索“%FileName%”
调用:FindPathFile!驱动器[%%i]!\%FileName%>>%Report%
)
开始报告%
后藤:问一个问题
::***************************************************************************************
:FindPathFile
Where.exe/r%1%2
后藤:eof
::***************************************************************************************
:提问
cls和模式con cols=100行=5行
回音(
echo是否要将找到的所有文件复制为名称“%FileName%”
是否已在“%Report%”上保存回显?(是/否)?
设置/p“输入=”
如果/I“%INPUT%”=Y(
对于/f“delims=“%%i in('类型“%Report%”)do(
调用:生成副本“%%~i”“%Folder2Copy%\”
)
)
调用:资源管理器“%Folder2Copy%\”&退出
如果/I“%INPUT%”=N(
出口
)
后藤:eof
::***************************************************************************************
:制作副本
如果不存在“%$2\”MD“%$2\”(
如果不存在“%2\%~n1”(
回显将“%$1”复制到“%$2”
复制/N/B“%~1”“%~2”>>%Result2Copy%2>&1
)其他(
调用:循环“%~1”“%~2”
)
)
::***************************************************************************************
:循环
设置“fname=%2\%~n1(%cnt%)%~x1”
如果存在“%fname%”,则设置/a cnt+=1&&goto:loop
复制“%~1”“%fname%”
退出/b
::***************************************************************************************
:资源管理器
explorer.exe/e,/select,“%~1”
后藤:EOF
::***************************************************************************************

用于%%a英寸(C D E F G H U W)do dir/s/b%%a:\%filename%2>nul
-足够短吗?是的,很好。但问题是脚本也有复制或删除文件的选项。这就是为什么我添加了完整路径和数据路径,但这一行只列出了它们,我不能使用路径。但是谢谢你的帮助!谢谢!但这只解决了长度问题效率问题…我仍然需要多个同名文件的帮助…不理解;每个查找都是唯一的(驱动器+路径+文件名+扩展名)。如果您只想使用文件名,您应该能够找到一些有用的内容。我希望脚本搜索计算机并列出遇到的所有同名文件,并且能够将这些文件的路径放入不同的变量中。例如,如果输入的是readme.txt,则我希望列出所有文件的所有路径具有该特定名称(readme.txt)的我想为每个路径设置一个变量,这样我就可以在之后使用它。这很好,谢谢!我只是不理解代码中的一些东西。总之,我找到了一种方法,通过使用循环,同时找到一个路径,然后将它放入一个变量中,在找到下一个之后再进行更改。效率不高,但也不太复杂我也是。
@echo off
setlocal enabledelayedexpansion
set filename=readme.txt
set count=0
for %%a in (C D E F G H U W) do (
  for /f "tokens=*" %%b in ('dir /s /b "%%a:\%filename%" 2^>nul') do (
    set /a count+=1
    set _file[!count!]=%%b
  )
)
set _file