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

