Windows 自带的应用商店确实解决了一部分问题,但说实话,对于每天要装十几个软件、或者是运维一堆电脑的朋友来说,一个个去官网下载安装包,再点“下一步”的旧流程还是太耗费时间了。装上 WinGet 之后,我现在的习惯变成了这样:需要装什么,直接在终端里敲一条命令,剩下的交给它去下载和安装;拿到一台新电脑,先批量跑一遍安装清单;系统里的软件多了,定期全量更新一遍。这篇文章就把我在实际使用中总结的 WinGet 下载、安装及使用经验完整梳理一遍,从最基础的命令到进阶的自动化配置,以及那些不翻文档根本踩不到坑,一次性讲透。
1. 为什么我建议你用 WinGet
1.1 传统安装流程痛在哪里
先说一个我自己的真实场景。前年我给部门统一配了新机器,需要给每台电脑装齐办公套件、浏览器、压缩工具、编辑器等大概十几个软件。当时还没有用 WinGet 时,我的做法是准备一个 U 盘,里面放了各种安装包,一台台手动装。难点不在于双击安装,而在于每个软件的安装界面都不一样,有的需要勾选掉捆绑组件,有的需要改安装路径,有的装完要求重启。这种活干到第三台电脑基本就开始机械执行了,非常容易分神出错——我自己就有过在给同事装软件时,手滑把某个浏览器的默认主页给改掉的经历。
这些痛点本质上是没有统一入口导致的:
- 软件来源分散,官网地址记不住,搜索引擎结果里还混着不少打包站和下载站,一不留神就会装上一堆全家桶和推广程序。
- 安装过程交互繁琐,需要人工处理许可证弹窗、选项勾选、路径修改。
- 版本更新全靠自觉,软件不会主动通知你升级,更不会批量升级。
1.2 WinGet 是什么,能帮你做什么
WinGet 是 Windows 包管理器(Windows Package Manager)的命令行工具,你可以理解为微软官方出品的、专门管理 Windows 应用的一个命令行“应用商店”。它能把上面提到的三个痛点一次解决掉:用统一命令搜索软件、用统一命令安装软件、用统一命令批量更新软件。
用它做管理,几个最直观的好处:
- 软件来源更可靠。WinGet 默认走的是官方软件源,相当于帮你把关了一道物理隔离。以后我再也不用依靠记忆里的官网地址,也不用担心搜索结果里混入推广站。
- 安装过程更标准化。绝大多数软件都可以实现静默安装,全程不弹窗、不点“下一步”,装完直接用。
- 更新机制集中化。只需要一条升级命令,WinGet 会自动检查所有清单里软件的更新情况,比每个软件单独去点“检查更新”靠谱得多。
这篇博文面向的读者包括普通用户、开发者、运维人员,只要你平时需要装软件、更新软件,WinGet 就能帮你省出不少时间。接下来直接从下载和安装讲起。
2. 下载与安装:不同 Windows 版本的准备工作
2.1 先确认你的系统是否已经内置
WinGet 的发行情况比大多数用户想象得复杂一些——它不是随 Windows 系统镜像内置的,而是通过“应用安装程序”(App Installer)这个应用分发的。新版 Windows 11 一般会预装,Windows 10 则要分情况看更新频率。
所以我做任何操作前的第一步永远是:在终端里敲一条命令确认现状。
打开“开始”菜单,搜索“终端”或“PowerShell”(建议使用 Windows Terminal),然后输入:
winget --version如果系统已经装好了,你会看到类似下面这样的输出,表示当前版本号:
v1.7.10661如果提示winget不是内部或外部命令,说明你的系统还没有安装,进入下一步。
有一个更稳妥的办法是检查“设置 → 应用 → 已安装的应用”里是否存在“应用安装程序”。这个应用就是 WinGet 的运行载体,找到了它就说明 WinGet 理论上已经可用(前提是别太旧,旧版本可能有兼容问题)。
2.2 通过应用商店安装
对于大多数普通用户,我推荐走应用商店安装,操作难度是最低的:
- 打开“开始”菜单,进入 Microsoft Store(应用商店)。
- 在搜索框输入“应用安装程序”(App Installer)。
- 如果页面显示“安装”,点击并等待完成;如果显示“打开”或“更新”,说明已经安装,直接点“更新”把它升到最新版。
安装完成后再次打开终端,运行winget --version,确认命令可用。商店版的好处是 WinGet 会跟随系统自动更新,你不用手动维护。
2.3 通过官方发布页面手动安装
如果是离线电脑、或者商店访问有问题,就走手动下载的方式。在 Windows 包管理器的官方发布页面,找到最新 release,下载后缀为.msixbundle的安装包。需要注意这个包是有架构区分的,x64 机器下载 x64 版本,ARM64 机器下载 ARM64 版本。下载完成后,双击安装包,系统会弹出安装提示,按提示完成即可。
这里有一个注意点:离线安装 WinGet 前,系统需要有 App Installer 的依赖项。如果双击遇到报错,最常见的原因是缺少 VC++ 运行库或 Microsoft.UI.Xaml 框架。这种情况下可以先装一下运行库,再重新安装 WinGet。
2.4 安装完成后的初始配置检查
无论用哪种方式安装,装好后我都建议做一次初始化检查,主要看三件事:
# 检查版本 winget --version # 查看帮助信息,确认命令可用 winget --help # 查看软件源状态 winget source list正常情况下,source list会显示两个源:winget和msstore。前者是 WinGet 默认的社区软件源,后者对应商店源,用来安装一些只有商店版本的产品。
如果你看到msstore源状态异常,不影响主流程,因为绝大多数常用软件在winget源里都有收录。初始化配置到这里就结束了,下面进入真正的使用环节。
3. 核心命令与高频使用场景
3.1 搜索软件:从关键词到准确包名
WinGet 安装软件用的是包 ID(Package ID),所以第一步往往是找到正确的 ID。搜索命令是:
winget search 关键词比如我想找一个截图工具,随手搜一下:
winget search screencapture输出的列表会展示三列:名称(Name)、ID、来源(Source)。这里有一个新手特别容易踩的坑:Name字段是显示名称,不是安装时用的标识符;只有ID才是后面要用到的准确标识,格式通常是开发商.软件名,比如某知名编辑器是Microsoft.VisualStudioCode。
如果你已经知道确切的软件名称,想跳过模糊匹配的过程,可以用--exact参数做精确匹配:
winget search "Microsoft.VisualStudioCode" --exact这样可以避免搜出一堆名字相近但并不是你要的东西。对于知道官网、但不清楚包名的软件,我的建议是先官网确认开发商名称,再倒推 ID 规则,基本能猜个八九不离十。
3.2 安装软件:最基本的用法与参数
安装命令是:
winget install <包ID>拿压缩软件举例,搜索确认包 ID 后,执行:
winget install 7zip.7zipWinGet 会先解析软件包信息,然后下载安装程序,如果该软件支持静默安装,它会自动带参数执行,整个窗口不会弹出任何安装向导界面。
这里我想重点提醒几个每次安装我都会加的参数,可以说是 WinGet 安装的“标准套餐”:
winget install <包ID> --silent --accept-package-agreements --accept-source-agreements--silent:以静默模式安装,跳过所有交互式界面。--accept-package-agreements:自动接受软件本身的许可协议。--accept-source-agreements:自动接受软件源的协议,首次使用源时如果不去掉这个参数会卡在协议确认这一步。
不加这三个参数,多装几个软件你就会发现,人还是要守在电脑前一路点确认,体验就大打折扣了。
3.3 批量安装:新电脑快速部署的完整脚本
一次性安装多个软件,可以连写多个命令,或者打开文本文件批量执行。我自己写过这样一份“新电脑必备软件”清单,效果一直不错:
# 办公与浏览器工具 winget install Microsoft.Edge --silent --accept-package-agreements --accept-source-agreements winget install Google.Chrome --silent --accept-package-agreements --accept-source-agreements # 文件与系统工具 winget install 7zip.7zip --silent --accept-package-agreements --accept-source-agreements winget install voidtools.Everything --silent --accept-package-agreements --accept-source-agreements # 开发环境 winget install Microsoft.VisualStudioCode --silent --accept-package-agreements --accept-source-agreements winget install Git.Git --silent --accept-package-agreements --accept-source-agreements把这段内容保存为.ps1脚本文件,新机器上右键“使用 PowerShell 运行”即可。用这种方式给几台电脑装同一套环境,比手动一个个装至少快三倍以上。需要注意脚本必须以管理员身份运行,否则部分需要写系统目录的软件会报权限错误。
3.4 更新软件:全量升级和安全策略
软件的日常更新维护,是 WinGet 最日常也最实用的功能。首先要查看哪些软件有新版本:
winget upgrade输出里列出了所有可升级的软件、当前版本号和可用版本号。想全部更新,执行:
winget upgrade --all同样建议加上静默参数:
winget upgrade --all --silent --accept-package-agreements --accept-source-agreements这里有一个我总结出来的重要经验:别在办公高峰期对主力电脑执行upgrade --all。因为有些软件升级后会要求重启,工作做到一半强制重启非常难受。我的习惯是下班前或者午休时间做全量更新,万一某个软件升级出兼容问题,也有时间回滚。
另外不是所有软件都会出现在升级列表里,原因是部分软件自带自动更新机制,WinGet 检测不到版本变化。这是正常的。
3.5 卸载与管理已安装软件
查看本机已安装软件的命令是winget list,它会把所有能被 WinGet 识别的软件列出来,支持模糊筛选:
winget list 7zip卸载命令是winget uninstall,和安装用法对称:
winget uninstall 7zip.7zipWinGet 卸载走的是软件自带的卸载程序,所以卸载界面可能会短暂弹出。这在设计上没太大问题,但如果你想彻底静默卸载,还是要先确认软件本身支不支持静默卸载参数,不支持的话--silent也不会生效。
4. 进阶功能与自动化配置
4.1 管理多个软件源与搜索范围
WinGet 默认有两个源:winget和msstore。两者的定位差异很大,前者更像社区维护的软件仓库,后者则是从商店直接拉取。搜索时可以通过--source参数限定范围:
# 只在默认软件源里查找 winget search VLC --source winget # 只在商店源里查找 winget search VLC --source msstore某些软件只存在于商店源,比如一些 UWP 应用,这时候搜不到不要急着下结论,换一下 source 再搜试试。如果公司网络有特殊限制导致源访问失败,可以执行:
winget source reset --force这个命令会把源配置恢复到默认状态,能解决不少奇怪问题。
4.2 免交互安装:静默参数的原理与局限
很多用户问过我同一个问题:--silent是怎么做到“静默”的?
其实 WinGet 本身不做静默这件事。它会读取软件包清单里预设的“静默安装参数”,然后传给安装程序执行。比如某个安装包支持/S参数,WinGet 就会用/S去调用它;另一个安装包支持/qn(MSI 的静默参数),WinGet 也会自动换成它。所以你不需要记住每个软件自己的静默参数,WinGet 帮你完成了这一层翻译。
局限在于:如果软件本身不支持静默安装,加--silent也没用,WinGet 会提示当前程序的安装程序不支持静默安装参数。碰到这种情况,没有好的绕路办法,老老实实手动装一次。
4.3 导出与导入:同步软件清单到新电脑
这是一个我极度推荐的功能,适合需要经常换电脑、重装系统的人。导出当前软件清单:
winget export -o C:\software-backup.json这会生成一个 JSON 文件,里面记录了你当前装过的所有能识别的软件包和版本。重装完系统后,执行:
winget import -i C:\software-backup.json --accept-package-agreements --accept-source-agreementsWinGet 会自动逐个恢复安装。实测下来,一台主力开发机的软件环境从零恢复到能开始干活,时间可以从原来的一个下午压缩到二十分钟左右。中途个别软件可能因为版本下线装不上,总体成功率在九成以上。
4.4 固定版本:防止软件自动升级带来兼容性问题
升级不是越多越好,开发环境尤其如此。我朋友遇到过某个版本的编译工具链被自动升级后,所有历史项目都无法编译的情况。WinGet 提供了固定版本的功能:
winget pin add <包ID>执行后该软件不会再出现在winget upgrade列表里。想解除固定:
winget pin remove <包ID>我的建议是:开发类工具链、专业版办公插件这类“稳定压倒一切”的软件,强烈推荐固定版本;普通工具类软件,比如阅读器、压缩软件,保持自动升级即可。
4.5 WinGet 配置文件:声明式安装新思路
如果你对完全自动化的初始化环境更感兴趣,可以了解一下 WinGet 的配置文件功能。创建一个 YAML 文件,声明需要安装的软件列表,然后执行:
winget configure <配置文件路径>这种方式更接近声明式管理:你想装什么软件,在文件里写清楚,执行一次命令全部生效。相比手动一条条执行,它的优势是清单可见、可复用、可放进版本管理仓库里当团队标准。缺点是需要额外学习 YAML 语法结构,适合有自动化需求的用户,普通用户先不用上这个强度。
5. 常见问题与排查技巧实录
5.1 winget 命令找不到怎么回事
这个问题的概率排在第一位。基础原因基本可以归类为:系统版本太老、应用安装程序被卸载、PATH 环境变量异常。
我的排查顺序是:
- 打开应用商店,搜索“应用安装程序”,确认它是否存在。不存在就安装,存在就点更新。
- 重启终端,再次运行
winget --version。 - 如果重启终端无济于事,检查环境变量
PATH中是否包含%LOCALAPPDATA%\Microsoft\WindowsApps。 - 最后无奈之举,直接走官方 release 页面下载最新版
.msixbundle覆盖安装。
5.2 安装时提示“拒绝访问”怎么办
这类错误大多是权限问题。WinGet 的安装动作默认使用当前用户的权限,如果软件需要写入Program Files或修改系统服务,就会触达权限边界。
解决办法很直接:使用管理员身份打开终端,再执行安装命令。右键开始菜单选择“终端(管理员)”或者“Windows PowerShell(管理员)”,确认窗口标题栏显示了“管理员”字样再操作。
5.3 找不到软件包怎么处理
winget search明明能找到,但安装时提示“找不到软件包”,通常有两种情况:
第一种是包 ID 写错,或者搜索时用的是显示名而不是 ID。此时回到搜索步骤,用--exact确认准确 ID 再安装。
第二种是软件源暂时没同步那个软件。可以先更新源:
winget source update然后再试。如果还是不行,去软件官网看它是否提供了其他渠道,或者换商店源试试。老实说,WinGet 覆盖面已经很广,但依然存在极少数没收录的冷门软件,这不是工具的问题,生态再大也有盲区。
5.4 下载速度慢或者一直卡住
个人经验里,引起这类情况的原因有网络环境限制、软件源服务器响应慢、被杀毒或安全软件拦截。
推荐的排查步骤:
- 先看其他软件能不能正常下载,排除整体网络问题。
- 如果只有某一个软件卡住,大概率是它的下载服务器问题。这个跟 WinGet 本身没有关系,可以等段时间重试。
- 有安全软件的情况下,先临时关闭防护,再测试安装。WinGet 要执行下载和解压动作,部分安全软件会过度敏感地拦截行为。
5.5 新版安装后无法覆盖旧版本
遇到这种问题,通常是旧版软件的安装方式和新版安装包的类型不一样。比如旧版是 MSI 安装,新版是 EXE 安装,或者反过来。WinGet 卸载旧版本的逻辑就失效了。
最简单的解决思路是先用系统“设置 → 应用”手动卸载旧版,再通过 WinGet 安装新版。实际上这类问题集中在少数老牌软件上,新发布的软件基本都对包管理器做了适配,遇到就当是兼容性孤例处理,不用太纠结。
6. 绕不开的几个注意事项
6.1 使用管理员权限的原则
日常查询和搜索不用管理员,但安装、更新、卸载尽量都开管理员。原因在前面讲过:软件目录权限和系统服务权限往往需要提升。我的习惯是直接在开始菜单右键打开“终端(管理员)”,所有操作都在这个窗口里完成,省得中途换窗口提示权限不足。
6.2 多看官方文档而不是依赖记忆
我见过不少人把“会不会 WinGet 就等同于能不能背下几个命令”当成评判标准。实际上并不是这样。我用了三年,很多参数仍然会忘记具体拼写,但我知道什么时候去查官方文档,知道在哪里能查到源信息、包信息、排错说明。工具型技能,会用搜索引擎和官方文档才是真正靠谱的能力。
6.3 区分系统自带软件与第三方软件
WinGet 能管理的范围不是“全部系统应用”。比如某些 UWP 预装应用、系统组件,它可能识别到但不建议卸载,硬卸可能导致某些系统功能异常。遇到不确定的包,先去搜索确认它是什么,再决定是否卸载。卸载不在你印象里安装过的组件之前,三思而后行。
7. 一些扩展玩法:让 WinGet 更好用
7.1 结合 Windows Terminal 与命令别名
如果你准备把 WinGet 当日常工具,建议装一个 Windows Terminal,把 WinGet 作为默认配置项。配合 PowerShell 的Set-Alias功能,还可以给常用命令设置别名:
Set-Alias wi winget以后输入wi search chrome就能代替整条winget search chrome,少敲几个字符,体验会明显舒服不少。
7.2 配合计划任务做定期更新
WinGet 本身不带定时更新功能,但结合 Windows 任务计划程序就能很容易实现。新建一个基本任务,触发条件设为“登录时”或“每周某天”,操作指向 PowerShell,参数带上更新命令:
winget upgrade --all --silent --accept-package-agreements --accept-source-agreements不过要给一个善意提醒:全自动更新有风险。你自己不在场的时候更新了某些核心软件,回来后可能面对一个不兼容的新环境。实话说我不建议普通用户做全自动更新,最多做到“下载通知”级别,由人来做决定要稳妥得多。
7.3 用 JSON 导出做环境备份
前面提到的winget export不只用于新机迁移。我会在每个月月底做一次导出,把 JSON 文件存到网盘或备份盘里。好处是如果哪一天系统出问题,手上随时有一份可用的安装清单,不至于临时想不起来自己装过哪些软件。配合winget import,恢复成本比想象中低很多。
8. 最后分享一些使用感受
用 WinGet 管理软件的时间久了,最大的变化是心态上的:再也不用担心下载软件时被“全家桶”套路,也不用每天打开一堆软件挨个点“检查更新”。它就像给 Windows 的软件管理装了一个统一入口,你不需要记每个软件的官网在哪,不需要维护一堆安装包,所有信息都收敛在一个命令行界面里。
当然它也有自己的局限,比如对部分老软件的静默安装支持不完整,比如某些冷门软件根本没收录,比如卸载功能更多地依赖于软件自身卸载器。我不会说它是银弹,但它在一个高频场景里确实实打实地省了大量时间——装系统、装环境、批量更新,这三个动作在 WinGet 的加持下,效率能提升数倍。
给刚上手的朋友一个具体建议:从搜索命令开始练手,先装一两个平时用得最多的软件,感受一下“命令行装软件”的流程;熟练后再试着给全系统做一次批量升级,体验一把集中管理的感觉;最后再研究导出导入、固定版本这些进阶功能。循序渐进地把它融入你的使用习惯,相信过不了多久,你也会和我一样,再也回不去那个“到处找安装包”的时代了。