PowerShell的+ MSI。如何发布打开的数据库?

时间:2011-09-28 14:30:09

标签: database com powershell windows-installer

我有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

有人可以帮我吗?

由于

1 个答案:

答案 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()

}