代码之家  ›  专栏  ›  技术社区  ›  jrista

找到所有安装了powershell的应用程序?

  •  3
  • jrista  · 技术社区  · 14 年前

    我正在尝试使用Windows PowerShell 2.0查找已安装的应用程序。我尝试了两种方法,一种使用wmi,另一种使用注册表。这两种方法都可以显示一个已安装的应用程序和组件的大列表,但是似乎都没有显示我感兴趣的应用程序。

    我特别想要cruisecontrol.net。它出现在程序和功能控制面板小程序的应用程序列表中。我知道它是当前安装的,因为我刚刚卸载并重新安装它以重新启动。但是,以下两种方法似乎都不起作用(它们成功了,但没有返回结果):

    注册表搜索方法

    在注册表中查找 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 用于应用程序密钥。如果我删除 在哪里? ,但它缺少一些确实出现在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_产品对象的文档,它们也返回了大量的信息,它们只是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通常是很好的。我记录在案。

    2 回复  |  直到 9 年前
        1
  •  6
  •   jrista    14 年前

    好吧,很抱歉又这么做了。我有个回答自己问题的坏习惯。

    不管怎样,我通过在注册表中搜索“cruisecontrol.net”找到了问题的答案。64位版本的Windows似乎在多个位置存储卸载信息。最值得注意的是,卸载信息似乎主要按以下键聚合:

    HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
    

    我可以在这里找到我的系统中列出的所有程序,包括cruisecontrol.net。注意,这似乎只是 64位Windows系统 .

        2
  •  2
  •   David Ferenczy Rogožan Hugo L.M    9 年前

    下面的命令查找cruisecontrol.net:

    gci "HKLM:\software\Microsoft\windows\CurrentVersion\Uninstall" | %{ gp $_.PSPath } | where { $_.DisplayName -match "CruiseControl.NET" }
    

    我不能诚实地回答你在搜索卸载注册表时是否始终存在uninstallstring,也不能告诉你是否会找到计算机上安装的所有应用程序。我知道 here 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