合并文件名末8位相同的PDF失败求助:PowerShell+PDFtk问题排查
排查PowerShell调用PDFtk合并PDF失败的问题
主要错误点分析
- CSV输出路径无效:原代码中
$outputCsvPath的路径是"F:\9.enter image description herePOWERSHELL",这不是合法的.csv文件路径,会导致Export-Csv执行失败,甚至中断流程。 - PDFtk参数传递错误:
Start-Process的-ArgumentList里@$listFilePath写法错误,PDFtk识别列表文件的语法是@文件名,需要将@和文件路径作为完整参数传递,原写法会被PowerShell解析为数组展开,导致工具无法识别列表文件。 - 列表文件格式问题:用
Out-String生成的内容会包含多余空行,PDFtk读取时可能将空行视为无效路径;同时默认编码可能不兼容PDFtk的要求。 - 未捕获执行错误:
Start-Process默认不显示命令执行的错误信息,即使PDFtk失败也无法看到具体原因,难以排查。 - 分组逻辑有风险:使用
$_.Name.Substring($_.Name.Length - 12, 8)时,若文件名长度不足12字符会直接抛出异常,没有容错处理。
修正后的代码
# 定义主目录路径 $generalFolderPath = 'F:\9.POWERSHELL' # 修正为合法的CSV输出路径 $outputCsvPath = "$generalFolderPath\merged_files_info.csv" # 创建合并结果目录(不存在则创建) $destinationDir = "$generalFolderPath\Merged" if (!(Test-Path -Path $destinationDir)) { New-Item -ItemType Directory -Path $destinationDir | Out-Null } # 获取主目录及子目录下所有PDF文件 $pdfFiles = Get-ChildItem -Path $generalFolderPath -Recurse -Filter *.pdf # 按文件名倒数12位开始的8个字符分组(增加长度判断避免报错) $groupedFiles = $pdfFiles | Group-Object { if ($_.Name.Length -ge 12) { $_.Name.Substring($_.Name.Length - 12, 8) } else { $_.Name # 短文件名单独分组,防止异常 } } # 存储合并文件信息的数组 $mergedFilesInfo = @() foreach ($group in $groupedFiles) { $key = $group.Name $fileList = $group.Group if ($fileList.Count -ge 1) { # 匹配注释逻辑,允许合并单个文件(若需要仅合并多个可改回-gt 1) # 生成PDFtk用的临时列表文件 $listFilePath = "$generalFolderPath\filelist_$key.txt" # 直接写入文件路径,避免空行问题,使用ASCII编码兼容PDFtk $fileList | ForEach-Object { $_.FullName } | Set-Content -Path $listFilePath -Encoding ASCII # 定义合并后文件路径 $outputFilePath = "$destinationDir\merged_$key.pdf" $pdftkPath = "C:\Program Files (x86)\PDFtk\bin\pdftk.exe" # 改用&直接调用PDFtk,便于捕获错误输出 try { & $pdftkPath @"$listFilePath" cat output "$outputFilePath" if ($LASTEXITCODE -eq 0) { # 合并成功才记录信息 $mergedFileInfo = [PSCustomObject]@{ MergedFileName = $outputFilePath SourceFileCount = $fileList.Count } $mergedFilesInfo += $mergedFileInfo Write-Host "成功合并 $($fileList.Count) 个文件到 $outputFilePath" } else { Write-Host "分组 $key 合并失败,PDFtk退出码:$LASTEXITCODE" } } catch { Write-Host "执行PDFtk处理分组 $key 时出错:$_" } # 删除临时列表文件 if (Test-Path -Path $listFilePath) { Remove-Item -Path $listFilePath -Force } } } # 导出合并信息到CSV if ($mergedFilesInfo.Count -gt 0) { $mergedFilesInfo | Export-Csv -Path $outputCsvPath -NoTypeInformation -Encoding UTF8 Write-Host "合并完成,合并文件路径已保存到 $outputCsvPath" } else { Write-Host "没有文件被合并。" }
额外说明
- 改用
&调用PDFtk可直接在控制台查看错误信息,方便排查文件无法访问、PDF损坏等问题。 - 通过
LASTEXITCODE判断PDFtk执行状态,成功时退出码为0,非0则表示执行失败。 - 增加了文件名长度判断,避免短文件名导致的分组异常。
内容的提问来源于stack exchange,提问作者Pham KS
相关产品推荐
相关产品推荐

