使用Powershell从.zip文件中删除文件

时间:2013-11-28 14:58:40

标签: powershell

我将编写一个Powershell脚本来从.zip文件中删除文件。 在我的.zip文件中,我有 test.txt(最新) test1.txt(旧) 的test2.txt .... testN.txt(最老的), 所有文件大小不同(或者在PowerShell中,它叫做Length)。 我想只保留2G或更小的剩余部分。需要从最旧的中删除。 由于.zip文件可能非常大。最好不要再次提取和拉链。

有没有办法实现这个目标?

非常感谢你。

2 个答案:

答案 0 :(得分:8)

采用this VBScript solution

$zipfile = 'C:\path\to\your.zip'
$files   = 'some.file', 'other.file', ...
$dst     = 'C:\some\folder'

$app = New-Object -COM 'Shell.Application'
$app.NameSpace($zipfile).Items() | ? { $files -contains $_.Name } | % {
  $app.Namespace($dst).MoveHere($_)
  Remove-Item (Join-Path $dst $_.Name)
}

如果你安装了.net Framework 4.5,那么这样的东西也应该有效:

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression')

$zipfile = 'C:\path\to\your.zip'
$files   = 'some.file', 'other.file', ...

$stream = New-Object IO.FileStream($zipfile, [IO.FileMode]::Open)
$mode   = [IO.Compression.ZipArchiveMode]::Update
$zip    = New-Object IO.Compression.ZipArchive($stream, $mode)

($zip.Entries | ? { $files -contains $_.Name }) | % { $_.Delete() }

$zip.Dispose()
$stream.Close()
$stream.Dispose()

需要围绕过滤Entries集合中的项目的括号,否则后续的Delete()会修改集合。这样可以防止从集合中读取(从而删除)其他项目。生成的错误消息如下所示:

An error occurred while enumerating through a collection: Collection was modified;
enumeration operation may not execute..
At line:1 char:1
+ $zip.Entries | ? { $filesToRemove -contains $_.Name } | % { $_.Delete() }
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Collecti...ipArchiveEntry]:Enumerator) [], RuntimeException
    + FullyQualifiedErrorId : BadEnumeration

答案 1 :(得分:2)

使用免费的Zip工具7-Zip。 Technet sample说明了如何在Powershell中使用7-Zip创建zip存档。

了解正确的命令以获取zip内容的列表,并使用d命令从存档中删除文件。