[英]Finding ALL installed applications with PowerShell?
我正在尝试使用 Windows PowerShell 2.0 来查找已安装的应用程序。 我尝试了两种方法,一种使用 WMI,一种使用注册表。 这两种方法都能够调出大量已安装的应用程序和组件,但是似乎都没有调出我感兴趣的应用程序。
我特别在寻找 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*" }
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*" }
通过注册表查找应用程序对我没有多大好处,真的。 除非它还提供某种方法来查找应用程序卸载程序和调用它的正确参数,但情况似乎并非总是如此。 我更喜欢使用 WMI 来查找和卸载我需要卸载的应用程序,因为这不仅允许我为我的所有脚本 (WMI) 使用一个管理界面,而且其他人应该很容易弄清楚如何以便将来维护脚本,因为 WMI 通常都有很好的文档记录。
好吧,很抱歉再次这样做。 我有回答自己问题的坏习惯。
无论如何,我通过在注册表中搜索“CruiseControl.NET”找到了我的问题的答案。 似乎 64 位版本的 Windows 将卸载信息存储在多个位置。 最值得注意的是,卸载信息似乎主要聚集在以下键中:
HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
我能够找到此处列出的系统上的每个程序,包括 CruiseControl.NET。 请注意,这似乎仅适用于64 位 Windows 系统。
下面的命令查找 CruiseControl.Net:
gci "HKLM:\software\Microsoft\windows\CurrentVersion\Uninstall" | %{ gp $_.PSPath } | where { $_.DisplayName -match "CruiseControl.NET" }
我不能诚实地回答您在搜索卸载注册表时 UninstallString 是否始终存在,也不能告诉您是否会找到您的机器上安装的所有应用程序。 我知道这里MS 给出了手动卸载的说明,它使用了这个注册表项中的 UninstallString,所以..我相信对这个主题有更多了解的人会评论..
编辑: Windows 7 机器上的结果
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\Microsoft\windows\CurrentVersion\Uninstall\CruiseControl.NET
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\Microsoft\windows\CurrentVersion\Uninstall
PSChildName : CruiseControl.NET
PSProvider : Microsoft.PowerShell.Core\Registry
NSIS:StartMenuDir : CruiseControl.NET
CCNetVDir : 1
DisplayName : CruiseControl.NET 1.5.6804.1
UninstallString : C:\Program Files\CruiseControl.NET\uninst.exe
DisplayIcon : C:\Program Files\CruiseControl.NET\Server\ccnet.exe
DisplayVersion : 1.5.6804.1
URLInfoAbout : http://ccnet.thoughtworks.com/
Publisher : ThoughtWorks
我在网上发现这个很神奇,在管理员模式下使用
Get-WMIObject Win32_InstalledWin32Program | select Name, Version, ProgramId
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.