递归处理 zip 档案以提取文件,同时丢弃特定格式的文件

递归处理 zip 档案以提取文件,同时丢弃特定格式的文件

更新:我注意到很多人都在看这个帖子,这让我相信这种情况毕竟并不罕见。无论如何,我曾在 SO 上问过类似/相关的问题这里,它也有相当不错的解决方案,可以更好地解决问题。

在我的 Windows 7 计算机上,我有一个目录,里面装满了 ZIP 档案中下载的转储。每个档案包含一些文本文件、PDF 和极少数 XML 文件。我想将每个 ZIP 档案的所有内容提取到其各自的文件夹中(必须在提取过程中创建),同时丢弃/忽略 PDF 的提取。从档案中提取所需文件后,处理 zip一定不被删除(或者我想知道如何在不同情况下控制它)。

如果有帮助的话,目录中的档案数量在 60k-70k 范围内。另外,我需要单独的输出目录,因为档案中的文件可能与其他档案中的文件同名。

例如,

  • 我拥有所有档案,例如one.zip,,two.zip..,D:\data
  • 我为处理过的数据创建一个新文件夹,例如,D:\extracted
  • 现在数据从D:\data\one.zip应该转到D:\extracted\one。这里 D:\extracted\one应该会自动创建。
  • 在此完整解压过程中,不应提取(忽略)所有遇到的 PDF。提取后再删除毫无意义。
  • (选修的)应在 处维护一个日志文件D:\extracted。这样可以在出现错误时使用此文件从上次中断的地方恢复处理。
  • (选修的)脚本应该让我决定是否要保留源档案或在处理后删除它们。

我已经搜索了一些解决方案,但找不到。我遇到了一些类似这样的问题

  1. 递归地将文件解压到它们所在的位置,然后删除存档
  2. 7 zip 递归提取
  3. 是否可以使用 7 zip 递归列出 zip 文件内容而无需提取

但它们没有太大帮助(顺便说一句,我不是 Windows 专家)。我愿意安装安全且无广告第三方软件(开源),如 7-zip。

编辑:有没有现成的工具可以做我需要的事情,我已经尝试过了多台拆包机。它不会创建新目录,它无法忽略 *.pdf 文件。它甚至启动速度很慢,我认为它首先读取源中的所有档案,然后才开始处理它们。

提前致谢!

答案1

修改找到的答案这里,这段 PowerShell 脚本应该可以满足您的要求。只需将其保存为扩展名为“.ps1”的文件即可。调用时,只需将其调用为 ./filename.ps1,它就会将文件提取到单独的文件夹中,删除 zip 文件并删除所有扩展名为 .pdf 的文件。我还没有测试它是否能正确处理递归路径,但它应该可以,请测试一下。

编辑:如果你不想删除 zip 文件,请删除或注释掉(#)该行rmdir -Path $_.FullName -Force

要求:PowerShell、7-zip 以及您在文件中设置的 7-zip 路径。

param([string]$folderPath="D:\Blah\files")

Get-ChildItem $folderPath -recurse | %{ 

    if($_.Name -match "^*.`.zip$")
    {
        $parent="$(Split-Path $_.FullName -Parent)";    
        write-host "Extracting $($_.FullName) to $parent"

        $arguments=@("e", "`"$($_.FullName)`"", "-o`"$($parent)\$($_.BaseName)`"");
        $ex = start-process -FilePath "`"C:\Program Files\7-Zip\7z.exe`"" -ArgumentList $arguments -wait -PassThru;

        if( $ex.ExitCode -eq 0)
        {
            write-host "Extraction successful, deleting $($_.FullName)"
            rmdir -Path $_.FullName -Force
            $arguments1="$($parent)\$($_.BaseName)\*.pdf"
            rmdir -Recurse -Path $arguments1
        }
    }
}

相关内容