【问题标题】:Using powershell to merge PDFs in multiple subfolders with pdftk and then delete original PDF files使用powershell将多个子文件夹中的PDF与pdftk合并,然后删除原始PDF文件
【发布时间】:2021-11-10 15:27:26
【问题描述】:

我有一个根文件夹,其中包含许多子文件夹,每个子文件夹都有多个 PDF。 然后我有一个 powershell 脚本,它遍历文件夹结构并为每个子文件夹创建一个合并的 PDF 文件(使用 PDFtk),如下所示:

    $pdftk = "C:\Program Files (x86)\PDFtk\bin\pdftk.exe"
    $RootFolder = "path to root folder"
    Get-ChildItem -r -include *.pdf | group DirectoryName | % {& $PDFtk $_.group CAT OUTPUT "$($_.Name | Split-Path -Parent)\$($_.Name | Split-Path -Leaf)_merged.pdf"}

脚本按要求工作,但我将处理大量数据,因此我需要在合并完成后从每个文件夹中删除原始 PDF。

基本上,我需要脚本在第一个文件夹 4830_2017 中查找,创建合并文件 4830_2017_merged.pdf,然后删除位于 4830_2017 文件夹中的 PDF,然后再转到下一个文件夹,并做同样的事情。

我正在努力寻找合并后删除每个文件夹内容的正确方法。

感谢您的帮助。

【问题讨论】:

    标签: powershell pdf pdftk


    【解决方案1】:

    在您的 ForEach-Object 脚本块中,$_.Group 包含每个组的,即每个目录的 System.IO.FileInfo 实例代表 *.pdf 文件,因此您可以在成功合并后将它们通过管道传递给 Remove-Item

    (Get-ChildItem -Recurse -Filter *.pdf) | 
      Group-Object DirectoryName | 
        ForEach-Object {
          & $PDFtk $_.Group.FullName CAT OUTPUT "$($_.Name | Split-Path -Parent)\$($_.Name | Split-Path -Leaf)_merged.pdf"
          if (0 -eq $LASTEXITCODE) { # If the merge succeeded.
            $_.Group | Remove-Item   # Delete.
          }
        }
    

    注意:

    • Get-ChildItem 命令包含在(...) 中,以确保在进一步处理之前完整收集其输出,以排除创建新*.pdf 文件或删除旧文件影响递归的副作用枚举。

      • -Filter *.pdf 用于代替 -Include *.pdf,在这种情况下,它在功能上是等效的,但性能要好得多,因为将过滤委托给文件系统 API,而不是在源头 - 请参阅 this answer
    • & $PDFtk $_.Group 更改为 & $PDFtk $_.Group.FullName 以确保传递完整文件路径;请注意,这在 PowerShell (Core) 7+ 中不再需要,其中System.IO.FileInfoSystem.IO.DirectoryInfo 实例一致 字符串化为它们的完整路径 - 请参阅this answer

    • Group-Object 输出 Microsoft.PowerShell.Commands.GroupInfo 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-16
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多