cmd 从部分文件名列表中搜索文件,然后复制到文件夹

cmd Search for files from list of partial filenames then copy to folder

我有一个包含大约 120,000 个文件名的文本文件列表。列表中的许多文件都位于文件夹或其子文件夹中,但文件名略有不同。

所以我想使用部分文件名列表进行搜索并将匹配项复制到另一个文件夹。

列表中的每一行都是一个名称和一个用横线分隔的标题,例如:

A Name|The Title
John Smith|A Life

这些文件是各种文本格式,文件名中都有额外的内容,例如:

A Name - The Title V1.4 (html).lit
John Smith - A Life: Living on the Edge [MD] (pdf).rar

我试过 this thread 中的代码 和 this thread 但都找不到任何文件。有谁能帮忙吗

可能不是您正在寻找的解决方案,但我几年前就放弃了批处理脚本。我改用 Powershell,只需从批处理文件中调用 Powershell 脚本。

如果您有兴趣,这是代码,

搜索文件。ps1

$searchStrings = @("city", "sniper") # Declare an array to iterate over.

foreach ($string in $searchStrings) {
    Get-ChildItem -Path D:\Movies\Movies | ? { $_ -match $string }
}

现在从批处理文件中调用 Powershell 脚本。

searchfiles.bat

Powershell.exe -ExecutionPolicy RemoteSigned -Command "& searchfiles.ps1 -Verb RunAs"

希望对您有所帮助!

这并不是说我根本不使用批处理脚本。我只会将它们用于更简单的操作,例如调用另一个脚本或打开文件夹等。使用 Powershell,我喜欢借助底层 .NET 框架和出色的管道!

调整一下路径,你应该对这个很好:

@ECHO OFF


REM **************************************************

REM Adjust location of list
SET list=C:\adjust\path\list.txt

REM Source dir
SET source=C:\adjust\path\source

REM Target dir
SET destination=C:\adjust\path\destination

REM **************************************************



FOR /F "tokens=1,* delims=|" %%A IN (%list%) DO (
    ECHO.
    ECHO %%A - %%B
    CALL :copy "%%A - %%B"
)   

ECHO.
ECHO Done^!
PAUSE
EXIT

:copy
FOR /R "%source%" %%F IN (*) DO (
    ECHO "%%~nF" | FINDSTR /C:%1 >nul && COPY "%%~fF" "%destination%\%%~nxF" && EXIT /B
)
EXIT /B

注意:这要求 list.txt 中的方案为 A|B 并且要复制的每个文件的方案为 *A - B*(包括空格),而 * 可能没有或任何字符。

此 PowerShell 脚本假定如果第一个字段 "name" 和第二个字段 "title" 都在文件名中的任何位置,则应将其复制。当您确信将复制正确的文件时,从 Copy-Item 命令中删除 -WhatIf

请注意,这并未解决多个同名文件的问题。

如果您希望 "name" 字段位于字符串的开头,您可以将其添加到匹配表达式中。 $_.Name -match '^'+$pair.name。如果您希望匹配区分大小写,请使用 -cmatch.

$sourcepath = 'C:\src'
$targetpath = 'C:\other'

$searchpairs = Import-Csv -Header "name","title" -Delimiter "|" -Encoding ASCII -path .\mdb.txt

foreach ($pair in $searchpairs) {
    Get-ChildItem -Recurse -File -Path $sourcepath |
        Where-Object { ($_.Name -match $pair.name) -and ($_.Name -match $pair.title) } |
        ForEach-Object { Copy-Item $_.FullName $targetpath -WhatIf}
}