在Powershell中,如何在ZipFile.OpenRead之后关闭句柄?

时间:2014-05-09 14:05:35

标签: powershell powershell-v3.0

我正在制作一个更新一些文件的Powershell(3.0版,.Net framework 4.5)脚本。但是,有些需要先进行检查。

我打开一个JAR文件并使用以下代码获取条目内容:

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
$zentry = [IO.Compression.ZipFile]::OpenRead($moduleJarPath).Entries | Where-Object {$_.FullName -match '.*pom.xml'}

使用System.IO.StreamReader读取条目,该函数在读取后立即在finally块中关闭。

在脚本的下方,我将使用更新的JAR文件更新,该文件可能具有相同的名称。在这种情况下,脚本失败并显示:

Copy-Item : The process cannot access the file 'E:\path\to\my\artifact.jar' because it is being used by another process.

看起来锁是由我自己的脚本保存的,这似乎是合乎逻辑的,因为我刚刚访问了JAR。我想关闭句柄,以便我的脚本可以覆盖JAR。

在IO.Compression.ZipFile documentation中,没有“关闭”方法。

如何解锁?

谢谢! :)

1 个答案:

答案 0 :(得分:13)

ZipArchive返回的

ZipFile.OpenRead()实施IDisposable,因此您可以致电Dispose(),例如

$zipFile = [IO.Compression.ZipFile]::OpenRead($moduleJarPath)
$zentry = $zipFile.Entries | Where-Object {$_.FullName -match '.*pom.xml'}
...
$zipFile.Dispose()