菜单

更新系统

相关源文件

更新系统为 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

更新配置和策略

系统会同时尊重用户偏好和企业组策略来控制更新行为。

用户设置

设置位置默认描述
downloadUpdatesAutomaticallygeneral_settings.jsontrue在非计费连接上自动下载更新
showNewUpdatesToastNotificationgeneral_settings.jsontrue显示新更新的 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

Toast 通知系统

更新系统与 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 报告的集成

Bug Report Tool 会自动排除与更新相关的文件,以保护用户隐私,同时保留诊断信息。

来源: tools/BugReportTool/BugReportTool/Main.cpp272-292 tools/BugReportTool/BugReportTool/Main.cpp333-334