tl;博士
在Windows PowerShell [1] v5.1+中,使用以下命令(在 32 位和 64 位已安装程序中搜索,如控制面板中所示):
Get-Package -ProviderName Programs -IncludeWindowsInstaller '*Google Chrome*' |
ForEach-Object Version
注意:仅 32 位HKEY_LOCAL_MACHINE:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
注册表项可能具有比控制面板显示的更具体的条目 - 我不清楚为什么,但也许控制面板中的复合视图就足够了。
应用于您的示例:
PS> (Get-Package -ProviderName Programs -IncludeWindowsInstaller '*Google Chrome*').Version
70.0.3538.67
至于你尝试了什么:
由于您要Wow6432Node
专门检查注册表项分支,因此您只检查已安装的 32 位程序。
因此,您的函数的更好名称将是Check_32BitProgram_Installed
,或者更符合函数的意图,使用批准的 PowerShell 动词, Get-32BitProgramVersion
.
或者,命名函数Get-ProgramVersion
并查看32 位和64 位位置并处理结果,如Theo和Kevin M. Lapio和Shawn Esterman 的有用答案所示:
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*,
HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*
根据您问题的通用标题,上述解决方案本质上是搜索您将在控制面板 > 程序 > 程序和功能 ( appwiz.cpl
) 中看到的已安装应用程序列表,其中涵盖 32 位和 64 位应用程序:
Windows PowerShell v5.1附带PackageManagement
模块和Programs
包提供程序[1],允许通过Get-Package
cmdlet 检查已安装的程序;在 PSv3 和 PSv4 中,可以手动安装它。
要列出已安装的程序(显示有删节的示例输出):
PS> Get-Package -ProviderName Programs -IncludeWindowsInstaller
Name Version Source ProviderName
---- ------- ------ ------------
Git version 2.18.0 2.18.0 Programs
Microsoft Azure Compute Emu... 2.9.8699.20 Programs
Microsoft Azure Authoring T... 2.9.8699.20 Programs
# ...
输出对象的类型为[Microsoft.PackageManagement.Packaging.SoftwareIdentity]
,具有.Name
和.Version
属性,可启用上述解决方案。
Programs
包提供者支持两个动态选项(特定于该提供者的选项):
[1] 不幸的是,从 v7.0开始,Windows 上的 PowerShell Core中不提供底层Programs
包提供程序- 我不清楚这是否还没有出现,或者永远不会出现 - 请参阅GitHub 问题 #13225。