使用PowerShell与PDFTK合并子目录PDF后自动移至父目录的需求
优化PDF合并脚本:自动将合并文件移至父目录
我帮你调整了PowerShell脚本,除了保留原本的PDF合并功能,还会自动把合并好的文件移动到子目录的父目录里,不用再手动操作啦!
修改后的完整脚本
$pdftk = "C:\SymLinks\Combine\pdftk.exe" $inputFolder = "I:\Fort Gibson-DONE" # 递归遍历所有PDF,按目录分组处理 Get-ChildItem $inputFolder -Recurse -Include *.pdf | Sort-Object | Group-Object DirectoryName | ForEach-Object { # 提取子目录的名称,作为合并后PDF的文件名 $subDirName = Split-Path $_.Name -Leaf $mergedPdfPath = Join-Path $_.Name "$subDirName.pdf" # 执行PDF合并操作 & $pdftk $_.group CAT OUTPUT $mergedPdfPath # 检查合并是否成功,再执行移动操作 if (Test-Path $mergedPdfPath) { # 获取子目录的父目录路径(目标路径) $parentDir = Split-Path $_.Name -Parent $targetPath = Join-Path $parentDir "$subDirName.pdf" # 移动文件,-Force参数会覆盖父目录中同名文件(可根据需求移除) Move-Item -Path $mergedPdfPath -Destination $targetPath -Force Write-Host "✅ 已完成:合并并移动文件至 $targetPath" } else { Write-Warning "⚠️ 合并失败:未生成文件 $mergedPdfPath" } }
关键改动说明
- 获取父目录路径:用
Split-Path $_.Name -Parent直接拿到子目录的上级目录,也就是你要存放合并文件的位置 - 文件存在验证:加了
Test-Path检查合并后的PDF是否生成成功,避免移动不存在的文件 - 可选覆盖控制:
Move-Item的-Force参数会覆盖父目录里的同名文件,如果想保留旧文件,可以删掉这个参数,脚本会在遇到重名时报错提醒;或者你也可以给新文件加时间戳区分:# 给文件名加上时间戳,避免重名覆盖 $timestamp = Get-Date -Format "yyyyMMddHHmmss" $targetPath = Join-Path $parentDir "$subDirName-$timestamp.pdf"
注意事项
- 确保
pdftk.exe的路径正确,能正常运行(可以先在控制台单独执行& "C:\SymLinks\Combine\pdftk.exe"测试) - 建议先在测试目录运行脚本,确认功能符合预期后再处理正式文件
- 如果子目录里没有PDF文件,脚本会自动跳过该目录,不会生成空文件
内容的提问来源于stack exchange,提问作者AmandaKay10




