更新系统为 PowerToys 提供自动更新检查、下载和用户通知功能。它会监控 GitHub 发布、遵守企业策略、处理按流量计费连接,并与通知系统集成,以便向用户告知可用更新。
有关安装过程和分发渠道的信息,请参阅 安装方法。有关构建和发布管道的详细信息,请参阅 构建和部署管道。
更新系统作为 PowerToys 运行程序中的后台服务运行,定期检查新版本,并根据用户设置和系统策略管理更新工作流。
来源: src/runner/UpdateUtils.cpp1-296 src/common/notifications/notifications.cpp1-396
系统实现定期自动检查和手动用户触发检查,并根据成功或失败状态设置不同的间隔。
来源: src/runner/UpdateUtils.cpp203-259 src/runner/UpdateUtils.cpp120-201
该系统维护一个状态机来跟踪更新过程并确定适当的用户操作。
UpdateState 类管理这些转换并将状态持久化到磁盘
| 状态管理 | 描述 | 用户可执行操作 |
|---|---|---|
upToDate | 当前版本是最新版本 | 无 |
readyToDownload | 有新版本可供下载 | 通过设置手动下载 |
readyToInstall | 安装程序已下载并准备就绪 | 安装更新 |
errorDownloading | 下载或安装失败 | 重试操作 |
networkError | 无法检查更新 | 检查网络连接 |
来源: src/runner/UpdateUtils.cpp126-133 src/runner/UpdateUtils.cpp175-189
系统会同时尊重用户偏好和企业组策略来控制更新行为。
| 设置 | 位置 | 默认 | 描述 |
|---|---|---|---|
downloadUpdatesAutomatically | general_settings.json | true | 在非计费连接上自动下载更新 |
showNewUpdatesToastNotification | general_settings.json | true | 显示新更新的 Toast 通知 |
| GPO 设置 | 功能 | 启用时的效果 |
|---|---|---|
getDisableNewUpdateToastValue() | 禁用更新通知 | 不显示 Toast 通知 |
getSuspendNewUpdateToastValue() | 暂停次要版本的通知 | 仅主要版本通知 |
getDisableAutomaticUpdateDownloadValue() | 禁用自动下载 | 仅手动下载 |
IsMeteredConnection() 函数会检查多个 Windows API 以确定用户是否连接到按流量计费的网络。
来源: src/runner/UpdateUtils.cpp94-118 src/runner/UpdateUtils.cpp147-152 src/runner/UpdateUtils.cpp154-166 src/runner/UpdateUtils.cpp222-227
更新系统与 PowerToys 的 Toast 通知框架集成,以通知用户有关可用更新的信息。
| 通知函数 | 触发器 | 用户可执行的操作 |
|---|---|---|
ShowNewVersionAvailable() | 更新已下载并准备好安装 | "立即更新",“更多信息” |
ShowOpenSettingsForUpdate() | 有更新但尚未下载 | “更多信息” |
系统实现智能通知抑制,以避免信息过载。
来源: src/runner/UpdateUtils.cpp41-77 src/runner/UpdateUtils.cpp145-166
当用户选择安装更新时,系统会启动一个单独的更新程序进程来处理安装。
LaunchPowerToysUpdate() 函数会为更新可执行文件创建一个新进程。
系统在专用的 Updates 文件夹中管理更新文件。
| 文件类型 | 位置 | 目的 |
|---|---|---|
| 下载的安装程序 | %LocalAppData%\Microsoft\PowerToys\Updates\ | MSI 文件的临时存储 |
| 更新状态 | update_state.json | 持久化更新状态跟踪 |
| 安装程序日志 | 系统临时目录 | 安装日志记录和诊断 |
来源: src/runner/UpdateUtils.cpp79-92 src/runner/UpdateUtils.cpp172-173 tools/BugReportTool/BugReportTool/Main.cpp332-335
Bug Report Tool 会自动排除与更新相关的文件,以保护用户隐私,同时保留诊断信息。
来源: tools/BugReportTool/BugReportTool/Main.cpp272-292 tools/BugReportTool/BugReportTool/Main.cpp333-334