合并32/64位软件清单并按DisplayName排序的异常问题求助
解决PowerShell合并软件列表排序及空行问题
嘿,我来帮你搞定这个合并排序的难题!你的问题出在直接对格式化后的文本文件进行排序——因为app32.txt和app64.txt里的内容是纯文本表格,不是PowerShell对象,所以Sort-Object没法识别DisplayName字段来排序,空行过滤也不够彻底。
下面给你两种解决方案,按需选择:
方案一:直接从注册表获取并处理(推荐)
跳过先导出到两个txt的步骤,直接合并注册表查询结果,一步到位生成排序好的清单,效率更高也更准确:
# 同时获取32位和64位软件注册表项,过滤掉无DisplayName的条目 $allApps = @( Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* -ErrorAction SilentlyContinue Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* -ErrorAction SilentlyContinue ) | Where-Object { $_.DisplayName -and $_.DisplayName.Trim() -ne "" } # 按DisplayName排序,选择需要的字段并导出到文件 $allApps | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate ` | Sort-Object -Property DisplayName ` | Format-Table -AutoSize > all_apps.txt
方案二:基于已生成的txt文件处理
如果已经有了app32.txt和app64.txt,需要先把文本解析成结构化对象,再排序:
# 读取两个文本文件,跳过表头、空行和全空格行 $rawLines = Get-Content apps*.txt | Where-Object { $_ -match '^\S' -and $_.Trim() -ne "" } # 将文本行解析为自定义对象 $appObjects = $rawLines | ForEach-Object { # 用至少两个空格分割字段(适配表格的列分隔) $fields = $_ -split '\s{2,}', 4 [PSCustomObject]@{ DisplayName = $fields[0].Trim() DisplayVersion = $fields[1].Trim() Publisher = $fields[2].Trim() InstallDate = if ($fields[3]) { $fields[3].Trim() } else { "" } } } # 按DisplayName排序后导出 $appObjects | Sort-Object DisplayName | Format-Table -AutoSize > all_apps.txt
为什么原来的方法不行?
- 排序失效:你之前的命令是对整个文本行排序,而不是针对
DisplayName字段——文本行里的内容是整行字符串,Sort-Object没法提取出DisplayName来排序。 - 空行残留:
where {$_ -ne ""}只能过滤完全空的行,没法过滤那些全是空格的行,所以需要用$_.Trim() -ne ""来更严格地过滤。
内容的提问来源于stack exchange,提问作者Daniels
相关产品推荐
相关产品推荐

