【问题标题】:Catch all Powershell errors using Try/Catch/Finally使用 Try/Catch/Finally 捕获所有 Powershell 错误
【发布时间】:2021-02-23 08:12:55
【问题描述】:

我有一个 1500 多行的 Powershell 脚本,该脚本已经过增强,可以将进度和错误记录到 Azure 表存储。

问题是没有记录所有错误。

这是在不过多更改脚本并捕获所有错误的情况下完成此任务的最简单方法吗?

$ErrorActionPreference = "Stop"

function a
{
    "a"
}

function b
{
    "b"
    Get-Content foo
}

function c
{
    "c"
}

Try
{
    a
    b
    c
}
Catch
{
    "Catch & Log Error"
    $Error[0].Exception
}
Finally
{
    "The End"
}

更新

输出是:

a
b
Catch & Log Error
Cannot find path 'C:\foo' because it does not exist.
The End

【问题讨论】:

  • 你想要完成什么或者你不理解这段代码?你期望这段代码做什么而不是它实际做什么?按我的预期工作
  • 终止错误和非终止错误是有区别的。您可以捕获终止错误,但不能捕获非终止错误。通过将 ErrorActionPfrence 设置为 Stop,这会将非终止错误转换为终止错误。您将能够“捕获”所有错误,但正如@EBGreen 指出的那样,您的脚本现在将因任何错误而停止。这同样适用于 Trap 语句。如果这是您想要的,那您就可以开始了。
  • 如果您不一定要停止非终止错误,另一种选择是在脚本开头清除 $error 集合并在结尾检查其内容。它将包含所有错误。
  • 或者如果你想在 $error 集合中保留过去的错误,只需在开始和结束时检查集合的计数,然后查看运行期间发生的错误。
  • 如果问题不清楚,我们深表歉意。该脚本是一个应用程序安装脚本,其中包含约 75 个具有相当复杂逻辑的函数。我不想对现有的逻辑做太多的改动。我需要在 any 错误处停止脚本并将错误记录到 Azure 表存储。所以我希望设置 $ErrorActionPreference = "Stop" 并在“主块”周围使用 Try 来完成这项工作,而不会对现有逻辑进行太多更改。

标签: powershell


【解决方案1】:

您可以将其放在脚本的顶部:

$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop

...所有错误将像终止错误一样“表现”并被try...catch 块捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2022-12-21
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多