WinGet 随 Windows 11 一起预装,但绝大多数人从没打开过它。这也可以理解——微软把它藏在了命令行后面,还几乎不做任何宣传。可话说回来,一行命令装好一个应用,怎么都比找对下载页面、再点过一堆想给你装浏览器扩展的安装向导要强。
微软文档里记录了十八个顶级命令,其中好几个是给往仓库提交包的人用的,而不是给从仓库装包的人用的。下面这十七条覆盖了一个普通 Windows 11 用户真正需要的部分。
在 Windows 终端、PowerShell 或命令提示符里运行它们。少数几条需要管理员权限,需要的地方我会标注。
先确认你装了没有
```Bash/Shell winget --version
能返回版本号就说明没问题。如果 Windows 提示"无法识别该命令",说明 WinGet 缺失或者不在 PATH 里——这种情况在从 Windows 10 升级上来的机器上比全新安装的 Windows 11 更常见。

## 你应该掌握的 WinGet 命令……
### 1. winget search
```Bash/Shell
winget search firefox
按名称、发布者或别名查找软件包。输出里会给出名称、ID、版本和来源。真正关键的是那个 ID,而且它很少能靠猜中:Firefox 是 Mozilla.Firefox,VLC 是 VideoLAN.VLC,7-Zip 是 7zip.7zip。先搜索,是避免装到"差不多但不对"的那个包的办法。

2. winget show
```Bash/Shell winget show --id Mozilla.Firefox
搜索结果里经常有两三个名字几乎一样的包,其中一个才是官方版本,剩下的可能是分叉版、便携版,或者别人重新打包的。这条命令会显示发布者、版本、许可证、主页、安装程序类型和下载地址,通常足够把它们区分开。

### 3. winget install
```Bash/Shell
winget install -e --id Mozilla.Firefox
-e 表示对 ID 做精确匹配。不加它,WinGet 会做模糊匹配,可能装到跟你想要的东西只差一点点的那个包。

养成把 -e --id 连在一起用的习惯。模糊匹配在你随便探索时没问题,但写脚本时就是个坑。
4. 安装指定版本
```Bash/Shell winget install -e --id Mozilla.Firefox --version 128.0
把安装固定在某个版本,而不是直接取最新版。当新版本把你的东西搞坏了,或者你需要跟另一台机器保持版本一致时,这就很有用。
先运行 `winget show --id <包名> --versions` 看看仓库里到底有哪些版本可选。
### 5. 静默安装
```Bash/Shell
winget install -e --id 7zip.7zip --silent --accept-package-agreements --accept-source-agreements
--silent 会屏蔽安装程序界面,两个 agreement 参数则让 WinGet 不再停下来问你是否接受条款。
这是脚本里或批量安装时该用的形式。注意 --silent 只在包清单支持静默安装时有效,所以有些应用仍然会弹出自己的窗口。
6. winget list
```Bash/Shell winget list
**列出这台机器上安装的所有东西**,不只是你用 WinGet 装的。手动下载安装的应用也会出现在**里面**——很多人第一次运行时会因此被吓一跳。

你还可以在这条命令后面加搜索词来进一步缩小范围……
```Bash/Shell
winget list adobe
7. 查看有哪些更新等着装
```Bash/Shell winget upgrade
列出有更新版本的已安装包,当前版本和可用版本并排显示。
有些条目会显示成 Unknown 版本。这说明 **WinGet** 读不到已安装的版本号,通常是因为这个应用是在 WinGet 之外安装的。

### 8. 一次性更新全部
```Bash/Shell
winget upgrade --all --include-unknown --silent --accept-package-agreements --accept-source-agreements
这条会把所有有更新版本的包全部升级,中途不做任何提示。如果这篇文章你只记一条命令,就记这条。
--include-unknown 是大多数教程漏掉的那个参数。没有它,WinGet 会完全跳过那些版本未知的条目——在一台典型机器上,这可占了已安装应用的一半。

