使用双循环识别同名XML与PDF文件的问题求助
解决XML与PDF文件匹配检测的PowerShell代码问题
问题分析
你的代码逻辑存在两个关键错误:
- 第一个
foreach循环中使用的$PDFfile变量未定义,它是第二个循环的迭代变量,此时还未初始化,导致所有XML文件都会被判定为无匹配PDF。 - 第二个
foreach循环中使用的$XMLfile变量是第一个循环的迭代变量,循环结束后仅保留最后一个XML文件的引用,无法正确与所有PDF文件对比。
正确解决方案
方法一:直接通过基名匹配(适合文件数量较少的场景)
$Folder = "E:\Monitoring\CCRChannels\Delivery\" $XMLFiles = Get-ChildItem $Folder -Filter "*.xml" $PDFFiles = Get-ChildItem $Folder -Filter "*.pdf" # 检查每个XML是否对应同名PDF foreach($xml in $XMLFiles) { $baseName = $xml.BaseName $matchingPdf = $PDFFiles | Where-Object { $_.BaseName -eq $baseName } if ($matchingPdf) { Write-Host "$($xml.Name) 存在匹配的PDF文件" -ForegroundColor Green } else { Write-Host "$($xml.Name) 没有匹配的PDF文件" -ForegroundColor Red } } Write-Host "`n---分割线---`n" # 检查每个PDF是否对应同名XML foreach($pdf in $PDFFiles) { $baseName = $pdf.BaseName $matchingXml = $XMLFiles | Where-Object { $_.BaseName -eq $baseName } if ($matchingXml) { Write-Host "$($pdf.Name) 存在匹配的XML文件" -ForegroundColor Green } else { Write-Host "$($pdf.Name) 没有匹配的XML文件" -ForegroundColor Red } }
方法二:使用哈希表提升匹配效率(适合文件数量较多的场景)
哈希表的查找速度远快于遍历集合,大量文件时能显著提升效率:
$Folder = "E:\Monitoring\CCRChannels\Delivery\" $XMLFiles = Get-ChildItem $Folder -Filter "*.xml" $PDFFiles = Get-ChildItem $Folder -Filter "*.pdf" # 构建PDF文件基名的哈希表 $pdfHash = @{} foreach($pdf in $PDFFiles) { $pdfHash[$pdf.BaseName] = $true } # 检测XML匹配情况 foreach($xml in $XMLFiles) { if ($pdfHash.ContainsKey($xml.BaseName)) { Write-Host "$($xml.Name) 存在匹配的PDF文件" -ForegroundColor Green } else { Write-Host "$($xml.Name) 没有匹配的PDF文件" -ForegroundColor Red } } Write-Host "`n---分割线---`n" # 构建XML文件基名的哈希表 $xmlHash = @{} foreach($xml in $XMLFiles) { $xmlHash[$xml.BaseName] = $true } # 检测PDF匹配情况 foreach($pdf in $PDFFiles) { if ($xmlHash.ContainsKey($pdf.BaseName)) { Write-Host "$($pdf.Name) 存在匹配的XML文件" -ForegroundColor Green } else { Write-Host "$($pdf.Name) 没有匹配的XML文件" -ForegroundColor Red } }
内容的提问来源于stack exchange,提问作者Lee Nolan Bolger
相关产品推荐
相关产品推荐

