批处理脚本循环遍历目录的子目录,然后在每个子目录的子路径中搜索文件模式

批处理脚本循环遍历目录的子目录,然后在每个子目录的子路径中搜索文件模式

我有一个常见的问题,即我在服务器上有多个客户端设置,并且想要在每个客户端中的特定文件夹中检查文件名或文件搜索模式。

例如我可能有这样的设置:

D:\AllClients\
    |_____ClientA\
            |____Specific\Subpath\
                             |_____MyFilename.html
    |_____ClientB\
            |____Specific\Subpath\

我需要它查找每个客户端目录的特定子路径,并返回具有提供的文件名或文件搜索模式的任何现有文件的路径。

即我需要循环遍历给定目录内的子目录,然后在子路径内搜索文件模式(当然,除非有更好的方法,我可以使用通配符来显示客户端目录的名称)。

到目前为止我有这个:

@echo off
setlocal
setlocal enabledelayedexpansion

set filename=MyFilename.html
set basePath=D:\AllClients
set subPath=\Specific\Subpath\

echo %basePath%

for /D %%G in (%basePath%\*)  do (

    @set _searchPath=%%G%subPath%
    @echo Searching !_searchPath!
    @for /r "!_searchPath!" %%a in (%filename%) do (
        @echo ...%%a
        @IF EXIST "%%a" (
            @echo ...%%a
        )
    )

)

它给我打印出来的正确的搜索路径,但我的用户路径似乎被添加到了%%a 的前面。

答案1

PowerShell 看起来如下:

$Root = 'D:\AllClients'
$SubPath = 'Specific\Subpath'
$FileName = 'FileName.html'

$FilePath = Join-Path $SubPath $FileName
Get-ChildItem $Root -Directory | ForEach {
    $Path = Join-Path $_.FullName $FilePath
    If ( Test-Path $Path ) {
        Write-Output "Found: $Path"
    } Else {
        Write-Output ('File not found in: {0}' -f ( Split-Path $Path ))
    }
}

答案2

where您可以使用/在循环中简化此搜索R递归,将find循环的输出限制在其子路径上

@echo off && setlocal enabledelayedexpansion

set "_basePath=D:\AllClients"
set "_fileName=MyFilename.html"
set "_subPath=\Specific\Subpath"

echo\Searching !_basePath!!_subPath!.. & for /f tokens^=* %%i in ('
2^>nul where /r  "!_basePath!" "!_fileName!" ^| find/i "!_subPath!"
')do echo\Found: "%%~i" & echo\Path: "%%~dpi" & echo\Name: "%%~nxi"

timeout /t -1 & endlocal
  • 或者...
@echo off

setlocal enabledelayedexpansion

set "_basePath=D:\AllClients"
set "_fileName=MyFilename.html"
set "_subPath=\Specific\Subpath"

echo\Searching !_basePath!!_subPath!.. 

for /f tokens^=* %%i in ('2^>nul where /r  "!_basePath!" "!_fileName!" ^| find /i "!_subPath!"') do (
    echo\File Found: %%~i
    echo\File Path: %%~dpi 
    echo\File Name: %%~nxi
)

timeout /t -1 & endlocal

使用args[]

arg[1] fileName == %~1
arg[2] basePath == %~2
arg[3] subPath == %~3

@echo off && setlocal enabledelayedexpansion

echo\Searching %~2 %~3.. 
for /f tokens^=* %%i in ('2^>nul where /r  "%~2" "%~1" ^|find/i "%~3"
')do echo\Found: "%%~i" && echo\Path: "%%~dpi" && echo\Name: "%%~nxi"

timeout /t -1 & endlocal

不设置变量也一样:

@echo off && setlocal enabledelayedexpansion

echo\Searching D:\AllClients \Specific\Subpath... 

for /f tokens^=* %%i in ('
2^>nul where /r "D:\AllClients" "MyFilename.html" ^| find/i "\Specific\Subpath"
')do echo\Found: "%%~i" && echo\File Path: "%%~dpi" && echo\file Name: "%%~nxi"

timeout /t -1 & endlocal

相关内容