You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并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

为什么原来的方法不行?

  1. 排序失效:你之前的命令是对整个文本行排序,而不是针对DisplayName字段——文本行里的内容是整行字符串,Sort-Object没法提取出DisplayName来排序。
  2. 空行残留:where {$_ -ne ""}只能过滤完全空的行,没法过滤那些全是空格的行,所以需要用$_.Trim() -ne ""来更严格地过滤。

内容的提问来源于stack exchange,提问作者Daniels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:57:49