如何在PowerShell中获取ComObject的属性名称(MSI/MSP场景)
同时提取MSI/MSP文件的摘要属性名称和值
要同时拿到摘要属性的名称和对应值,你需要借助Windows Installer预定义的摘要属性索引与名称的对应关系,把数字索引转换成可读的属性名称。以下是修改后的PowerShell代码:
$directory = "xxxx"; # 修正原代码中变量名不一致的问题,用$directory替代$workDir $msiPath = Get-ChildItem -Path $directory -Include "*.msi", "*.msp" -Recurse | ForEach-Object {$_.FullName}; $installer = New-Object -com WindowsInstaller.Installer; $database = $installer.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $installer, @($msiPath, 0)); $summaryInfo = $database.GetType().InvokeMember("SummaryInformation", "GetProperty", $null, $database, $null); $propertyCount = $summaryInfo.GetType().InvokeMember("PropertyCount", "GetProperty", $null, $summaryInfo, $null); # 建立索引到摘要属性名称的映射 $summaryProperties = @{ 0 = "标题" 1 = "主题" 2 = "作者" 3 = "关键字" 4 = "注释" 5 = "模板" 6 = "最后保存者" 7 = "修订号" 8 = "创建时间/日期" 9 = "最后保存时间/日期" 10 = "页数" 11 = "字数" 12 = "字符数" 13 = "安全" 14 = "类别" 15 = "格式" 16 = "经理" 17 = "公司" 18 = "代码页" 19 = "内容类型" 20 = "内容状态" 21 = "语言" 22 = "字符数(带空格)" } # 循环遍历所有属性,输出名称、索引和值 for ($i = 0; $i -lt $propertyCount; $i++) { $propName = if ($summaryProperties.ContainsKey($i)) { $summaryProperties[$i] } else { "未知属性_$i" } $propValue = $summaryInfo.GetType().InvokeMember("Property", "GetProperty", $null, $summaryInfo, $i) Write-Host "[$i] $propName : $propValue" }
关键修改说明:
- 新增了
$summaryProperties哈希表,把每个摘要属性的数字索引映射为中文名称,覆盖了所有标准Windows Installer摘要属性 - 修正了原代码中
$directory和$workDir变量名不一致的问题 - 调整循环条件为
$i -lt $propertyCount,避免因索引超出范围导致的报错(索引从0开始,到PropertyCount-1结束) - 对于未在映射表中的索引(极少数情况),会显示为
未知属性_索引值,保证兼容性
内容的提问来源于stack exchange,提问作者Bbb
相关产品推荐
相关产品推荐

