-1
$comps = get-content C:\xyz\test.txt 
foreach($comp in $comps) 
{ 
$result = Get-WmiObject -Class Win32_Product -Computer $comp | sort-object Name | select Name | where { $_.Name -match “abc”} 
$result | out-file -Append out.txt 
} 

Существует приложение abc, im, которое хочет узнать, установлено ли это на нескольких серверах.Как проверить, установлено ли приложение на нескольких серверах - powershell

+0

Каким образом код, который вы опубликовали, не выполняет то, что вы ожидаете от него? – arco444

+1

Будьте осторожны с вызовом 'Win32_Product', который проверяет/восстанавливает все установленные msi. Таким образом, по крайней мере, он медленный и интенсивный процесс. – BenH

+0

Пожалуйста, предложите любые другие варианты. – NJones

ответ

0

Проверьте это «Привет, сценарист» link. Эта ссылка описывает, как запрашивать установленные приложения через реестр.

От link:

Win32_Product: Хороший, плохой, злой [Хорошо] Класс Win32_Product WMI представляет продукцию, как они установлены> по Windows Installer.

Если вы выбрали запрос класса Win32_Product с помощью Get-WmiObject, вы можете найти> себя [Bad], ожидая вашего запроса (или приложения), чтобы вернуть [Ugly] a> проверку согласованности пакетов, которые установлены как это попытки проверить и> восстановить установки. (Для получения дополнительной информации см. Сообщение «Журнал событий» означает, что> установщик Windows перенастроил все установленные приложения). ...

Основываясь на приведенной выше ссылке вы можете запросить установленные продукты через:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize 

Кроме того, вы можете использовать Test-Path, чтобы проверить, если запрашиваемая запись в реестре существует. Пример:

if (test-path HKLM:\Software\abc) { write-host "Found" } else { Write-Host "Not found" } 

Для проверки установленного программного обеспечения на нескольких серверах:

$servers = Get-Content C:\xyz\servers.txt 
$results = @() 
foreach ($server in $servers) { 
    $session = New-PSSession -ComputerName $server -Credential (Get-Credential) 
    $results += Invoke-Command -Session $session -ScriptBlock { 
     test-path HKLM:\Software\abc 
    } 
} 

$results.GetType() # Dump type 
$results | gm # Dump properties 

$results | Format-Table 

Надежда, что помогает.

+0

Есть ли лучшая альтернатива, а не использование wmi .. можем ли мы получить это из реестра? – NJones

+0

Да, я добавил в мой ответ выше один лайнер. – Moerwald

+0

Мое приложение находится под HKLM \ Software \ abc .. Я хочу, чтобы abc под Software .pls help – NJones