【问题标题】:pulling information from MSI files从 MSI 文件中提取信息
【发布时间】:2015-03-05 01:19:34
【问题描述】:

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

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" 我需要知道快捷方式表中所有行的名称才能找到所有目录。目前它只返回第一个值。 如果您能提供帮助,我将不胜感激。 谢谢

【问题讨论】:

    标签: powershell windows-installer


    【解决方案1】:

    要了解 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
    

    【讨论】:

    • 非常感谢,这正是我所需要的!是的,我经常使用 Orca,该脚本最终将自动化我在其中执行的一些过程。
    • MSI 自动化接口适用于 VBScript。对于托管代码,有更好的库可用。
    • 不客气,本!我也会尝试@ChristopherPainter 的方法。
    【解决方案2】:

    您可能想签出:

    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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多