从 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 }
我正在使用 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 }