Поиск ВСЕХ установленных приложений с PowerShell? - PullRequest
3 голосов
/ 11 февраля 2010

Я пытаюсь использовать 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_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, как правило, хорошо документирована.

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Ну, извините, чтобы сделать это снова. У меня была плохая привычка отвечать на мои собственные вопросы.

В любом случае, я нашел ответ на свой вопрос, выполнив поиск в реестре «CruiseControl.NET». Кажется, что 64-битные версии Windows хранят информацию об удалении в нескольких местах. В частности, информация об удалении, по-видимому, в основном агрегируется по следующему ключу:

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

Мне удалось найти все программы в моей системе, перечисленные здесь, включая CruiseControl.NET. Обратите внимание, что это, похоже, имеет место только в 64-битных системах Windows .

2 голосов
/ 12 февраля 2010

Следующая команда находит 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
...