在 ForEach 中使用 pscustomobject 时无法获取命令输出
Unable to get command output when using pscustomobject in ForEach
我正在尝试从服务列表中获取服务状态。我正在为列表中的每个服务在 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 :
请指教。谢谢
您不能像那样将管道对象传递给 Write-Host
或 write-output
。
这是双重 try/catch 的完整逻辑,这样它就不会在一个服务失败的情况下终止;以及您在管道中面临的问题。
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)"
}
希望对您有所帮助。
正如 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
我正在尝试从服务列表中获取服务状态。我正在为列表中的每个服务在 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 :
请指教。谢谢
您不能像那样将管道对象传递给 Write-Host
或 write-output
。
这是双重 try/catch 的完整逻辑,这样它就不会在一个服务失败的情况下终止;以及您在管道中面临的问题。
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)"
}
希望对您有所帮助。
正如 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