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

PowerShell循环处理PDF拆分问题求助:多文件仅移动未拆分

问题分析与修复:PowerShell批量拆分PDF并移动脚本失效

嘿,我帮你找出了脚本里的几个关键问题,这就是为什么批量处理时只有移动操作生效、拆分完全没工作的原因:

核心错误点

  • 提前全局获取页数的逻辑错误:你在ForEach-Object循环外面就用pdftk $pdfFile dump_data获取页数,但$pdfFile是通配符路径C:\Temp\Incoming\*.pdf,pdftk处理多个文件时只会返回第一个文件的页数,后面的文件根本没被正确读取页数,导致拆分逻辑完全失效。
  • 循环内未使用当前文件对象:在循环里你一直引用全局的$pdfFile(通配符),而不是当前遍历到的文件$_,这会让pdftk每次都尝试处理所有PDF,Get-Item $pdfFile也只会拿到第一个文件,完全没处理循环里的每个文件。
  • 移动逻辑冗余且时机错误:你在每个文件处理完后两次扫描整个目录移动文件,不仅重复操作,还可能把刚拆分的文件和原文件混在一起移动,逻辑混乱。

修正后的完整脚本

$pdfPath = 'C:\Temp\Incoming'
$pdfoutPath = 'C:\Temp\Completed'
$SetsOfPages = 1  # 每页拆分为一个单独文件,可根据需求调整

# 遍历目录下所有PDF文件,逐个处理
Get-ChildItem -Path $pdfPath -Filter '*.pdf' | ForEach-Object {
    $currentFile = $_
    Write-Host "===== 开始处理文件: $($currentFile.Name) ====="

    # 获取当前单个PDF的总页数
    $pageMatchPattern = 'NumberOfPages: (\d+)'
    $pdfMetadata = pdftk $currentFile.FullName dump_data
    $totalPages = [regex]::Match($pdfMetadata, $pageMatchPattern).Groups[1].Value

    # 容错处理:如果无法获取页数则跳过
    if (-not $totalPages) {
        Write-Warning "无法读取文件 $($currentFile.Name) 的页数,已跳过该文件"
        return
    }

    Write-Host "$($currentFile.Name) 共有 $totalPages 页"

    # 执行拆分逻辑
    for ($currentPage = 1; $currentPage -le $totalPages; $currentPage += $SetsOfPages) {
        $endPage = [Math]::Min($currentPage + $SetsOfPages - 1, $totalPages)
        $pageRange = "${currentPage}-${endPage}"  # pdftk需要的正确范围格式
        $outputFilePath = Join-Path -Path $pdfoutPath -ChildPath "$($currentFile.BaseName)_$pageRange.pdf"
        
        Write-Host "生成拆分文件: $outputFilePath"
        pdftk $currentFile.FullName cat $pageRange output $outputFilePath
    }

    # 移动拆分后的文件到按日期分类的目录
    $splitFiles = Get-ChildItem -Path $pdfoutPath -Filter "$($currentFile.BaseName)_*.pdf"
    foreach ($splitFile in $splitFiles) {
        $fileDate = Get-Date -Date $splitFile.LastWriteTime
        $yearDir = $fileDate.Year
        $monthDir = $fileDate.ToString("MM")
        $dayDir = $fileDate.ToString("dd")
        $targetDir = Join-Path -Path $pdfoutPath -ChildPath "$yearDir\$monthDir\$dayDir"

        # 自动创建目标目录(如果不存在)
        if (-not (Test-Path -Path $targetDir)) {
            New-Item -ItemType Directory -Path $targetDir | Out-Null
        }

        # 移动文件
        Move-Item -Path $splitFile.FullName -Destination $targetDir -Force
        Write-Host "已移动拆分文件至: $targetDir"
    }

    # 移动原PDF文件到相同的日期目录(可选,不需要的话可以注释掉)
    $originalTargetDir = Join-Path -Path $pdfoutPath -ChildPath "$($fileDate.Year)\$($fileDate.Month)\$($fileDate.Day)"
    Move-Item -Path $currentFile.FullName -Destination $originalTargetDir -Force
    Write-Host "已移动原文件至: $originalTargetDir"
}

关键改动说明

  1. 单个文件独立处理:把获取页数、拆分的逻辑都放到ForEach-Object循环内部,每次只处理当前的$_文件,确保每个PDF都被单独读取页数和拆分。
  2. 修正页数获取逻辑:用$currentFile.FullName代替通配符路径,让pdftk只处理当前单个文件,正确获取每个文件的实际页数。
  3. 修复pdftk范围格式:原脚本的$Range格式错误,pdftk的cat命令需要1-1这样的范围格式,这里改成了符合要求的格式。
  4. 优化移动逻辑:只移动当前文件拆分出来的文件,避免扫描整个输出目录,同时把原文件和拆分文件统一移动到按修改日期分类的目录,逻辑更清晰。
  5. 增加容错机制:如果无法读取某个PDF的页数,会发出警告并跳过该文件,避免脚本意外崩溃。

内容的提问来源于stack exchange,提问作者Miek Pool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:15:39