非终止错误处理 - if $Error.count 和 $ErrorActionPreference = 'stop' 之间的区别

Non-terminating Error Handling - Difference between if $Error.count and $ErrorActionPreference = 'stop'

我需要处理 powershell 脚本中的非终止错误。最有效的方法是什么?

设置$ErrorActionPreference变量停止并使用try/catch

$ErrorActionPreference = 'stop'
try{
    functionThatCanFail
}catch{
    #Do Stuff
}

或者清除 $Error 变量然后评估它是否被填充

$Error.Clear()
functionThatCanFail
if( $Error.Count -ne 0){
    #Do Stuff
}

我会将 [CmdletBinding()] 添加到您的函数中并将其放入 try/catch.
由于 CmdletBinding,您现在可以使用参数 -ErrorAction Stop.
调用您的函数 $ErrorAction$Error.Clear() 的另一个建议也可以,但不是 'clean' 方式。


function functionThatCanFail
{
    [CmdletBinding()]
    param
    (
        $Param1
    )

    #Do stuff
}

try
{
    functionThatCanFail -ErrorAction Stop
}
catch
{
    #Error case
}

最简单的方法是使用 -ErrorVariable / -ev 公共参数,它记录了给定 cmdlet 报告的所有非终止错误指定变量。

但是请注意,此 仅适用于 cmdlets 高级功能 / 脚本,因为只有它们支持 common parameters - see 如何将您自己的函数定义为 高级 函数。

# Provoke a non-terminating error and silence it, 
# but store it in custom variable $err via common parameter -ErrorVariable
Get-Item /NoSuchFile -ErrorAction SilentlyContinue -ErrorVariable err

if ($err) { # if a / a least one non-terminating error was reported, handle it.
  "The following non-terminating error(s) occurred:`n$err"
}

这样,错误分析是命令范围的,无需记录或更改会话级$Error集合的状态。

但是请注意,您不能以这种方式处理终止 错误。 有关 PowerShell 错误处理的全面概述,请参阅 here