
winget uninstall 命令完全指南用 Windows 包管理器精确卸载应用与底层执行原理【免费下载链接】winget-cliWinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface).项目地址: https://gitcode.com/gh_mirrors/wi/winget-cliwinget uninstall是 Windows 包管理器WinGet中用于卸载指定应用程序的核心命令支持通过查询字符串、应用 ID、名称、moniker、产品代码Product Code等多种维度定位待卸载应用并针对 EXE、MSI、MSIX、便携式portable应用、字体等不同安装技术走不同的卸载路径。本文以官方文档 uninstall.md 为骨架结合 UninstallCommand.cpp 与 UninstallFlow.cpp 源码系统讲解该命令的全部参数、用法示例、多结果处理策略并深入剖析其从搜索匹配到执行卸载器再到记录卸载结果的完整工作流帮助你既能熟练操作又能理解其内部机制。命令概述与使用前提winget uninstall命令用于卸载指定的应用程序。它的一个关键约束是你必须指定足够精确的匹配字符串如果查询存在任何歧义匹配到多个应用winget 会提示你追加过滤条件将卸载目标收敛到唯一一个应用上。该命令工作在 winget 的已安装应用视角上——从源码看UninstallCommand::ExecuteInternal在执行时会调用Workflow::OpenCompositeSource(Workflow::DetermineInstalledSource(context))见 UninstallCommand.cpp即打开已安装包复合源进行搜索这与 list 命令使用的已安装包视图一致意味着凡是被 Windows 识别为已安装的应用只要其卸载信息可被发现都可以尝试用 winget 卸载而不仅是 winget 自己安装的应用。用法与命令别名winget uninstall [[-q] query...] [options]该命令提供两个内置别名在 UninstallCommand.h 中注册removerm因此winget remove 应用、winget rm 应用与winget uninstall 应用完全等价。参数Arguments参数说明-q, --query用于搜索应用包的查询字符串。它是位置参数可接收多个查询词配合--id、--name、--moniker等过滤器一起使用。在源码中位置查询参数对应Args::Type::MultiQuery见 UninstallCommand.cpp。-q支持多查询词的另一个体现是当同时传入多个查询时winget 会走GetMultiSearchRequests→SearchSubContextsForSingle→UninstallMultiplePackages的多包卸载流程见 UninstallCommand.cpp。选项Options下表完整列出winget uninstall支持的选项。与官方文档一致并按源码中GetArguments()的参数声明顺序做了归类说明选项说明-m, --manifest后跟清单YAML文件的路径。使用本地 YAML 清单驱动卸载体验详见下文本地清单卸载。--id将卸载范围限定到应用的 IDPackage Identifier。--name将搜索范围限定到应用的名称。--moniker将搜索范围限定到应用清单中登记的 moniker。-v, --version指定要卸载的精确版本。若未指定winget 会卸载已安装的最高版本应用。-s, --source将搜索限定到指定名称的源source。必须后跟源名称。-e, --exact使用查询中的精确字符串进行匹配包括大小写敏感检查不使用默认的子串匹配行为。-i, --interactive以交互模式运行卸载器。默认体验是展示卸载器进度。-h, --silent以静默模式运行卸载器抑制所有 UI。默认体验是展示卸载器进度。-o, --log将日志输出到日志文件。必须提供你有写入权限的文件路径。--product-code使用产品代码Product Code过滤已安装应用。--scope选择已安装包的安装范围过滤user或machine。--force直接运行命令并继续处理非安全相关问题。--purge删除包目录便携式应用中的所有文件与目录。--preserve保留包便携式应用创建的所有文件与目录。--header可选的 Windows-Package-Manager REST 源 HTTP 头。--accept-source-agreements在源操作期间接受所有源协议。-?, --help获取该命令的更多帮助。--wait退出前提示用户按任意键。--logs, --open-logs打开默认日志位置。--verbose, --verbose-logs为 winget 启用详细日志。--disable-interactivity禁用交互式提示。说明源码 UninstallCommand.cpp 中还注册了--all-versionsArgs::Type::AllVersions、--channelArgs::Type::Channel以及认证相关选项AuthenticationMode、AuthenticationAccount等它们随 winget 版本演进在帮助输出中呈现本文以官方文档表格为准。关键选项的底层行为--interactive与--silent的取舍在 UninstallFlow.cpp 的GetUninstallInfo中对于 EXE/Burn/Inno/Nullsoft 类型winget 默认优先读取清单中的SilentUninstallCommand静默卸载命令只有当该字段缺失或用户显式传入--interactive时才回退到StandardUninstallCommand标准交互式卸载命令。--silent则直接采用静默命令全程无 UI。--purge/--preserve与用户设置对于便携式portable应用Purge标志由命令行--purge或用户设置uninstall.purgePortablePackage决定且--preserve可以显式覆盖该设置见 PortableFlow.cpp。即默认情况下 portable 包的卸载是否清空其数据目录取决于你的 winget 设置命令行选项拥有最高优先级。--product-code主要用于直接按 Windows InstallerMSI注册的产品代码定位应用适用于通过winget list找到但用名称/ID 难以精确匹配的场景。示例查询以下是官方文档给出的两个典型卸载示例均完整可用卸载指定版本的应用程序winget uninstall --name powertoys --version 0.15.2使用应用 ID 卸载应用程序MSI 类应用的 ID 通常是 GUIDwinget uninstall --id {24559D0F-481C-F3BE-8DD0-D908923A38F8}当成功锁定唯一待卸载应用后winget 即开始执行卸载。下图展示了同时传入 nameorca与 id 后的实际执行过程多结果Multiple selections处理如果提供给 winget 的查询没有收敛到唯一一个应用winget 会显示多个匹配结果此时你可以追加--id、--name、--moniker、--product-code、--version等过滤条件将目标精确定位到唯一应用后重试。从源码看这一行为由Workflow::SearchSourceForSingle与Workflow::EnsureOneMatchFromSearchResult(OperationType::Uninstall)保障见 UninstallCommand.cpp搜索必须恰好命中一个匹配项否则流程终止并返回错误码APPINSTALLER_CLI_ERROR_MULTIPLE_APPLICATIONS_FOUND0x8A150016见 returnCodes.md。另外如果检测到同一应用安装了多个版本且未指定--versionUninstallSinglePackage也会报出同样的多版本错误提示你补充版本信息见 UninstallFlow.cpp若显式传入--all-versions则会逐个版本尽力卸载只要有一个版本失败最终返回APPINSTALLER_CLI_ERROR_MULTIPLE_UNINSTALL_FAILED0x8A150066。卸载并非由 Windows 包管理器安装的应用如 list 命令所说明winget list展示的不仅是 winget 安装的应用还包括通过其他途径安装的应用程序。因此你可以用这两条命令快速清理电脑上的任意应用先用winget list找到应用再把其id传给 uninstall 完成卸载。之所以可行是因为卸载的关键信息卸载命令、产品代码、包系列名等来自已安装应用的注册元数据而非 winget 自身的安装记录其来源包括 ARP添加/删除程序注册表项、MSI 产品信息、MSIX 部署信息等。源码视角一次卸载的完整执行链路下面结合源码梳理一次winget uninstall从输入到完成的核心流程。1. 命令入口与分支UninstallCommand::ExecuteInternal 先设置TreatSourceFailuresAsWarning标志随后按三种情况分流--manifest分支从参数读取本地清单GetManifestFromArg再用清单内容去已安装源中搜索对应包SearchSourceUsingManifest要求唯一匹配后执行UninstallSinglePackage单个查询分支无-q多查询词SearchSourceForSingle→HandleSearchResultFailures→EnsureOneMatchFromSearchResult→UninstallSinglePackage多查询分支-q传入多个查询词GetMultiSearchRequests→SearchSubContextsForSingle→UninstallMultiplePackages逐个包尽力卸载。2. 单包卸载的子流程UninstallSinglePackage见 UninstallFlow.cpp在确认唯一匹配后进入UninstallSinglePackageVersion其工作流为见 UninstallFlow.cppReportInstalledPackageVersionIdentity → EnsureSupportForUninstall → GetUninstallInfo → GetDependenciesInfoForUninstall → ReportDependencies → ExecuteUninstaller → RecordUninstall其中EnsureSupportForUninstall会检查若卸载的是machine 作用域的 portable 包或 MSIX 包则要求以管理员身份运行见 UninstallFlow.cpp。3. 按安装技术分派卸载器GetUninstallInfo根据已安装包的InstalledType元数据读取卸载所需信息见 UninstallFlow.cpp安装类型卸载信息来源卸载执行方式EXE / BURN / INNO / NULLSOFT清单或 ARP 中的UninstallString优先静默命令ShellExecute 执行卸载字符串ShellExecuteUninstallImplMSI / WIXMSI 产品代码Product Code列表通过 msiexec 执行ShellExecuteMsiExecUninstallMSIX / MS Store包系列名Package Family Name调用部署 API 移除包MsixUninstall支持 user/machine 作用域PORTABLE产品代码 安装作用域/架构便携式卸载器PortableUninstallImpl可配合--purge/--preserve清理或保留数据FONT无字体卸载流程FontUninstallImpl若某个已安装包拿不到任何卸载信息例如 EXE 类型既无静默也无标准卸载命令、MSI 无产品代码流程会以错误APPINSTALLER_CLI_ERROR_NO_UNINSTALL_INFO_FOUND0x8A15002F即Uninstall command not found终止。ExecuteUninstaller在执行前还会尝试获取跨进程安装锁CrossProcessInstallLock避免与正在进行的安装/卸载操作冲突若等待锁被用户取消则直接放弃本次操作见 UninstallFlow.cpp。4. 卸载结果记录卸载成功后RecordUninstall见 UninstallFlow.cpp会把本次卸载同时记录到该包所有关联源的跟踪目录Tracking Catalog中确保后续list/upgrade等命令对已卸载状态的认知一致。若卸载器返回非零退出码ReportUninstallerResult会输出错误码并如有附带卸载器日志路径然后以APPINSTALLER_CLI_ERROR_EXEC_UNINSTALL_COMMAND_FAILED0x8A150030等对应错误码终止见 UninstallFlow.cpp。5. 权限与安全边界值得注意的安全设计当 winget 以管理员非默认完整令牌上下文运行时会阻止卸载 user 作用域的 EXE/Burn/Inno/Nullsoft/Portable 包以防提权路径见 UninstallFlow.cpp 与GetUninstallInfo中的检查此时返回APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_ACTION_PROHIBITED0x8A15007D。常见错误码速查卸载相关的主要错误码完整清单见 returnCodes.md错误码含义0x8A150016匹配到多个应用/多个版本需要进一步过滤0x8A15002F未找到卸载命令该包不提供可用的卸载信息0x8A150030执行卸载命令失败0x8A150057便携式portable包卸载失败0x8A150066多包/多版本卸载中有一个或多个失败0x8A15007D管理员上下文不允许卸载 user 作用域包0x8A15008B字体卸载失败可能需要重启后重试相关主题使用 winget 工具安装和管理应用程序list 命令查看已安装应用并配合定位卸载目标install 命令与 uninstall 对应的安装流程winget 返回码与错误含义【免费下载链接】winget-cliWinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface).项目地址: https://gitcode.com/gh_mirrors/wi/winget-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考