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

时间:2018-01-31 00:01:49

标签: windows batch-file cmd text-processing

我有一个大约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,但都没有找到任何文件。任何人都可以帮忙。

3 个答案:

答案 0 :(得分:1)

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

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

如果您想要"名称"如果字段位于字符串的开头,则可以将其添加到匹配表达式中。 $_.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}
}

答案 1 :(得分:0)

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

以下是您感兴趣的代码,

<强> searchfiles.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框架和甜美的管道!

答案 2 :(得分:0)

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

@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*(包括空格),而*可能不是或任何角色。