我花了大量的时间来尝试利用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
。
所有提到的命令都列出了Name
、Id
、Version
、Available
、Source
列。数据以不同数量的空格分隔,因此如果您必须使用它,则需要使用批处理进行高级拆分。
答案2
顺便说一句,我编写并发布了一个模块来帮助使用 winget。WingetPosh。 看这里