9. winget uninstall
```Bash/Shell winget uninstall -e --id Mozilla.Firefox
**移除**软件包,包括在 WinGet 之外安装的那些——前提是它们出现在 `winget list` 里。它支持跟 install 一样的 `--silent` 参数,所以能放进清理脚本里用。
### 10. winget export
```Bash/Shell
winget export -o C:\Users\YourName\apps.json
把你已安装的包导出成一个 JSON 文件。在重装系统之前、把机器交给别人之前,或者干脆每月做一次记录,都该跑一下这条命令。
不在 WinGet 仓库里的包会被跳过,过程中 WinGet 会告诉你跳过了哪些。
11. winget import
```Bash/Shell winget import -i C:\Users\YourName\apps.json
从导出的文件里重新装回所有东西。配合 export 使用,这就是重装系统后重建应用清单的办法,不用一个个去下载页面点。
想让它一路跑完不停下来问你,加上 `--accept-package-agreements`。
### 12. winget pin
```Bash/Shell
winget pin add -e --id Mozilla.Firefox
winget pin list
winget pin remove -e --id Mozilla.Firefox
固定(pin)能阻止某个包被 winget upgrade --all 更新。凡是新版本会打断你工作流的,都该用上它——比如驱动工具,或者许可证绑定了特定版本的工具。
被固定的包会从升级结果里隐藏,除非你加上 --include-pinned。
13. winget download
```Bash/Shell winget download -e --id Mozilla.Firefox
只下载安装程序,不运行它。文件默认落在你的"下载"文件夹,用 `-d` 可以指定到别处。
这台机器没网,或者你想给好几台电脑用同一个安装包而不想重复下载时,这条命令很顺手。
### 14. winget repair
```Bash/Shell
winget repair -e --id Microsoft.VisualStudioCode
触发应用自带的修复流程,跟你在"程序和功能"里点到的那个一样。只在包清单定义了修复行为时才有效,所以很多应用上它会直接失败。
15. winget source
```Bash/Shell winget source list winget source reset --force
WinGet 默认从两个源拉取:社区仓库(名为 winget)和 msstore(微软商店应用)。
`source list` 显示当前配置了哪些源。`source reset --force` 会把一切恢复成默认值,能解决相当一部分莫名其妙的报错。重置操作需要管理员权限。
### 16. winget settings
```Bash/Shell
winget settings
用你默认的 JSON 编辑器打开 WinGet 的设置文件。默认安装范围、实验性功能开关、进度条样式、更新行为,都在这里改。
```Bash/Shell winget settings export
把当前设置以 JSON 形式打印在终端里,只想确认某个值时这样更快。
### 17. winget configure
```Bash/Shell
winget configure -f dev-setup.winget
应用一个描述目标机器状态的配置文件,内容涵盖装哪些包、应用哪些设置、以什么顺序执行。
它需要先装 DSC 模块:
Bash/Shell
Install-Module Microsoft.WinGet.DSC -Force
这是本文最重的一条命令,大多数人一辈子也用不到。之所以列出来,是因为重装系统后重建整台机器这件事,清单里其他命令都干不好。
可以放心忽略的命令
微软文档里的命令中有三条,是给发布包的人用的,不是给安装包的人用的。
winget hash 为安装文件生成 SHA256。winget validate 在提交到仓库前校验清单。winget dscv3 为配置工具暴露 DSC v3 资源。
这三条跟其他命令写在同一个文档里,所以它们经常出现在面向普通用户的命令清单中。除非你要提交包,否则跳过它们。
如果 WinGet 无法识别
几乎所有情况都出在下面几条里。
- "应用安装程序"包缺失,最常见于从 Windows 10 升级上来的机器。从微软商店装上"应用安装程序",它就回来了。
- PATH 条目缺失,虽然 WinGet 本身在。注销再登录,让环境重新读取。
- 你以 SYSTEM 身份运行,或者处在 WinGet 不支持的环境里。它是设计给已登录用户运行的。
常见问答
WinGet 用起来安全吗?
默认的 winget 源是微软的社区仓库,包清单位入库前需要审核,安装程序也要跟公布的哈希值核对。msstore 源就是微软商店本身。两者都比你去搜下载页面要安全——搜出来的头几条往往都是广告。
WinGet 在 Windows 10 上能用吗?
能,1809 及更高版本通过"应用安装程序"包支持。Windows 11 则开箱即用。
为什么 winget upgrade 会漏掉一些应用?
两个原因。在 WinGet 之外安装的应用常常上报为 Unknown 版本,除非你加 --include-unknown,否则升级会跳过它们。而完全不在仓库里的应用则无法追踪。
能拿 WinGet 替代微软商店吗?
对大多数桌面应用来说可以。商店应用依然能通过 msstore 源获取,所以 winget install --source msstore <名称> 在同一个终端里就能拿到它们。
需要管理员权限吗?
不是所有操作都需要。按用户安装不需要提权。全机安装,以及 source reset,会弹提示要求提权。