如何通过PowerShell获取Winget所有软件包的完整名称与ID?
解决Winget获取完整包名和ID的方案
核心问题
Winget默认的表格输出会根据控制台宽度截断长名称/ID,且编码处理易出问题。使用JSON格式输出是获取完整数据的关键——JSON是结构化数据,包含所有字段的完整值,不会出现截断或乱码。
具体步骤
- 获取所有包的完整JSON数据
在PowerShell中执行以下命令,直接获取结构化的全量包数据:
# 创建临时目录(不存在则自动创建) $tempDir = "$env:temp\download_winget" if (-not (Test-Path -Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null } # 拉取所有包并转为PowerShell可操作的JSON对象 $wingetPackages = winget search --all --accept-source-agreements --output json | ConvertFrom-Json
--all:明确搜索所有包,比.或空字符串的匹配逻辑更精准--output json:输出结构化数据,彻底避免文本截断ConvertFrom-Json:将JSON字符串转为PowerShell对象,方便后续字段筛选
- 提取Name和ID字段
从JSON对象中直接筛选需要的字段:
$packageList = $wingetPackages | Select-Object Name, Id
- 导出到文件(可选)
- 导出为CSV(适合用表格工具后续处理):
$packageList | Export-Csv -Path "$tempDir\winget_packages.csv" -Encoding UTF8 -NoTypeInformation - 导出为文本文件(每行显示Name和ID):
$packageList | ForEach-Object { "$($_.Name) | $($_.Id)" } | Set-Content "$tempDir\winget_packages.txt" -Encoding UTF8
- 去重处理(可选)
按包的唯一ID去重(比文本去重更可靠):
$uniquePackageList = $packageList | Sort-Object Id -Unique # 导出去重后的结果 $uniquePackageList | Export-Csv -Path "$tempDir\winget_packages_unique.csv" -Encoding UTF8 -NoTypeInformation
原方案无效的原因
- 表格输出为控制台显示优化,会自动截断超出窗口宽度的文本,即使最大化窗口也无法覆盖所有超长名称/ID
- 文本输出的编码兼容性差,容易出现乱码;而JSON采用标准UTF-8编码,完全避免此类问题
内容的提问来源于stack exchange,提问作者Frxhb
相关产品推荐
相关产品推荐

