Ответ Грэма хорош. Я уже начал писать функцию для экспорта всех свойств в PowerShell, поэтому решил опубликовать ее в любом случае.
Я написал вещь! Он получает все свойства из MSI и просто переводит его в PSCustomObject. Это позволяет вам делать Select-Object на объекте, чтобы получить интересующие вас свойства.
$Dir = Get-ChildItem -Path C:\MSIs\*.msi -Recurse
function Get-MsiPropertyList {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[string]
$Path
)
process {
$Path | Foreach-Object {
$item = $_
$windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
$database = $windowsInstaller.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $windowsInstaller, @((Get-Item -Path $item).FullName, 0))
$view = $Database.GetType().InvokeMember('OpenView', 'InvokeMethod', $null, $Database, ("SELECT Property,Value FROM Property"))
$view.GetType().InvokeMember('Execute', 'InvokeMethod', $null, $view, $null) | Out-Null
$record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)
$ret = [pscustomobject]@{
Path = $item
}
while ($record -ne $null) {
$property = $record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 1)
$value = $record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 2)
$ret | Add-Member -MemberType NoteProperty -Name $property -Value $value
$record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)
}
Write-Output $ret
}
}
}
# Export all properties to a csv
$Dir | Get-MsiPropertyList | Export-Csv -Path C:\MSIs\test.csv -NoTypeInformation
# Export selected properties to a csv
$Dir | Get-MsiPropertyList | Select-Object -Property Path, ProductName, ProductVersion | Export-Csv -Path C:\MSIs\test2.csv -NoTypeInformation
Надеюсь, это поможет.
Рыба