首页 > 解决方案 > 在 ForEach 中使用 pscustomobject 时无法获取命令输出

问题描述

我正在尝试从服务列表中获取服务状态。我正在为列表中的每个服务在 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 :

请指教。谢谢

标签: powershellpowershell-3.0powershell-4.0

解决方案


您不能将管道对象传递给Write-Hostwrite-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)"
}

希望能帮助到你。


推荐阅读