Вот демонстрация идеи использования соответствия регулярных выражений ваших частичных имен сервисов. В моей системе есть две службы с очень похожими именами - FontCache
& FontCache3.0.0.0
. мой код получает оба из них, сопоставляя с fontcache
.
что делает код ...
- подделывает чтение в текстовом файле с именами серверов
, когда готов использовать реальные данные, удаляет весь раздел #region/#endregion
и использует Get-Content
или каким-либо другим способом получения системных имен. - устанавливает значение no-repsonse
- строит регулярное выражение "ИЛИ" имен частичных сервисов для соответствия
- итерации по списку серверов
- тесты для соединение с целевой системой
- получает полный список услуг
- фильтрует их для тех, которые соответствуют шаблону регулярного выражения
- создает PSCO для каждой найденной службы
- отправляет его в
$Results
коллекцию - , если соединения не было, он создает PSCO с этой информацией и отправляет его в ту же коллекцию
- отображает коллекцию на экране
в этот момент, отправка его в CSV или использование его позже довольно прямолинейно. [ ухмылка ]
код ...
#region >>> fake reading in a list of servers
# in real life, use Get-Content
$ServerList = @'
LocalHost
10.0.0.1
127.0.0.1
BetterNotBeThere
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a list of servers
$NoResponse = '__NoResponse__'
# the verticle bar "|" is regex for "or"
$Regex_SrvcNameList = @(
'fontcache'
'remoteregistry'
'schedule'
) -join '|'
$Results = foreach ($SL_Item in $ServerList)
{
if (Test-Connection -ComputerName $SL_Item -Count 1 -Quiet)
{
# you may want to change the "ErrorAction" to "Stop"
# and then wrap the line in a "try/catch" block
Get-Service -Name * -ComputerName $SL_Item -ErrorAction 'SilentlyContinue' |
Where-Object {
$_ -match $Regex_SrvcNameList
} |
ForEach-Object {
[PSCustomObject]@{
ComputerName = $SL_Item
ServiceName = $_.Name
ServiceStatus = $_.Status
}
}
}
else
{
[PSCustomObject]@{
ComputerName = $SL_Item
ServiceName = $NoResponse
ServiceStatus = $NoResponse
}
} # end >>> if (Test-Connection -ComputerName $SL_Item -Count 1 -Quiet)
} # end >>> foreach ($SL_Item in $ServerList)
$Results
вывод ...
ComputerName ServiceName ServiceStatus
------------ ----------- -------------
LocalHost FontCache Running
LocalHost FontCache3.0.0.0 Stopped
LocalHost RemoteRegistry Stopped
LocalHost Schedule Running
10.0.0.1 __NoResponse__ __NoResponse__
127.0.0.1 FontCache Running
127.0.0.1 FontCache3.0.0.0 Stopped
127.0.0.1 RemoteRegistry Stopped
127.0.0.1 Schedule Running
BetterNot... __NoResponse__ __NoResponse__