我希望我的模块中的所有函数都默认为 $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] 语句终止错误发生在以下情况:
ThrowTerminatingError()
方法报告此类错误(或只是抛出异常)。 $PSCmdlet.ThrowTerminatingError()
,然而,这在实践中很少见;通常使用的 Throw
语句会创建一个脚本终止错误,默认情况下它也会终止整个线程,即也终止调用者及其所有调用者。 1 / 0
或 'a,b' -split ',', 'NotAnInt'
。 [int]::Parse('NotAnInt')
$ErrorActionPreference
包含 'Continue'
,可能只是在本地范围内)从调用者的角度来看,表达式/其他命令的终止错误实际上变成了非终止错误。 $ErrorActionPreference
设置为 'Stop'
时,最初的语句终止错误被提升为脚本终止错误。 关于powershell - 是否可以将 $ErrorActionPreference = 'Stop' 配置为 powershell 模块中所有功能的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839607/