我正在制作一个更新一些文件的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中,没有“关闭”方法。
如何解锁?
谢谢! :)
答案 0 :(得分:13)
ZipArchive
返回的 ZipFile.OpenRead()
实施IDisposable
,因此您可以致电Dispose()
,例如
$zipFile = [IO.Compression.ZipFile]::OpenRead($moduleJarPath)
$zentry = $zipFile.Entries | Where-Object {$_.FullName -match '.*pom.xml'}
...
$zipFile.Dispose()