powershell - 是否可以将 $ErrorActionPreference = 'Stop' 配置为 powershell 模块中所有功能的默认值?

标签 powershell module

我希望我的模块中的所有函数都默认为 $ErrorActionPreference = 'Stop' .是否可以不修改所有功能?

我每个函数都有一个文件。

最佳答案

假设你的模块是一个脚本模块,即用PowerShell代码实现:

重要的 :

  • 模块有自己的作用域堆栈,独立于非模块代码(和其他模块)的作用域。虽然这提供了与通常有用的调用者环境的隔离,但这也意味着 调用者的 $ErrorActionPreference 值永远不会对脚本模块函数 生效(除非您直接从全局范围运行,模块也可以看到) - 但它确实如此所以对于编译的 cmdlet。 this GitHub issue 中讨论了这种非常有问题的行为。
  • 尽管您目前无法通过 $ErrorActionPreference 从调用方控制脚本模块的错误行为,但通过在您的模块中设置(覆盖) $ErrorActionPreference 您正在永久关闭那扇门。
  • 但是,对特定调用使用 -ErrorAction 公共(public)参数而不是 $ErrorActionPreference 首选项变量仍将覆盖模块全局 $ErrorActionPreference 值,因为在幕后,PowerShell 将 -ErrorAction 参数转换为具有该值的函数局部 $ErrorActionPreference 变量。
  • -ErrorAction$ErrorActionPreference 机制受到不一致和模糊行为的困扰 - this GitHub docs issue 提供了 PowerShell 错误处理的全面概述。

  • I want all of the functions in my module to default to $ErrorActionPreference = 'Stop'. Is it possible without modifying all the functions?



    是的 - 只需将 $ErrorActionPreference = 'Stop' 放在您的 RootModule *.psm1 文件的顶级代码中。 (模块 list 文件 ( RootModule ) 的 *.psd1 条目指定模块的主模块 - 请参阅 the docs )。
  • 如果您没有引用 RootModule 文件的 .psm1 条目,只需在您的模块文件夹中创建一个 .psm1 文件(通常以封闭模块命名),内容为 $ErrorActionPreference = 'Stop' ,并从 RootModule 条目中引用它 - 有关背景信息,请参阅 this answer .

  • 除非调用者在调用模块函数时使用通用 -ErrorAction 参数覆盖(假设它们是高级函数),否则模块的顶级 $ErrorActionPreference 值将对模块的所有函数有效,除非您的函数直接发出语句-终止错误[1],在这种情况下,调用者的 $ErrorActionPreference 值很重要。

    如果您的模块是二进制模块,即导出已编译的 cmdlet(通常在 C# 中实现):

    编译的 cmdlet 没有自己的作用域——它们在调用者的作用域中运行。因此,调用者的 $ErrorActionPreference 很重要,它可以在每次调用的基础上使用公共(public)参数 -ErrorAction 覆盖,但仅适用于非终止错误。

    与脚本模块中的高级函数一样,直接发出的语句终止错误 [1] 始终受调用者的 $ErrorActionPreference 值影响,即使使用了 -ErrorAction。 (请注意,二进制 cmdlet 不会发出脚本终止错误)。

    [1] 语句终止错误发生在以下情况:
  • 直接中止封闭 cmdlet 或高级函数/脚本的执行:
  • 当二进制 cmdlet 遇到阻止其继续运行的严重错误时,它会使用 ThrowTerminatingError() 方法报告此类错误(或只是抛出异常)。
  • 高级 PowerShell 函数/脚本同样必须使用 $PSCmdlet.ThrowTerminatingError() ,然而,这在实践中很少见;通常使用的 Throw 语句会创建一个脚本终止错误,默认情况下它也会终止整个线程,即也终止调用者及其所有调用者。
  • 间接地,在 PowerShell 代码中:
  • 当表达式导致运行时错误时,例如 1 / 0'a,b' -split ',', 'NotAnInt'
  • .NET方法调用抛出异常时,如[int]::Parse('NotAnInt')
  • 当在高级函数/脚本中调用另一个 cmdlet 或高级函数/脚本时,它本身会直接发出语句终止错误。
  • 请注意,高级函数/脚本无法中继语句终止错误,例如:
  • 默认情况下($ErrorActionPreference 包含 'Continue' ,可能只是在本地范围内)从调用者的角度来看,表达式/其他命令的终止错误实际上变成了非终止错误。
  • $ErrorActionPreference 设置为 'Stop' 时,最初的语句终止错误被提升为脚本终止错误。
  • 关于powershell - 是否可以将 $ErrorActionPreference = 'Stop' 配置为 powershell 模块中所有功能的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839607/

    相关文章:

    angularjs - 如何包含没有类型定义的第 3 方模块( Angular 拉动刷新)

    powershell - Set-StrictMode 与参数 block 不兼容吗?

    powershell - 在 win2008R2 和 Win7 上启用 PSRemoting 的错误

    powershell - 在 azure runbook 中安排时间

    c++ - 在另一个模块中重新定义变量

    从内核模块更改 gnome 背景

    c - 如何从内核模块打开/写入/读取 uart 设备?

    PowerShell - 网络使用不起作用 - 变量问题

    windows - 为什么默认情况下,Powershell脚本无法通过双击运行?

    inheritance - golang 关注点分离与可用性