Esto debe de sido una respuesta fácil ... Para empezar instalador de Windows tiene un COM object puede utilizar:
ProgID: WindowsInstaller.Installer
Sin embargo, cuando se crea un objeto de la PowerShell usted no recibe ninguna de las propiedades o métodos:
$object = New-Object -Com WindowsInstaller.Installer
$object | gm
... sin :-(
Aparentemente, este es un problema con PowerShell y su sistema de adaptación de tipo. Vea esta publicación en el blog para un trabajo completo.
http://www.snowland.se/2010/02/21/read-msi-information-with-powershell/
Si utiliza VBScript que no debería tener este problema.
EDIT:
He aquí algunos de VBScript que hará que la versión que found:
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
Puede llamar esto desde PowerShell:
$version = & cscript.exe /nologo GetVersion.vbs
actualización! Este tipo de problema de adaptación me estaba frustrando y no estaba contento con la solución VBS. Después de investigar un poco encontré una forma de hacer esto en PowerShell propiamente dicha. Adapte el código de su blog entry. ¡Disfrutar!
function Get-MsiDatabaseVersion {
param (
[IO.FileInfo] $FilePath
)
try {
$windowsInstaller = New-Object -com WindowsInstaller.Installer
$database = $windowsInstaller.GetType().InvokeMember(
"OpenDatabase", "InvokeMethod", $Null,
$windowsInstaller, @($FilePath.FullName, 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 "C:\Installer.msi"
Gracias por el comentario en mi respuesta, me quita basado en tu información – JNK
No funciona, aparece un error: Llamada de excepción "InvokeMethod" con "3" argumento (s): "Llamada de excepción" InvokeMember "con" 5 "argumento (s):" OpenDatabase, DatabasePath, OpenMode "" – LeBleu
El código contenía 'citas inteligentes' que pueden haber atrapado a algunas personas, habrás visto el error que tenía @LeBleu, he actualizado el fragmento de código. –