我有一个大约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,但都没有找到任何文件。任何人都可以帮忙。
答案 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*
(包括空格),而*
可能不是或任何角色。