使用PowerShell查找所有已安装的应用程序?

jri*_*sta 3 cruisecontrol.net powershell wmi uninstall

我正在尝试使用Windows PowerShell 2.0来查找已安装的应用程序.我尝试了两种方法,一种使用WMI,另一种使用Registry.这两种方法都能够显示已安装的应用程序和组件的大量列表,但是似乎没有人提出我感兴趣的应用程序.

我特意寻找CruiseControl.NET.它出现在"程序和功能"控制面板小程序的应用程序列表中.我知道它目前已安装,因为我刚刚卸载并重新安装它以重新开始.但是,以下两种方法似乎都不起作用(它们成功,但没有返回结果):

注册表搜索方法

在注册表中HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall查找应用程序密钥.如果我删除where,则返回很多,但它缺少很多应用程序,它们出现在windows程序和功能控制面板中.

gci "hklm:\software\microsoft\windows\currentversion\uninstall" 
    | foreach { gp $_.PSPath } 
    | select DisplayVersion,InstallDate,ModifyPath,Publisher,UninstallString,Language,DisplayName 
    | where { $_.DisplayName -match "^Cruise*" }
Run Code Online (Sandbox Code Playgroud)

WMI方法

也返回了很多,但是,根据Win32_Product对象的文档,它们只是MSI安装的应用程序.许多应用程序都丢失了,我猜是因为它们不是MSI.CruiseControl.NET安装程序是NSIS(NullSoft安装系统)...因为它没有出现在这里,我猜它根本不使用MSI,但我很好奇是否有另一种使用WMI的方法找到任何/所有已安装的应用程序,无论它们是否使用过MSI.

gwmi -namespace "root\cimv2" -class "Win32_Product" 
    | select Name,Vendor,Version,IdentifyingNumber 
    | where { $_.Name -match "^Cruise*" }
Run Code Online (Sandbox Code Playgroud)

通过注册表查找应用程序并没有给我带来很多好处,真的.除非它还提供了一些方法来查找应用程序卸载程序和调用它的正确参数,但似乎并非总是如此.我更愿意使用WMI来查找和卸载我需要卸载的应用程序,因为这不仅允许我为我的所有脚本(WMI)使用单一管理界面,而且其他人应该很容易弄清楚如何因为WMI通常有很好的文档记录,所以在将来维护脚本.

jri*_*sta 6

好吧,抱歉再次这样做.我养成回答自己问题的坏习惯.

无论如何,我通过在注册表中搜索"CruiseControl.NET"找到了我的问题的答案.似乎64位版本的Windows在多个地方存储卸载信息.最值得注意的是,卸载信息似乎主要通过以下密钥进行聚合:

HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
Run Code Online (Sandbox Code Playgroud)

我能够在这里列出我系统上的每个程序,包括CruiseControl.NET.请注意,这似乎只适用于64位Windows系统.

  • jrista,回答你自己的问题并不是一个坏习惯. (6认同)