![递归处理 zip 档案以提取文件,同时丢弃特定格式的文件](https://linux22.com/image/1412489/%E9%80%92%E5%BD%92%E5%A4%84%E7%90%86%20zip%20%E6%A1%A3%E6%A1%88%E4%BB%A5%E6%8F%90%E5%8F%96%E6%96%87%E4%BB%B6%EF%BC%8C%E5%90%8C%E6%97%B6%E4%B8%A2%E5%BC%83%E7%89%B9%E5%AE%9A%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%96%87%E4%BB%B6.png)
更新:我注意到很多人都在看这个帖子,这让我相信这种情况毕竟并不罕见。无论如何,我曾在 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
。这样可以在出现错误时使用此文件从上次中断的地方恢复处理。 - (选修的)脚本应该让我决定是否要保留源档案或在处理后删除它们。
我已经搜索了一些解决方案,但找不到。我遇到了一些类似这样的问题
但它们没有太大帮助(顺便说一句,我不是 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
}
}
}