如何使用 winget 以编程方式检查已安装的程序是否有更新?

如何使用 winget 以编程方式检查已安装的程序是否有更新?

我花了大量的时间来尝试利用winget

如果我只是运行winget upgrade,或者winget upgrade <package>对于我关心的每个程序,它不仅会检查是否有更新,而且实际上更新,这通常意味着它会一直卡在等待某种提示。并非所有安装程序都能顺利运行并进行更新。我从经验中知道这一点。

由于实际更新程序winget需要我坐在那里并积极处理它(“跳过提示”的标志不起作用),所以我只想检查无论有更新,以便我可以编写脚本逻辑来确定是否应该通知自己必须运行命令winget upgrade

但如果我这样做winget list,虽然它确实列出了我想要的信息(程序名称、已安装版本、可用版本),但它以适合人类的文本输出,这对于我的脚本来说很难解析。它不支持以 JSON 形式输出。(而且我在 cmd.exe 上下文中,出于必要——不是电源外壳。)

但是,有一项名为“导出”的功能,表面上看它完全符合我的要求:输出包含程序名称的 JSON 文件,但...不包含版本。但是,它有一个名为的秘密标志--include-versions然而

winget export -o "tmp.txt" --include-versions

...仅包括当前安装的版本-- 不是“可用版本”列!这使得无法使用此 JSON 输出来确定任何给定程序是否有可用更新!

他们设计这个系统时到底在想什么?他们到底想让我做什么来了解这些信息?我居然还得想办法用正则表达式来表达人类的文本输出?这感觉太不对劲了,太愚蠢了,尤其是当他们有一个字面上的“导出到 JSON”功能时,避免“可用版本”的关键信息

像往常一样:我一定是忽略了一些东西。

答案1

除非你的winget系统出了问题或者其他什么问题(最新版本的电脑没有这个问题1.4.10173):

winget upgrade默认情况下不带任何开关,只列出可以更新的软件包。

winget upgrade --all是实际升级所有内容的命令。

文档也证实了这一行为。

要确定哪些应用程序需要更新,只需使用升级不带任何参数来显示所有可用的升级。

对于单个包您也可以使用winget list "packagename"winget list package.id

所有提到的命令都列出了NameIdVersionAvailableSource列。数据以不同数量的空格分隔,因此如果您必须使用它,则需要使用批处理进行高级拆分。

答案2

顺便说一句,我编写并发布了一个模块来帮助使用 winget。WingetPosh。 看这里

GitHub 网站了解详情

相关内容