使用Try-Catch块处理PowerShell错误导致错误结果

使用Try-Catch块处理PowerShell错误导致错误结果,powershell,Powershell,我有两个服务,其中一个服务名称错误(Spooler1)。当我使用try-catch块运行Invoke命令来停止服务时,结果是错误的消息 例如: [array]$Services = "spooler1","spooler" $ComputerName = 'localhost' For ($i=0; $i -lt $Services.Count; $i++) { Try { #Stop service Invoke-Comm

我有两个服务,其中一个服务名称错误(Spooler1)。当我使用try-catch块运行Invoke命令来停止服务时,结果是错误的消息

例如:

[array]$Services = "spooler1","spooler"
$ComputerName = 'localhost'
For ($i=0; $i -lt $Services.Count; $i++)
{
    Try
        {
            #Stop service
            Invoke-Command -ComputerName $ComputerName -ScriptBlock {param($Service) Stop-Service $Service} -ArgumentList $Services[$i]
            Write-Host "Try Block"
        }
    Catch
        {
            Write-Host "Catch Block"

        }
}
结果:

Cannot find any service with service name 'spooler1'.
+ CategoryInfo          : ObjectNotFound: (spooler1:String) [Stop-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StopServiceCommand
+ PSComputerName        : localhost

Try Block
Try Block
Catch Block
Try Block
当我在Powershell脚本之上运行时,会为这两个服务生成消息“Try Block”

但结果应该是

Catch Block
Try Block

我们是否有解决此问题的方法。

在Invoke命令语句末尾添加ErrorAction stop后,它将正确处理错误

..
Invoke-Command -ComputerName $ComputerName -ScriptBlock {param($Service) Stop-Service $Service} -ArgumentList $Services[$i] -ErrorAction Stop
结果:

Cannot find any service with service name 'spooler1'.
+ CategoryInfo          : ObjectNotFound: (spooler1:String) [Stop-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StopServiceCommand
+ PSComputerName        : localhost

Try Block
Try Block
Catch Block
Try Block

Invoke命令
在找不到第一个服务时返回一个非终止错误,该错误不会触发
catch{}

正如您所发现的,通过显式指定
-ErrorAction Stop
,这会将cmdlet中的错误作为终止错误处理,从而触发
捕获{}

请参见: