PowerShell压缩文件时如何筛选文件名匹配的关联PDF与XML文件
PowerShell压缩文件时如何筛选文件名匹配的关联PDF与XML文件
嗨,我完全懂你的需求——你现在需要把那些文件名里带有相同数字串的PDF和XML配对起来,只打包这些关联文件,对吧?咱们一步步来搞定这个问题:
首先,先理清楚文件名的规律:你的PDF是aaa_bb_cc_123456789.pdf格式,对应的XML是123456789.xml,核心就是要提取PDF文件名最后下划线后面的数字部分,然后找到文件名完全等于这个数字的XML文件。
具体实现步骤
- 先筛选出符合时间、数量要求的PDF文件,同时提取每个PDF的匹配ID(就是文件名末尾的那串数字)
- 预先收集所有符合时间条件的XML文件,方便快速查找
- 把PDF和对应的XML配对,收集所有需要打包的文件
- 最后执行压缩操作
完整代码示例
# 定义你的源路径、数量和时间参数(替换成你实际的值) $SourcePath = "C:\Your\Source\Directory" $quantity = 10 # 你要选的文件数量 $time = 30 # 最后修改时间小于当前时间减去X分钟 # 第一步:筛选PDF并提取匹配ID $pdfFiles = Get-ChildItem -Path $SourcePath -Include "*.pdf" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddMinutes($time)} | Select-Object -First $quantity | ForEach-Object { # 拆分PDF文件名,取最后一段(也就是数字ID) $matchID = $_.BaseName -split '_' | Select-Object -Last 1 # 返回包含文件和匹配ID的自定义对象 [PSCustomObject]@{ File = $_ MatchID = $matchID } } # 第二步:收集所有符合时间条件的XML文件 $allXmlFiles = Get-ChildItem -Path $SourcePath -Include "*.xml" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddMinutes($time)} # 第三步:配对PDF和XML,收集要打包的文件 $filesToZip = @() foreach ($pdf in $pdfFiles) { # 查找文件名等于匹配ID的XML文件 $matchingXml = $allXmlFiles | Where-Object {$_.BaseName -eq $pdf.MatchID} if ($matchingXml) { # 如果找到对应XML,就把PDF和XML都加入打包列表 $filesToZip += $pdf.File $filesToZip += $matchingXml } } # 第四步:执行压缩(-Update参数可以避免重复打包已存在的文件,按需调整) if ($filesToZip.Count -gt 0) { Compress-Archive -Path $filesToZip -DestinationPath "C:\Your\Target\Archive.zip" -Update Write-Host "成功打包了$($filesToZip.Count)个文件" } else { Write-Host "没有找到符合条件的配对文件" }
额外说明
- 如果你的数字ID格式有变化(比如不是下划线分隔,或者长度固定),可以调整
-split '_'这部分逻辑,比如用正则表达式提取数字:$matchID = [regex]::Match($_.BaseName, '\d+$').Value(这个正则会匹配文件名末尾的所有数字) - 如果存在多个XML对应同一个ID的情况,可以在
$matchingXml后面加| Select-Object -First 1来只取第一个匹配的XML - 代码里加了判断
$filesToZip.Count -gt 0,避免空列表导致压缩出错
备注:内容来源于stack exchange,提问作者seagull46
相关产品推荐
相关产品推荐

