记一次 WinGet 升级故障排查

今天像往常一样执行 winget upgrade --all 命令,意外地发生了错误,提示:

尝试更新源失败: winget

使用 --logs 参数生成日志,收集到错误信息如下:

2025-03-21 10:52:17.605 [CORE] Deployment operation #0: 从  (Microsoft.Winget.Source_8wekyb3d8bbwe.msix)  使用程序包 Microsoft.Winget.Source_2025.321.215.7_neutral__8wekyb3d8bbwe 中的目标卷 C: 执行的部署 Add 操作失败,错误为 0x80070057。有关诊断应用部署问题的帮助,请参阅 http://go.microsoft.com/fwlink/?LinkId=235160。
2025-03-21 10:52:17.605 [FAIL] C:\__w\1\s\external\pkg\src\AppInstallerCommonCore\Deployment.cpp(54)\WindowsPackageManager.dll!00007FFB414154CB: (caller: 00007FFB41411209) Exception(1) tid(47b4) 80070057 参数错误。

    Msg:[Operation failed: 从  (Microsoft.Winget.Source_8wekyb3d8bbwe.msix)  使用程序包 Microsoft.Winget.Source_2025.321.215.7_neutral__8wekyb3d8bbwe 中的目标卷 C: 执行的部署 Add 操作失败,错误为 0x80070057。有关诊断应用部署问题的帮助,请参阅 http://go.microsoft.com/fwlink/?LinkId=235160。] 

2025-03-21 10:52:17.611 [FAIL] C:\__w\1\s\external\pkg\src\AppInstallerRepositoryCore\RepositorySource.cpp(96)\WindowsPackageManager.dll!00007FFB4155E285: (caller: 00007FFB41468553) LogHr(1) tid(47b4) 80070057 参数错误。

    Msg:[C:\__w\1\s\external\pkg\src\AppInstallerCommonCore\Deployment.cpp(54)\WindowsPackageManager.dll!00007FFB414154CB: (caller: 00007FFB41411209) Exception(1) tid(47b4) 80070057 参数错误。

    Msg:[Operation failed: 从  (Microsoft.Winget.Source_8wekyb3d8bbwe.msix)  使用程序包 Microsoft.Winget.Source_2025.321.215.7_neutral__8wekyb3d8bbwe 中的目标卷 C: 执行的部署 Add 操作失败,错误为 0x80070057。有关诊断应用部署问题的帮助,请参阅 http://go.microsoft.com/fwlink/?LinkId=235160。] 
] 

2025-03-21 10:52:17.611 [REPO] Source add/update failed, waiting 9311 milliseconds and retrying: winget

错误代码 0x80070057。微软官方的解释如下:

错误代码描述和可能的原因
E_INVALIDARG0x80070057一个或多个参数无效。 如果检查 AppXDeployment-Server 事件日志并看到以下事件:“安装包时,系统由于以下错误而无法注册 windows.repositoryExtension 扩展:参数不正确。” 如果清单元素 DisplayName 或 Description 包含 Windows 防火墙不允许的字符(例如 |),则可能会出现此错误,因为 Windows 无法为包创建 AppContainer 配置文件。 请从清单中删除这些字符,并尝试安装包。

根据日志中的相关信息,尝试从 https://cdn.winget.microsoft.com/cache/source2.msix 下载升级安装包,手动安装提示同样的错误:

安装失败

打开事件查看器(运行 eventvwr.msc),访问路径 应用程序和服务日志\Microsoft\Windows\AppXDeployment-Server\Microsoft-Windows-AppXDeploymentServer/Operational 下的日志,只有同样的错误信息,未找到更多线索。

试试重新安装 WinGet 看看能不能解决问题。之前的版本是通过 Windows 应用商店安装的,通过 WinGet 命令卸载此版本,并通过 Scoop 重新安装:

powershellwinget uninstall Microsoft.AppInstaller
scoop install winget

再次执行 winget upgrade --all 命令,一切正常。不过很奇怪的是,之前卸载的 WinGet 版本是 1.25.340.0,而 Scoop 安装的 WinGet 版本是 1.10.340。

很好奇故障的原因,看了一下 WinGet 重装后的升级日志,发现虽然下载的升级文件 source2.msix 的 URL 地址没变,但是哈希值和文件大小同之前的不一样。难道这就是此前升级失败的原因?为了验证猜想,使用如下命令安装新下载的 source2 (1).msix

powershelladd-appxpackage "D:\Downloads\source2 (1).msix"

注意:该命令只能在 Windows 自带的 PowerShell 5 下运行,PowerShell 7 无法运行该命令。可以使用命令 $psversiontable.PSVersion 查看当前 PowerShell 的版本。

另外,之所以这次没有通过双击文件安装,是由于之前为了排查问题,通过 DISM++ 删除了 Windows 应用商店。不过应该不影响结果。

安装仍然失败,返回和之前相同的错误信息:

add-appxpackage : 部署失败,原因是 HRESULT: 0x80073CF9, 无法安装。请联系你的软件供应商。
从  (source2%20(1).msix)  使用程序包 Microsoft.Winget.Source_2025.321.555.13_neutral__8wekyb3d8bbwe 中的目标卷 C: 执行的部署 Add 操作失败,错误为 0x80070057。有关诊断应用部署问题的帮助,请参阅 http://go.microsoft.com/fwlink/?LinkId=235160。
注意: 有关其他信息,请在事件日志中查找 [ActivityId] c9da9f7f-9a17-0000-2dec-dac9179adb01,或使用命令行 Get-AppPackageLog -ActivityID c9da9f7f-9a17-0000-2dec-dac9179adb01
所在位置 行:1 字符: 1
+ add-appxpackage "D:\Downloads\source2 (1).msix"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (D:\Downloads\source2 (1).msix:String) [Add-AppxPackage], IOException
    + FullyQualifiedErrorId : DeploymentError,Microsoft.Windows.Appx.PackageManager.Commands.AddAppxPackageCommand

看来也不是安装文件引起的。至此,虽然修复了问题,然是仍然不清楚是什么原因导致的 WinGet 故障。WinGet 在使用中已经不是第一次发生此类莫名其妙的问题,由于 WinGet 依赖了太多的系统服务,导致排查故障非常困难,真是搞得人心力交瘁。Windows 下最好的包管理器还得是 Scoop,虽然也有坑(比如最近用 Scoop 升级 GIMP 3.0.0 会由于安装脚本问题而失败,以及经常遇到的哈希校验错误),但是解决起来还是非常简单的。