包管理器CLI【免费下载链接】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点击查看免费下载Update-WinGetPackage 是 winget-cli 项目附带的 Microsoft.WinGet.Client PowerShell 模块中用于升级已安装软件包的核心 cmdlet。本文以该 cmdlet 的官方帮助文档为主体结合模块源码、示例脚本与自动化测试系统讲解其语法、全部参数、典型用法以及从 PowerShell 层到 WinGet COM API 的底层调用链帮助读者在日常脚本与自动化场景中精准、安全地完成包升级。命令概述SYNOPSISUpdate-WinGetPackage的职责是在已安装的软件包中搜索匹配项并从已配置的源source中安装匹配软件包的更新版本。它等价于winget upgrade命令行在 PowerShell 模块中的对应实现适用于需要在 PowerShell 脚本中批量升级软件、或通过管道与其他 cmdlet 组合使用的场景。命令在模块中的注册位置为 UpdatePackageCmdlet.cs源码中通过[Cmdlet(VerbsData.Update, Constants.WinGetNouns.Package, ...)]注册并提供了别名udwgp[Cmdlet( VerbsData.Update, Constants.WinGetNouns.Package, DefaultParameterSetName Constants.FoundSet, SupportsShouldProcess true)] [Alias(udwgp)] [OutputType(typeof(PSInstallResult))] public sealed class UpdatePackageCmdlet : InstallCmdlet从源码可以看出两个关键事实命令的默认参数集是 FoundSet即按查询条件搜索后升级且声明了SupportsShouldProcess true因此完整支持-WhatIf与-Confirm这类 ShouldProcess 公共参数。语法SYNTAX该 cmdlet 包含两个参数集分别对应两种升级方式。FoundSet默认参数集按搜索条件定位包Update-WinGetPackage [-IncludeUnknown] [-Mode PSPackageInstallMode] [-Override String] [-Custom String] [-Location String] [-Log String] [-Force] [-Header String] [-AllowHashMismatch] [-Architecture PSProcessorArchitecture] [-InstallerType PSPackageInstallerType] [-Locale String] [-Scope PSPackageInstallScope] [-SkipDependencies] [-Version String] [-Id String] [-Name String] [-Moniker String] [-Source String] [[-Query] String[]] [-MatchOption PSPackageFieldMatchOption] [-WhatIf] [-Confirm] [CommonParameters]GivenSet直接给定包对象Update-WinGetPackage [-IncludeUnknown] [-Mode PSPackageInstallMode] [-Override String] [-Custom String] [-Location String] [-Log String] [-Force] [-Header String] [-AllowHashMismatch] [-Architecture PSProcessorArchitecture] [-InstallerType PSPackageInstallerType] [-Locale String] [-Scope PSPackageInstallScope] [-SkipDependencies] [[-PSCatalogPackage] PSCatalogPackage] [-Version String] [-WhatIf] [-Confirm] [CommonParameters]两者的差异集中在如何确定要升级的包FoundSet通过-Id、-Name、-Moniker、-Source、-Query、-MatchOption等搜索条件在源中定位包GivenSet通过-PSCatalogPackage别名InputObject位置 0直接传入由Find-WinGetPackage或Get-WinGetPackage产出的包对象支持管道按值ByValue传入。功能描述DESCRIPTION命令会先扫描系统上已安装的软件包再为匹配的 WinGet 包安装更新版本。默认行为要点如下默认在所有已配置的源中搜索所有基于字符串的搜索默认是不区分大小写的子串匹配不支持通配符可通过-MatchOption参数改变搜索匹配方式。从引擎源码 InstallerPackageCommand.cs 的Update方法可以看到升级路径与安装路径的关键差异在于搜索行为与目标目录var result this.Execute( async () await this.GetPackageAndExecuteAsync( CompositeSearchBehavior.LocalCatalogs, PSEnumHelpers.ToPackageFieldMatchOption(psPackageFieldMatchOption), async (package, version) { InstallOptions options this.GetInstallOptions(version, psPackageInstallMode); options.AllowUpgradeToUnknownVersion includeUnknown; ... return await this.UpgradePackageAsync(package, options); }));升级使用CompositeSearchBehavior.LocalCatalogs本地已安装目录定位已安装包而Install方法使用CompositeSearchBehavior.RemotePackagesFromRemoteCatalogs远程目录中的包-IncludeUnknown会映射为InstallOptions.AllowUpgradeToUnknownVersion决定是否允许升级到注册表中未记录版本的包最终通过PackageManagerWrapper.Instance.UpgradePackageAsync(package, options)调用底层 WinGet COM API 完成升级。示例EXAMPLES官方帮助文档提供了 5 个典型示例覆盖了绝大多数使用场景。示例 1使用查询字符串升级包Update-WinGetPackage Microsoft.PowerShell-Query是位置参数Position 0因此无需写出参数名直接传查询字符串即可。示例 2按包标识符Id升级Update-WinGetPackage -Id Microsoft.PowerShell按包标识符定位目标。注意如果同一标识符存在于多个源中必须补充额外的搜索条件如-Source来选中具体的那一个包实例。示例 3按包名称升级Update-WinGetPackage -Name PowerToys (Preview)按包显示名称定位目标名称含空格时需用引号包裹。示例 4升级到指定版本Update-WinGetPackage Microsoft.PowerShell -Version 7.4.4.0先按Microsoft.PowerShell执行查询搜索再将搜索结果限定为版本7.4.4.0的包。示例 5升级所有可升级的包Get-WinGetPackage | Where-Object IsUpdateAvailable | Update-WinGetPackage通过管道将Get-WinGetPackage输出的包对象过滤出存在可用升级IsUpdateAvailable属性为真的项再逐项升级。这是批量更新所有软件的标准写法。模块自带的示例脚本 Sample_UpdatePackage.ps1 还补充了更多组合用法可作为参考# 按名称升级 Update-WinGetPackage -Name powertoys # 按标识符 指定版本升级 Update-WinGetPackage -Id Microsoft.PowerToys -Version 0.15.2 # 静默模式升级 Update-WinGetPackage -Id Microsoft.PowerToys -Mode Silent # 强制升级 Update-WinGetPackage -Id Microsoft.PowerToys -Force参数详解PARAMETERS以下按官方帮助文档完整列出所有参数并结合源码补充每个参数的默认值与底层映射。-AllowHashMismatch允许在安装程序或依赖项的 SHA256 哈希与 WinGet 包清单中记录的哈希不一致时仍然下载并安装该包。Type: System.Management.Automation.SwitchParameter Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False该参数定义在公共基类 InstallerSelectionCmdlet.cs 中注释明确其为跳过安装程序哈希校验。仅在确认来源可信时使用否则会带来安全风险。-Architecture指定安装包的处理器架构。可选值DefaultX86ArmX64Arm64Type: Microsoft.WinGet.Client.PSObjects.PSProcessorArchitecture Parameter Sets: (All) Accepted values: Default, X86, Arm, X64, Arm64 Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False源码中该属性的默认值为PSProcessorArchitecture.Default。在引擎层若传入非Default的架构会清空InstallOptions.AllowedArchitectures并仅加入指定架构从而约束安装程序选择。-Custom向安装程序传递额外的自定义参数。参数接受单个字符串如需多个参数可把它们都写进同一个字符串。字符串须符合安装程序期望的参数格式若字符串包含空格必须用引号包裹。该字符串会追加到包清单中定义的参数之后。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Force强制运行安装程序执行升级即跳过非安全相关的失败继续执行。Type: System.Management.Automation.SwitchParameter Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False该参数定义于 InstallCmdlet.cs源码注释为在非安全相关失败时继续执行。-Header为 REST 源指定自定义 HTTP 请求头值。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Id指定要搜索的包标识符。默认执行不区分大小写的子串匹配。Type: System.String Parameter Sets: FoundSet Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-IncludeUnknown当已安装包的版本未记录在注册表中时允许对其进行升级即升级到未知版本。Type: System.Management.Automation.SwitchParameter Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False该参数是UpdatePackageCmdlet自身独有的属性不继承自基类在引擎层映射为InstallOptions.AllowUpgradeToUnknownVersion。-InstallerType一个包可能包含多种安装程序类型用此参数选择要使用的安装程序。可选值DefaultInnoWixMsiNullsoftZipMsixExeBurnMSStorePortableType: Microsoft.WinGet.Client.PSObjects.PSPackageInstallerType Parameter Sets: (All) Accepted values: Default, Inno, Wix, Msi, Nullsoft, Zip, Msix, Exe, Burn, MSStore, Portable Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Locale指定安装包的语言区域locale须使用 BCP 47 格式例如en-US。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Location指定包的安装目录。安装程序必须支持备选安装位置否则该参数无效。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False源码中Location属性见 InstallCmdlet.cs对相对路径做了特殊处理若传入的不是绝对路径会自动拼接当前 PowerShell 文件系统位置即SessionState.Path.CurrentFileSystemLocation \ value。-Log指定安装程序日志文件的保存位置。值可以是完全限定路径或相对路径且必须包含文件名例如$env:TEMP\package.log。注意并非所有安装程序都支持该属性。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-MatchOption指定 WinGet 包查询的匹配方式。可选值Equals完全相等EqualsCaseInsensitive忽略大小写的完全相等StartsWithCaseInsensitive忽略大小写的前缀匹配ContainsCaseInsensitive忽略大小写的子串匹配Type: Microsoft.WinGet.Client.PSObjects.PSPackageFieldMatchOption Parameter Sets: FoundSet Accepted values: Equals, EqualsCaseInsensitive, StartsWithCaseInsensitive, ContainsCaseInsensitive Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False注意该参数仅属于 FoundSet 参数集。源码中其默认值为ContainsCaseInsensitive见 FinderCmdlet.cs与帮助文档默认子串匹配的描述一致。-Mode指定安装程序的运行模式。可选值DefaultSilentInteractive并非所有安装程序都支持全部模式。Type: Microsoft.WinGet.Client.PSObjects.PSPackageInstallMode Parameter Sets: (All) Accepted values: Default, Silent, Interactive Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False源码中Mode的默认值为PSPackageInstallMode.Default。-Moniker指定要升级包的 moniker别名标识。例如Microsoft.PowerShell包的 moniker 是pwsh。Type: System.String Parameter Sets: FoundSet Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Name指定要升级的包的显示名称。Type: System.String Parameter Sets: FoundSet Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Override覆盖传递给安装程序的既有参数。与-Custom追加不同该字符串会替换包清单中定义的安装参数。参数接受单个字符串多个参数写在同一个字符串中含空格时必须用引号包裹。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-PSCatalogPackage直接提供PSCatalogPackage对象。可通过Find-WinGetPackage或Get-WinGetPackage命令获取该对象。Type: Microsoft.WinGet.Client.Engine.PSObjects.PSCatalogPackage Parameter Sets: GivenSet Aliases: InputObject Required: False Position: 0 Accept pipeline input: True (ByPropertyName, ByValue) Accept wildcard characters: False该参数仅属于 GivenSet 参数集是唯一同时支持按属性名与按值管道输入的参数——这正是Get-WinGetPackage | Update-WinGetPackage管道链能够工作的机制基础。-Query指定一个或多个要搜索的字符串。默认在全部已配置的源中搜索不支持通配符。命令会将提供的值与以下包清单属性进行比较PackageIdentifierPackageNameMonikerTags比较方式为不区分大小写的子串比较。Type: System.String[] Parameter Sets: FoundSet Required: False Position: 0 Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False源码中Query还带有ValueFromRemainingArguments true见 FinderCmdlet.cs即允许将位置参数中剩余的所有字符串都归入查询词。-Scope指定安装程序的安装范围。可选值AnyUserSystemUserOrUnknownSystemOrUnknown注意指定的安装范围必须存在于 WinGet 包清单中。Type: Microsoft.WinGet.Client.PSObjects.PSPackageInstallScope Parameter Sets: (All) Accepted values: Any, User, System, UserOrUnknown, SystemOrUnknown Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False源码中Scope的默认值为PSPackageInstallScope.Any。-SkipDependencies指定不安装 WinGet 包依赖项。Type: System.Management.Automation.SwitchParameter Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Source指定已配置的 WinGet 源的名称。不指定时搜索所有源。Type: System.String Parameter Sets: FoundSet Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False当-Id命中的包存在于多个源时可通过该参数消除歧义。-Version指定要升级到的包版本。Type: System.String Parameter Sets: (All) Required: False Position: Named Accept pipeline input: True (ByPropertyName) Accept wildcard characters: False-Confirm在运行 cmdlet 前提示确认别名cf。Type: System.Management.Automation.SwitchParameter Parameter Sets: (All) Aliases: cf Required: False Position: Named Accept pipeline input: False Accept wildcard characters: False-WhatIf显示如果 cmdlet 运行会发生什么但实际不执行别名wi。Type: System.Management.Automation.SwitchParameter Parameter Sets: (All) Aliases: wi Required: False Position: Named Accept pipeline input: False Accept wildcard characters: FalseCommonParameters该 cmdlet 支持所有 PowerShell 公共参数-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutVariable、-OutBuffer、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction、-WarningVariable。由于 cmdlet 声明了SupportsShouldProcess true-WhatIf与-Confirm也能正常工作。输入与输出INPUTS / OUTPUTS输入类型以下类型可以通过管道按属性名ByPropertyName传入其中PSCatalogPackage额外支持按值ByValueSystem.Management.Automation.SwitchParameterMicrosoft.WinGet.Client.PSObjects.PSPackageInstallModeSystem.StringMicrosoft.WinGet.Client.PSObjects.PSProcessorArchitectureMicrosoft.WinGet.Client.PSObjects.PSPackageInstallerTypeMicrosoft.WinGet.Client.PSObjects.PSPackageInstallScopeMicrosoft.WinGet.Client.Engine.PSObjects.PSCatalogPackageSystem.String[]Microsoft.WinGet.Client.PSObjects.PSPackageFieldMatchOption输出类型Microsoft.WinGet.Client.Engine.PSObjects.PSInstallResult即每次升级都会输出一个PSInstallResult对象便于脚本捕获升级结果安装/升级状态、错误码等做后续处理。源码实现从 cmdlet 到 COM API 的完整调用链理解Update-WinGetPackage的底层原理可以沿着模块的两层架构追踪模块由Microsoft.WinGet.Client.Cmdletscmdlet 实现与Microsoft.WinGet.Client.Engine真实业务逻辑两个项目组成参见 README.md。Cmdlet 层UpdatePackageCmdlet.cs 在ProcessRecord中收集所有参数构造InstallerPackageCommand并调用其Update方法。-IncludeUnknown、-MatchOption、-Scope、-Architecture、-Mode、-InstallerType以字符串形式传入后由PSEnumHelpers转换为引擎层枚举。引擎层InstallerPackageCommand.cs 的Update方法以CompositeSearchBehavior.LocalCatalogs在本地已安装目录中定位包构造InstallOptions设置AllowUpgradeToUnknownVersion、AllowedArchitectures、InstallerType、PackageInstallScope等最终经InstallOperationWithProgress调用PackageManagerWrapper.Instance.UpgradePackageAsync(package, options)即 WinGet 的 COM API。输出层无论安装还是升级成功后都会输出PSInstallResult结果状态 错误码。这也解释了为何Update-WinGetPackage的参数与Install-WinGetPackage高度重合——两者共用 InstallCmdlet.cs-Mode、-Override、-Custom、-Location、-Log、-Force、-Header、InstallerSelectionCmdlet.cs-AllowHashMismatch、-Architecture、-InstallerType、-Locale、-Scope、-SkipDependencies以及 FinderCmdlet.cs-Id、-Name、-Moniker、-Source、-Query、-MatchOption三个公共基类仅在搜索本地已安装目录与升级而非安装这一点上分道扬镳。自动化测试中的验证模块的 Pester 测试 Microsoft.WinGet.Client.Tests.ps1 覆盖了该 cmdlet 的两条核心路径It Update by Id { $result Update-WinGetPackage -Id AppInstallerTest.TestExeInstaller Validate-WinGetPackageOperationResult $result $expectedExeInstallerResult update } It Update by Name { $result Update-WinGetPackage -Name TestPortableExe Validate-WinGetPackageOperationResult $result $expectedPortableInstallerResult update }测试先用Install-WinGetPackage安装测试包如AppInstallerTest.TestExeInstaller与便携版TestPortableExe再分别通过-Id与-Name执行升级并校验返回的PSInstallResult中安装器错误码与卸载器错误码均为 0。这说明按 Id 升级与按 Name 升级两条主路径都经过真实的安装器执行与结果校验是可靠可复现的用法。相关命令Get-WinGetPackage列出已安装的 WinGet 包可与本命令通过管道组合实现批量升级所有可升级包见示例 5。Uninstall-WinGetPackage卸载已安装的 WinGet 包构成包生命周期管理的完整闭环。使用要点小结默认搜索行为字符串搜索不区分大小写、子串匹配、不支持通配符需要精确匹配时使用-MatchOption Equals或-MatchOption EqualsCaseInsensitive。消除歧义-Id在多源命中同一标识符时报错需配合-Source或改用-Name/-Moniker精确指定。脚本安全批量升级前先用-WhatIf预览关键操作可用-Confirm交互确认。静默升级自动化场景建议使用-Mode Silent并可用-Log指定日志文件便于排障。哈希校验除非完全信任来源不要轻易使用-AllowHashMismatch绕过安装程序哈希校验。赞分享包管理器CLI【免费下载链接】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点击查看免费下载相关推荐OpenCorePkg黑苹果引导终极实战从零配置到性能优化的完整指南OpenCorePkg黑苹果引导终极实战从零配置到性能优化的完整指南 OpenCorePkg作为现代黑苹果引导的黄金标准提供了比传统引导方式更安全、更稳定的包管理器CLIPhotoshot技术实现深度解析如何构建现代化AI头像生成系统Photoshot技术实现深度解析如何构建现代化AI头像生成系统 Photoshot是一个开源AI头像生成Web应用采用Next.js全栈架构集成Repl包管理器CLI终极指南一键掌握暗黑破坏神2角色编辑器的完整使用技巧终极指南一键掌握暗黑破坏神2角色编辑器的完整使用技巧 暗黑破坏神2角色编辑器Diablo Edit2是一款功能强大的开源工具专门用于编辑和修改暗黑破坏神包管理器CLI上一篇CUE语言安装与配置指南下一篇LSPosed开源项目安装与配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
