【问题标题】:How to terminate the script execution in case commandlet encounters error如果命令行开关遇到错误,如何终止脚本执行
【发布时间】:2018-12-27 13:52:09
【问题描述】:

如果命令 let 遇到错误,我需要终止整个脚本执行。之后的整个脚本绝不能执行。就我而言,如果我使用 ThrowTerminatingError,它只会停止当前的命令行开关进一步执行,而脚本的其余部分将执行我不想要的。

我已经使用了“PipelineStoppedException”,但这并不能说明错误流中的任何内容,也不会出现异常。因为 Invoke 调用成功终止。

我怎样才能做到这一点?我想用异常消息终止整个脚本的执行。以下是我在命令行开关中使用的 C# 代码,但它仍然允许其余脚本继续执行。

编辑

protected override void BeginProcessing()
{
       base.BeginProcessing();

        if (SomeLogicTrue())
        {               
            var errorRecord = PowershellErrorHandler.GetErrorRecord(new PipelineStoppedException("access is not supported for this context."), "InvalidExecutionContext");
            ThrowTerminatingError(errorRecord);
        }
 }

【问题讨论】:

  • 不要以为您可以将整个脚本放在TryCatchFinally 中吗?
  • 不,脚本将在某些特定环境下运行,它们可能永远不会包含任何 tryCatch 块。我有自己的基于 C# 的命令行开关,我想抛出一个异常,该异常根本不允许进一步执行脚本的其余部分
  • 你问的是不可能的。没有“无法捕获”的异常,您的代码可能不会引发段错误或类似情况。

标签: c# powershell error-handling cmdlet


【解决方案1】:

在脚本开头将错误操作首选项设置为“停止”。

$ErrorActionPreference = "Stop"

现在,即使脚本抛出非终止错误,它也会立即停止。

我建议你也阅读An Introduction to Error Handling in PowerShell

【讨论】:

  • 我有 C# commandlet 需要从 C# 代码中抛出异常,并且在出现此异常时,powershell 运行时引擎不应执行脚本的其余部分
  • 不,我不想在脚本中捕获异常。我正在从 Powershell 脚本运行 C# commandlet,如果其中一个 commandlet 遇到任何问题,则应该引发异常,以便运行空间中的整个脚本执行停止。
  • @Usman 你不能只从那些 C# 命令返回一个预期值并在你的 PowerShell 脚本中验证该特定值是否已正确返回?如果没有,请使用“exit”命令停止脚本。
  • 不,那是不可能的。我只是可以抛出一些异常,这应该会阻止进一步的 powershell 脚本执行。因为这些脚本可能会意外包含一些无法运行的东西,我需要通知脚本编写者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2021-09-02
相关资源
最近更新 更多