【问题标题】:PowerShell Error handling using Try Catch block resulting wrong result使用 Try Catch 块处理 PowerShell 错误导致错误结果
【发布时间】:2016-10-28 15:39:09
【问题描述】:

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

例子:

[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 脚本上运行时,会为这两个服务生成消息“尝试阻止”。

但结果应该是

Catch Block
Try Block

我们是否有任何解决方法来解决此问题。

【问题讨论】:

标签: powershell


【解决方案1】:

在 Invoke-command 语句的末尾添加 ErrorAction stop 后,它可以正确处理错误。

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

结果:

Catch Block
Try Block

【讨论】:

    【解决方案2】:

    Invoke-Command 在找不到第一个服务时返回非终止错误,这触发catch{}块。

    正如您所发现的,通过显式指定 -ErrorAction Stop 这会导致来自 cmdlet 的错误被作为终止错误处理,因此会触发 catch{}

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

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多