You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并文件名末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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:28:12