从 MSI 文件中提取信息

pulling information from MSI files

我正在使用 Powershell 从 MSI 文件中提取信息,我找到了这样做的示例,但它们都是特定于值的 E、G 如果您知道 属性 的名称,您可以找到属性 的值,因为我想首先找到所有属性,它实际上是我需要的快捷方式 table 中的信息,下面是我想要实现的示例。

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 Directory_ FROM Shortcut"
    $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 $_
}

}

获取-MsiDatabaseVersion "C:\Random.msi"

so where $q = "SELECT Directory_ FROM Shortcut" 我需要知道快捷方式 table 中所有行的名称才能找到所有目录。目前它只有 returns 第一个值。 如果您能提供帮助,我将不胜感激。 谢谢

要了解 MSI 的属性,您可以在 Ocra 中打开它。我把你的代码加了一个循环,如果对你有帮助,请标记为正确问题。

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 Directory_ FROM Shortcut"
    $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
        )

    while($record -ne $null)
    {

        $shortcut = $record.GetType().InvokeMember(
                "StringData", "GetProperty", $Null, $record, 1
            )
        $shortcut

        $record = $View.GetType().InvokeMember(
                "Fetch", "InvokeMethod", $Null, $View, $Null
            )
    }

    $View.GetType().InvokeMember("Close", "InvokeMethod", $Null, $View, $Null)

    #return $shortcut

} catch {
    throw "Failed to get MSI file version the error was: {0}." -f $_
}
}

Get-MsiDatabaseVersion -FilePath .\Setup1.msi

您可能想查看:

Windows Installer PowerShell Module

作者是 MSFT MSI 专家,他的 cmdlet 比使用 WindowsInstaller.Installer 对象执行 COM 互操作要干净得多。

get-msiproperty Product*, UpgradeCode -path example.msi

get-msitable .\example.msi -query "SELECT ComponentId, FileName, File.Attributes FROM Component, File WHERE Component_ = Component" | where-object { $_.'File.Attributes'.HasVital }