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

时间:2016-10-28 15:39:09

标签: powershell

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

示例:

[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

当我在Powershell脚本上面运行时,它会生成一条消息' Try Block'对于这两种服务。

但结果应该是

Catch Block
Try Block

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

2 个答案:

答案 0 :(得分:1)

在Invoke-command语句结束时添加ErrorAction stop后,它正确处理错误。

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

结果:

Catch Block
Try Block

答案 1 :(得分:1)

Invoke-Command在无法找到第一个服务时返回非终止错误,会触发catch{}阻止。< / p>

正如您所发现的那样,通过显式指定-ErrorAction Stop,这会导致cmdlet中的错误被视为终止错误,从而触发catch{}

https://blogs.technet.microsoft.com/heyscriptingguy/2015/09/16/understanding-non-terminating-errors-in-powershell/