ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

更新 winget 的正确方法:机制解析、三种方式与问题排查

更新 winget 的正确方法:机制解析、三种方式与问题排查 1. winget 到底是什么先搞清楚机制才能正确更新很多人在 Windows 上用 winget 装软件装得挺顺手但一旦面临怎么更新 winget 本身这个问题就卡住了。最典型的情况是你打开终端敲winget update想把系统里的软件批量升级结果提示winget这个命令本身没有可用更新或者压根没反应。这时候你可能会懵winget 不该跟其他软件一样用 winget 自己更新吗先说结论winget 的更新机制和普通软件真心不一样。它不是一个装在用户目录里的独立程序而是作为应用安装程序App Installer的一个组件通过微软商店的分发机制下发。Windows 10 和 Windows 11 里预装的那个 App Installer就是 winget 的宿主。只有弄明白这层关系你在更新时才不会走弯路。绝大多数人对 winget 的理解是包管理器这没错但包管理器也存在两个世界一种是像 Python 的 pip、Node 的 npm 那样随语言环境安装碰到版本更新就敲一条命令另一种是像 Homebrew 那样系统自带或用户自行安装然后通过升级自身来迭代。winget 走的是第三条路——它寄生在微软商店应用App Installer里。这意味着它的版本节奏、更新策略不完全由你本地命令行决定而是由微软的商店分发机制决定。所以你在终端里查询 winget 版本时实际查的是宿主 App Installer 的版本。当微软发布新版 winget 时更新内容会以 App Installer 更新的形式推到微软商店的更新列表里。这个机制有个隐蔽的坑很多用户手动禁用或关闭了微软商店的自动更新应用选项这就会导致 winget 长时间停留在旧版本而你还在奇怪为什么我的 winget 不能更新自己的模块。另外一个容易被忽略的点winget 和 WinGetWindows Package Manager在微软的文档里其实是同一个东西你搜索时经常看到 WinGet 和 winget 混着写其实指的是同一个工具。只是在终端里执行的命令统一小写winget而官方文档里说的WinGet是项目名。别被命名搞混了后面我提到的 winget 一律指这条命令。搞清楚这些我们再往下走。更新 winget 的第一步是先知道你现在用的是什么版本、以及它到底有没有更新的必要。2. 更新前的准备工作确认当前版本与了解版本号背后的含义2.1 用一条命令查询版本winget --version 的完整解读在终端Windows Terminal、CMD 或 PowerShell 皆可输入winget --version输出结果一般长这样v1.9.25200这里每个数字都有意义但很多人不注意看。以v1.9.25200为例1是大版本号代表主功能迭代。9是小功能版本号每次更新会递增。25200是内部构建号它实际上对应 App Installer 的 MSIX 包版本。这串数字会随着预览版、正式版的发布快速变化。理解了版本号的构成你在判断我该不该更新时就有依据了。比如你当前输出v1.8.1911而微软商店里已经推送了v1.9.25200那说明你落后了至少一个大版本很多新命令比如某些源配置、解压支持等新特性你是用不了的。2.2 为什么 winget 不会出现在winget update的软件列表里很多人习惯用winget update查看所有可更新软件发现列表里没有 winget 或 App Installer就以为它已经是最新了。其实不是这样的。winget 的update命令默认只扫描它自己管理的软件源里登记的那些应用针对已安装程序比对版本号。而 winget 本身并不是一个通过 winget 源安装的标准应用它是系统级组件状态不归 winget 自己管。苹果系统上你不会看到用 Homebrew 升级 Homebrew这种天然的自举操作同理 Windows 也不会让 winget 通过自己的源更新自己。winget 的更新入口在微软商店的 App Installer不在 winget 命令管辖范围内。所以你想通过一条winget upgrade --all来连带更新 winget是不可能成功的。这不是你操作错误而是机制设计使然。真正更新 winget需要走下面三种方式中的一种。2.3 检查微软商店中 App Installer 的更新状态在开始动手更新之前建议你先打开微软商店Microsoft Store点左下角的库然后查看获取更新按钮。如果列表中出现应用安装程序说明有新版 winget 在等待你手动确认。这里有个细节微软商店的自动更新应用开关一旦开着应用安装程序更新是静默发生的。你在微软商店里根本看不到它曾更新过。如果你长期没打开微软商店更新可能早就后台装好了只是你感知不到。这也是为什么很多人觉得我没更新过 winget但版本一直在变——其实是后台自动更新默默帮你完成了。如果你的电脑上有组策略Windows 专业版/企业版你也可以通过gpedit.msc找到计算机配置 - 管理模板 - Windows 组件 - 应用商店 - 关闭自动下载和安装更新检查是否被组织策略改过。如果是家庭版没有本地组策略编辑器大概率就是默认状态。3. 三种可靠更新方式逐一说透从最简单到最带劲3.1 方式一微软商店手动检查更新稳如老狗这是最推荐给普通用户的方式因为它完全不涉及命令行操作所见即所得。操作步骤打开微软商店开始菜单搜索Microsoft Store或商店。点击左下角的库图标书本模样的那个。在库页面右上角找到获取更新按钮点击。等待商店扫描找到应用安装程序后点击右侧的更新按钮。更新完成后打开终端重新输入winget --version看版本是否变化。如果商店一直没找到应用安装程序更新那可能你已经是最新版不需要人为干预。有朋友可能会问我商店里的应用安装程序按钮是灰色的、点不动怎么办这通常是因为系统已经是该版本的最高可用版本商店限制你进行重复安装或降级。这种情况下不用慌说明没有更新可装。要注意的是微软商店的更新推送是分级进行的微软内部叫staged rollout不是所有用户同一时间收到新版。有时候你已经知道自己落后了但商店就是不给你推送更新这是很正常的。你着急的话用下面第二种方式。3.2 方式二用 winget 官方 GitHub 仓库的发布页手动下载安装winget 的源码和发布包托管在 GitHub 的microsoft/winget-cli仓库。微软每次正式发布都会在仓库的Releases页放出安装包。操作路径浏览器打开https://github.com/microsoft/winget-cli/releases。找到最新的正式版本一般标有Latest或列表最上方。在该版本详情里往下滚动到Assets区域。找到一个扩展名为.msixbundle的文件典型文件名类似Microsoft.DesktopInstaller_8wekyb3d8bbwe.msixbundle。注意不是.exe也不是.msi。下载这个.msixbundle文件双击安装或者用 PowerShell 执行Add-AppxPackage命令安装。用命令的方式更可靠因为在双击安装时系统偶尔会报已安装更高版本之类的错误但命令行能给你更明确的反馈Add-AppxPackage -Path C:\Users\用户名\Downloads\Microsoft.DesktopInstaller_8wekyb3d8bbwe.msixbundle安装完成后重开一个终端窗口执行winget --version确认版本号已更新。这种方式的优点是不受微软商店推送节奏的限制只要 GitHub 发版你就能手动拿到。缺点时你得自己去判断哪个是正式版、哪个是预览版。看 Releases 页时如果标题里带Preview字样说明是预览版不带的就是正式版。预览版一般建议普通用户跳过除非你想尝鲜或者在开发环境里测试新命令。3.3 方式三启用 winget 的自带更新提醒新版特性从 winget 某个较新版本开始微软加入了一种提示性质的自我更新。当你使用的版本过旧时执行 winget 命令偶尔会看到一条提示大意是A new version of winget is available.不少人在终端看到这个提示第一反应是我要更新了但它不会自动更新。它只是在提醒你有新版本可用你自己去微软商店或 GitHub 处理。如果没看到这个提示说明你的版本还不算太旧或者当前仓库的发布节奏还没到通知阈值。所以不要把更新提醒当成自动更新。目前 winget 没有官方提供的自我升级命令类似winget upgrade winget或winget update --self这类命令是不存在的。你在网上偶尔看到有人这么写那是误解。截至当前版本微软没有开放这一入口。3.4 方式二和方式一的适用场景对比到底选哪个维度微软商店方式GitHub 手动方式操作难度简单全图形界面中等需要下载命令行/双击更新时机受微软分级推送影响可能滞后发布即到手不受灰度影响报错概率低偶发证书或依赖问题需手动处理适合人群普通用户、办公场景开发者、IT 管理员、喜欢尝鲜者我的建议是日常办公电脑用方式一开发机或者对版本敏感的场景用方式二。方式二虽然看起来手工但它能让你精确控制版本比如你想从 1.8 升到 1.9而不是商店里推送什么你用什么。4. 更新失败排查最常见的十种报错与解决办法更新 winget 看起来就是下载安装包但它毕竟是系统级组件出错概率比普通软件高。我自己折腾过不少次也帮朋友处理过好几回问题把最常见的坑列出来。4.1 安装时报已安装此产品的更高版本这是用 GitHub 手动下载更新时最常见的错误。原因你当前安装的 App Installer 版本实际上比你要装的这个.msixbundle版本号更高或者商店后台已经更新过但缓存没刷新。处理办法用 PowerShell 查询当前 App Installer 版本Get-AppxPackage *DesktopInstaller* | Select-Object Version, PackageFullName如果查询到的版本号大于你要装的文件版本号说明你根本不需要更新。如果查询版本号小于文件版本号但仍然报错那可能是商店缓存的问题。重启一下 Microsoft Store或者重启电脑再试一次。这个报错经常出现在我已经通过商店更新了又跑去 GitHub 下载的场景。建议每次手动装之前先查一下本地版本不要盲装。4.2 安装时报无法解析包依赖或需要安装某些框架.msixbundle文件是多个包的合集对系统框架如 VC Runtime有一定依赖。如果电脑系统更新不完整就可能在安装时提示缺失框架。处理办法先确保 Windows 已安装了最新的VC 可再发行组件你可以去微软官网搜索Visual C Redistributable latest supported downloads下载最新版。还是不行的话检查 Windows 更新把系统补丁打全再重试安装。另外部分版本的 winget 需要 .NET 运行库支持。虽然大多数情况下微软商店会帮你拉取依赖但手动安装时未必会。可以先看安装报错的依赖具体写的是什么组件再去官网装对应依赖。4.3 安装时报当前操作系统不支持或无法注册程序包这个报错通常发生在非常老的 Windows 10 版本上。winget 的最新版对系统版本有最低要求例如新版要求 Windows 10 1809 或更高。如果你的系统停留在 1709 甚至更老新版本 App Installer 根本无法注册。处理办法没有捷径老老实实把 Windows 系统更新到大版本或者维持旧版 winget 不折腾。说实话系统太老的话就算把 winget 升上去了很多软件包的新版本也装不了因为那些软件本身也要求新系统升级 winget 不如升级系统。4.4 安装时报包签名无效或证书不受信任手动下载安装包时如果文件下载不完整或者系统时间不对就可能触发证书校验失败。处理办法删除已下载的.msixbundle重新下载一次确认文件大小和 GitHub 页面上显示的一致。检查系统时间是否准确。时间不对导致证书验证过期是常见的隐藏原因。如果公司电脑有统一证书策略可能阻止非商店签名应用安装这种情况请联系 IT 管理员。4.5 更新后 winget 命令仍然显示旧版本这种情况最让人摸不着头脑。原因终端窗口缓存了旧的环境变量或 PATH 指向旧位置。App Installer 更新后winget 的路径可能已经改变但你当前的终端会话还是旧路径。重新开一个终端窗口问题多半解决。处理办法关掉当前所有终端窗口Windows Terminal、CMD、PowerShell 全部关掉重新打开一个。在全新终端里执行winget --version。如果还是旧版本检查你是否手动配置过 PATH 把 winget 指向了别的目录例如从 GitHub 下载了独立 zip 包放在自定义路径。如果有需要去系统环境变量 - Path里清理掉自定义的 winget 路径让它走系统默认路径。4.6 微软商店里一直显示应用安装程序可以更新但更新按钮一直转圈这种一般是商店缓存问题。处理办法重启电脑后再试。用wsreset命令重置微软商店缓存。在运行框里输入wsreset.exe按回车商店会重置并自动重新打开然后再去点获取更新。4.7 断网场景下的更新难题如果电脑常年处于离线或内网环境既不能访问微软商店也不能访问 GitHub那怎么更新办法提前在一个能上网的机器上下载.msixbundle文件拷贝到内网机器上然后用管理员 PowerShell 执行Add-AppxPackage -Path D:\packages\Microsoft.DesktopInstaller_8wekyb3d8bbwe.msixbundle需要注意离线安装时依赖问题更突出建议在能上网的机器上用 PowerShell 下载依赖包一起拷贝过去。命令如下可以把关联框架一起导出Get-AppxPackage *DesktopInstaller* | Select-Object -ExpandProperty Dependencies这个命令会列出 App Installer 的所有依赖包你可以在联网机器上通过https://store.rg-adguard.net之类的工具下载对应版本再一起拷贝到内网机器用Add-AppxPackage依次安装。4.8 更新后安装软件出现哈希值不匹配或无法验证许可证问题有些用户升级完 winget 后发现之前能装的软件突然报错。这多半不是 winget 本身坏了而是你更新后默认的源特别是某些第三方源出现了证书过期或镜像同步滞后。处理办法先恢复微软官方源的默认状态。在终端执行winget source remove winget winget source add winget https://cdn.winget.microsoft.com/cache这两条命令会移除再重新添加官方源。注意https://cdn.winget.microsoft.com/cache是当前官方源的最终地址如果你在旧版 winget 里手动将源改成了 GitHub 或其他镜像地址更新后大概率会出问题回退到官方地址最省心。4.9 新版本翼格的源配置命令找不到或winget source报错如果你刚更新到 1.9 以上版本部分旧语法可能失效。比如早期版本用winget source update就能强制刷新源新版可能要求你先指定源名winget source update winget甚至新增了winget source reset --force命令。遇到这种问题推荐直接在全新终端跑winget --help看看当前版本的命令列表很多旧习惯要跟着新文档走。4.10 更新后配置文件settings.json失效Windows 终端打开报错winget 的配置文件路径在%LOCALAPPDATA%\Packages\Microsoft.DesktopInstaller_8wekyb3d8bbwe\LocalState\settings.json。有些大版本升级会调整配置项的字段结构旧配置文件里的某些不支持的字段会导致 winget 启动时无法解析。处理办法备份原有 settings.json然后把它移走或重命名让 winget 以默认配置启动。之后再用文本编辑器打开原配置文件逐行检查字段删除不再支持的项。5. 更新后一定要做的事验证环境与清理历史版本残留很多人升级完 winget执行winget --version看到新版本就完事了。但如果你长期使用 winget建议再花两分钟做三个验证避免后续使用中出幺蛾子。5.1 验证源是否正常在终端执行winget source list正常情况下你会看到winget这个源的状态是可用Agree或正常。如果你看到来源已验证或者Source not found说明源配置有问题。重新执行上面提到过的 remove/add 源命令即可。5.2 验证新命令能否正常工作不同版本的 winget 会新增或调整命令比如 1.8 之后引入了winget configure用于自动化配置环境1.9 扩展了对压缩包zip格式的安装支持。你可以跑一下winget configure --help如果命令存在并且能看到参数说明说明新特性已生效。如果提示找不到命令可能是你执行的终端不是管理员权限或者版本真的没升上去。5.3 清理安装缓存和临时文件手动安装.msixbundle后C 盘会多出一份安装文件残留。可以在确认安装成功后删除下载目录里的.msixbundle文件。如果你在 PowerShell 里执行过Add-AppxPackage系统会自动处理临时解压目录不需要额外清理。但如果之前有过安装失败可能残留%LOCALAPPDATA%\Temp下的临时包用磁盘清理工具cleanmgr清理一下更稳妥。5.4 检查自动更新是否可以继续接管手动从 GitHub 更新后微软商店的自动更新也会继续追踪版本记录。你在商店的库里看到应用安装程序状态是已安装或最新就说明后续的自动更新没有被手动安装打断。如果你手动安装的是预览版后续商店推送的正式版版本号可能比预览版低导致商店显示不可更新这是正常的属于版本回不到正式轨道的特殊情况。等它下一次发正式版版本号超过你手动装的预览版商店才能继续接管。所以非必要别去装预览版。6. 几个容易踩的坑与我的个人建议6.1 关于winget upgrade --all的一个常见误解在更新完 winget 后很多人迫不及待跑一次winget upgrade --all结果发现有些软件更新失败或者有些软件压根没出现在列表里。先说结论这是正常现象不是 winget 坏了。原因有三点部分软件包的安装器不支持静默升级导致 winget 无法自动完成更新它会跳过或报错。源里登记的安装包版本号和软件实际安装的版本号不一致可能是软件走了自己的升级通道比如内置更新器winget 无法识别它是不是最新。有些软件限制必须关闭进程后才能替换文件winget 不会自动关闭正在运行的程序卡住的更新也得手动处理。建议跑upgrade --all之前先把正在使用的软件关掉。跑完后看输出里的错误列表挑几个手动处理基本不会影响整个升级流程。6.2 不同 Windows 版本的默认 winget 情况Windows 11 全系默认内置 App Installer也就是自带了 winget。Windows 10 则分情况2019 年之前老版本不一定预装可能需要手动从商店安装应用安装程序才能获得 winget。如果你在 Win10 的终端里输入winget提示不是内部或外部命令那大概率是没装 App Installer。直接去微软商店搜索应用安装程序安装即可安装完成后 winget 就有了。注意Windows 10 商店里下载的应用安装程序也可能不是最新版因为商店推送有延迟。想立刻拿到新版还是走 GitHub 路线。6.3 越是老版本越要小心一键升级老版本 winget 的命令参数和新版本可能不兼容。比如早期版本执行winget install时-h参数是帮助还是静默安装不同版本定义不同现在-h是 help--silent才是静默。如果你在做自动化脚本里面用了大量命令行参数升级 winget 后务必先在小范围测试脚本里的参数写法很可能要调整。我个人经历中最典型的一次公司某台自动化构建机器上脚本里写了winget install -e --id Google.Chrome升级 winget 后突然报无法识别的选项。查了半天才发现新版把--exact参数改成了--id的默认行为不再需要单独声明-e。这类细枝末节的破坏在每次大版本升级中都可能出现不要以为安装包管理器升级是零成本的。6.4 建议定期检查 winget 版本的节奏winget 的版本更新速度相当快基本每个月都有新功能或修复。如果你发现自己遇到的 winget bug 在旧版本上解不掉先去 GitHub Releases 页看看是不是已经修复发版比到处搜索教程更高效。一个可选的节奏是每个月第一周手动检查一次微软商店里应用安装程序是否有更新。如果没有再去 GitHub 看一下正式版的最新版本号如果落后太多就手动下载安装。这套做法让我基本上不会碰到陈旧版本导致源解析异常的问题。6.5 最后提醒一句不要迷信最新版winget 的预览版虽然能提前尝鲜但可能在日常使用中引入不稳定的行为。比如某次预览版把默认源切换测试地址导致所有搜索都失败又比如某个预览版对传统安装器的静默参数做了重构造成部分软件安装被弹窗卡住。如果你不是功能够用就行建议保持正式版即可跟不上最新版没什么损失。我自己的习惯是正式版发布后观察两周社区反馈GitHub Issues 或相关论坛没有大面积问题才升级。毕竟 winget 是装软件的平台工具它一旦坏了所有基于它的自动化流程都得跟着遭殃。讲了这么多想表达的核心就一句**更新 winget 的本质是更新它的宿主 App Installer别在 winget 命令里白费功夫找自我升级。**按照我上面提到的三种方式和排查列表一般十分钟内就能把版本更新到预期状态。后续的日常维护记住商店优先、GitHub 兜底、预览版慎用这三个原则就够了。
返回列表