Невозможно получить вывод команды при использовании pscustomobject в ForEach - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь получить статус сервиса из списка сервисов. Я собираю результаты в pscustomobject для каждого из сервиса из списка.

$PCServices = @("AJRouter",
"ALG",
"bthserv",
"CertPropSvc",
"Dnscache",
"MapsBroker",
"lfsvc",
"HomeGroupListener",
"HomeGroupProvider",
"vmickvpexchange",
"vmicguestinterface",
"vmicshutdown",
"vmicheartbeat",
"vmicrdv",
"vmictimesync",
"vmicvss",
"SharedAccess",
"iphlpsvc");    
Write-Host "Checking PC Service Status"
    try
    {
        $PCServiceDetails = ForEach($PCSvc in $PCServices)
        {
            Get-Service -Name $PCSvc -ErrorAction Stop
            Write-Host "$($_.DisplayName) : ($($_.Name))  $($_.Status) : Startup Type : $($_.StartType)"
        }
    }
    catch
    {
        Write-Host "Unable to get service details: $($PCServiceDetails.Name)/$($PCServiceDetails.DisplayName) : $($_.Exception)"
    }

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

Write-Host "$($_.DisplayName) : ($($_.Name))  $($_.Status) : Startup Type : $($_.StartType)"

Я не хочу, чтобы указанная выше строка входила в $ PCServiceDetails. Вывод, который я получаю:

 : ()   : Startup Type : 
 : ()   : Startup Type : 
 : ()   : Startup Type :

Пожалуйста, совет. Спасибо

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

, как указал RanadipDutta, Write-Host не принимает входные данные конвейера.я забыл об этом.[ румянец ]

вот мое мнение о вашей проблеме.он помещает try/catch там, где он должен быть - вокруг каждого вызова Get-Service вместо всего цикла.

$PC_ServiceList = @(
    'bits'
    'spooler'
    'w32time'
    'zzz_This_Better_Not_Be_There'
    )

Write-Host 'Checking PC Service Status ...'
Write-Host ''
$PC_ServiceDetails = ForEach ($PCSL_Item in $PC_ServiceList)
    {
    try
        {
        $ServiceInfo = Get-Service -Name $PCSL_Item -ErrorAction Stop

        Write-Host ('{0} : {1}  {2} : Startup Type : {3}' -f $ServiceInfo.DisplayName,
            $ServiceInfo.Name, $ServiceInfo.Status, $ServiceInfo.StartType)

        $ServiceInfo
        }
        catch
        {
        Write-Host ''
        Write-Host ('Unable to get service details: {0} : {1}' -f $PCSL_Item, $_)
        }
    }

$PC_ServiceDetails

вывод ...

Checking PC Service Status ...

Background Intelligent Transfer Service : bits  Running : Startup Type : Manual
Print Spooler : spooler  Running : Startup Type : Automatic
Windows Time : w32time  Stopped : Startup Type : Manual

Unable to get service details: zzz_This_Better_Not_Be_There : Cannot find any service with service name 'zzz_This_B
etter_Not_Be_There'.

Status   Name               DisplayName
------   ----               -----------
Running  bits               Background Intelligent Transfer Ser...
Running  spooler            Print Spooler
Stopped  w32time            Windows Time
0 голосов
/ 25 апреля 2019

Вы не можете передать объект конвейера в Write-Host или write-output таким образом.

Вот полная логика для двойной попытки / захвата, чтобы она не завершилась в случае сбоя одной службы; наряду с проблемой, с которой вы сталкиваетесь на конвейере.

try
{
$PCServices = @("AJRouter",
"ALG",
"bthserv",
"CertPropSvc",
"Dnscache",
"MapsBroker",
"lfsvc",
"HomeGroupListener",
"HomeGroupProvider",
"vmickvpexchange",
"vmicguestinterface",
"vmicshutdown",
"vmicheartbeat",
"vmicrdv",
"vmictimesync",
"vmicvss",
"SharedAccess",
"iphlpsvc");    
Write-Host "Checking PC Service Status"

        $PCServiceDetails = ForEach($PCSvc in $PCServices)
        {
            try
            {
                $service = Get-Service -Name $PCSvc -ErrorAction Stop
                Write-Host "$($service.DisplayName) : ($($service.Name))  $($service.Status) : Startup Type : $($service.StartType)"
            }
            catch
            {
            "Issue in fetching information for the service: $PCSvc"
            $_.Exception.Message
            }
        }
}
catch
{
 Write-Host "Unable to get service details: $($PCServiceDetails.Name)/$($PCServiceDetails.DisplayName) : $($_.Exception)"
}

Надеюсь, это поможет.

...