答案 0 :(得分:25)
这应该是一个简单的答案......从Windows Installer开始,您可以使用COM object:
ProgID: WindowsInstaller.Installer
但是,当您使用PowerShell创建对象时,您不会获得任何属性或方法:
$object = New-Object -Com WindowsInstaller.Installer
$object | gm
......没什么: - (
显然这是PowerShell及其类型适应系统的问题。请参阅此博客文章以了解解决方法。
http://www.snowland.se/2010/02/21/read-msi-information-with-powershell/
如果您使用VBScript,则不应该出现此问题。
编辑:
以下是一些将获得版本found的VBScript:
Const msiOpenDatabaseModeReadOnly = 0
Dim msi, db, view
Set msi = CreateObject("WindowsInstaller.Installer")
Set db = msi.OpenDataBase("C:\Users\andy\Desktop\Module.msi", msiOpenDatabaseModeReadOnly)
Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
Call view.Execute()
GetVersion = view.Fetch().StringData(1)
Wscript.Echo GetVersion
您可以从PowerShell中调用它:
$version = & cscript.exe /nologo GetVersion.vbs
更新!这种类型适应问题令我感到沮丧,我对VBS解决方案不满意。经过一些研究后,我发现了一种在PowerShell中正确执行此操作的方法。我改编了blog entry的代码。享受!
function Get-MsiDatabaseVersion {
param (
[string] $fn
)
try {
$FullPath = (Resolve-Path $fn).Path
$windowsInstaller = New-Object -com WindowsInstaller.Installer
$database = $windowsInstaller.GetType().InvokeMember(
"OpenDatabase", "InvokeMethod", $Null,
$windowsInstaller, @($FullPath, 0)
)
$q = "SELECT Value FROM Property WHERE Property = 'ProductVersion'"
$View = $database.GetType().InvokeMember(
"OpenView", "InvokeMethod", $Null, $database, ($q)
)
$View.GetType().InvokeMember("Execute", "InvokeMethod", $Null, $View, $Null)
$record = $View.GetType().InvokeMember(
"Fetch", "InvokeMethod", $Null, $View, $Null
)
$productVersion = $record.GetType().InvokeMember(
"StringData", "GetProperty", $Null, $record, 1
)
$View.GetType().InvokeMember("Close", "InvokeMethod", $Null, $View, $Null)
return $productVersion
} catch {
throw "Failed to get MSI file version the error was: {0}." -f $_
}
}
Get-MsiDatabaseVersion "Installer.msi"
答案 1 :(得分:2)
(抱歉,没有代表只是对接受的答案添加评论)
@davidmartin的答案对我来说非常有用。
我需要添加的只是在返回版本之前关闭对象,否则句柄在msi上保持打开状态,以后访问可能会失败:
$View.GetType().InvokeMember("Close", "InvokeMethod", $Null, $View, $Null)
return $productVersion
答案 2 :(得分:0)
PowerShell模块“ Carbon”非常适合执行此操作。
几年前,我在自己使用PowerShell期望状态配置(DSC)进行了大量工作时发现了它,该过程需要安装MSI的产品代码(GUID)。如果应用程序安装在计算机上,并且版本号相同,则可以通过PowerShell本身获取产品代码,但是Carbon可以通过MSI来实现。
Import-Module -Name Carbon
Get-MSI -Path C:\PathToMSI