如何仅列出通过winget命令安装的软件包用于新电脑迁移?
仅列出通过Winget安装的软件包并迁移到新电脑
Winget本身没有原生的list子命令参数直接过滤仅由它安装的包,但可以通过以下两种方法实现需求:
方法1:通过注册表查询筛选
Winget会在注册表中为自己安装的包添加InstalledByWinget标记,可通过PowerShell读取这些记录:
步骤1:导出Winget安装的包列表
建议以管理员身份运行PowerShell,执行以下命令:
# 扫描所有卸载注册表项,筛选Winget安装的包 $wingetPackages = Get-ItemProperty -Path @( 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' ) | Where-Object { $_.InstalledByWinget -eq 1 } | Select-Object DisplayName, DisplayVersion, @{Name='PackageId'; Expression={$_.PSChildName}} # 将结果导出为JSON文件,便于迁移 $wingetPackages | ConvertTo-Json -Depth 10 | Out-File -FilePath "winget-packages.json" -Encoding UTF8
步骤2:在新电脑上批量安装
将导出的winget-packages.json复制到新电脑,运行以下PowerShell命令:
$packages = Get-Content -FilePath "winget-packages.json" | ConvertFrom-Json foreach ($pkg in $packages) { # 通过PackageID精确安装,避免名称或版本冲突 winget install --id $pkg.PackageId --exact --silent }
方法2:利用Winget导出/导入功能筛选
Winget的export命令默认导出所有已安装包,可手动筛选出仅Winget安装的条目:
步骤1:导出所有包并筛选
- 先导出全部已安装包:
winget export -o all-packages.json
- 用PowerShell筛选出Winget安装的包:
$allPackages = Get-Content -FilePath "all-packages.json" | ConvertFrom-Json $wingetOnly = $allPackages.Packages | Where-Object { $_.InstalledByWinget -eq $true } # 重构符合Winget导入格式的JSON结构 $exportObject = [PSCustomObject]@{ Sources = $allPackages.Sources Packages = $wingetOnly } $exportObject | ConvertTo-Json -Depth 10 | Out-File -FilePath "winget-only-packages.json" -Encoding UTF8
步骤2:在新电脑上导入安装
winget import -i winget-only-packages.json
注意事项
- 早期版本Winget安装的部分软件可能没有
InstalledByWinget标记,会导致筛选遗漏; - 安装部分软件需要管理员权限,建议以管理员身份运行终端;
--silent参数用于静默安装,可根据需求移除,手动确认安装选项。
内容的提问来源于stack exchange,提问作者pooya13
相关产品推荐
相关产品推荐

