Как получить имя компьютера с помощью PsCustomObject?

В настоящее время у меня есть скрипт, который пингует список серверов и проверяет состояние служб, работающих на каждом сервере. Я хочу написать в log.csv.

Я хочу показать, какие компьютеры находятся в автономном режиме, и показать, какая служба находится в состоянии Остановлено.

Как я могу получить имя компьютера или машины с помощью PSCustumObject? В выводе CSV есть строка с надписью offline, но перед ним нет имени компьютера.

$serviceList = Get-Content C:\services.txt

$results = Get-Content C:\servers.txt | ForEach-Object {
    if (Test-Connection -ComputerName $_ -BufferSize 16 -Count 1 -EA 0 -Quiet) {
        foreach ($service in $serviceList) {
            if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
            {
                $s | select MachineName, ServiceName, Status, StartType
            } else {
                # "$_ - Service '$service' does not exist."
            }
        }
    } else {
        $status = Write-Output "Offline"
    }

    [pscustomobject][ordered]@{
        Machine = $_
        Status = $status
    }
}

$results | Export-CSV C:\log.csv -notypeinformation -Append

1 ответ

Решение

Когда вы выводите результаты из Get-Service вы выбираете MachineName:

$s | select MachineName, ServiceName, Status, StartType

Затем для автономного компьютера вы строите объект, используя Machine:

[pscustomobject][ordered]@{
    Machine = $_
    Status = $status
}

Вам нужно обновить свой пользовательский объект до MachineName поэтому он соответствует свойствам, которые вы выбрали выше.

Также необходимо перейти в else{} (замена $status = Write-Output "Offline") поэтому он вызывается только когда компьютер находится в автономном режиме.

Затем вы получите ожидаемый результат:

MachineName ServiceName Статус StartType
----------- -----------    ------ ---------
локальный спулер
localhost   DusmSvc работает автоматически
localhost   DeviceInstall остановлен вручную
noname Оффлайн          

Обновленный код с бонусным обновлением для несуществующих сервисов:

$serviceList = Get-Content C:\services.txt

$results = Get-Content C:\servers.txt| ForEach-Object {
    if (Test-Connection -ComputerName $_ -BufferSize 16 -Count 1 -EA 0 -Quiet) {
        foreach ($service in $serviceList) {
            if ($s = get-service -computer $_ -name $service -ErrorAction SilentlyContinue) {
                $s | select MachineName, ServiceName, Status, StartType
            }
            else {
                [pscustomobject][ordered]@{
                    MachineName = $_
                    ServiceName = $service
                    Status  = "NotFound"
                } 
            }
        }
    }
    else {
        [pscustomobject][ordered]@{
            MachineName = $_
            Status  = "Offline"
        } 
    }
}

$results | Export-CSV C:\log.csv -notypeinformation -Append
Другие вопросы по тегам