采用这个VBScript解决方案:
$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()
将修改集合。这将阻止从集合中读取(和因此删除)其他项。造成的错误信息如下:
在枚举集合时发生错误: 已修改集合;
可能无法执行枚举操作。
位于第 1 行第 1 字符
+ $zip.Entries | ? { $filesToRemove -contains $_.Name } | % { $_.Delete() }
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Collecti...ipArchiveEntry]:Enumerator) [], RuntimeException
+ FullyQualifiedErrorId : BadEnumeration