我有VB脚本:
.....
Set oInstaller = CreateObject("WindowsInstaller.Installer")
Set otempDB = oInstaller.OpenDatabase(sMsiFullPathTemp, 1)
.......
Set otempDB = Nothing
在此字符串处释放数据库:Set otempDB = Nothing。
我需要像这个VBS一样制作PowerShell脚本才能与MSI一起使用。
的PowerShell:
....
function Invoke-Method ($Object, $MethodName, $ArgumentList) {
return $Object.GetType().InvokeMember($MethodName, 'Public, Instance, InvokeMethod', $null, $Object, $ArgumentList)
}
$oInstaller = New-Object -ComObject WindowsInstaller.Installer
$otempDB = Invoke-Method $oInstaller OpenDatabase @($tempmsi, 1)
但是如果脚本还没有完成工作,我怎么能释放MSI数据库呢? 我的意思是:Set otempDB = Nothing
有人可以帮我吗?
由于
答案 0 :(得分:2)
您始终可以将变量分配给$ null:
$otempDB = $null
然而,对于COM对象,这通常会导致对象被拖拽到某个地方。更好的是明确地释放对象并清理内存:
([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$otempDB) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
某个地方我曾经遇到过这个功能(如果有人知道最初发布此功能的人请发表评论,我会将其归因于此)。我几乎在使用COM对象时都会使用它:
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}