在不使用 SupportsShouldProcess 的 cmdlet 中停止 WhatIf 继承



阻止WhatIfPreference被子函数继承的正确方法是什么?

我已经编写了一些函数,使用WhatIf参数允许它们在安全/测试模式下运行是有意义的。但是,无论WhatIf参数如何,这些函数都会调用我想要运行的其他cmdlet(例如,将登录写入文件(。我假设WhatIfPreference会被实现了SupportsShouldProcess的命令自动继承(事实就是这样(,但任何没有此属性的命令都不会知道SupportsShouldProcess/WhatIfPreference,因此会断链。

我可以让那些我想一直运行的cmdlet调用任何用-WhatIf:$False实现SupportsShouldProcess的cmdlet;但这意味着将这个值放在很多地方,并且考虑到调用上下文不知道SupportsShouldProcess,这似乎是错误的。

我可以在我所有的cmdlet上实现SupportsShouldProcess,然后从那些我真正想使用SupportsShouldProcess的cmdlet调用那些我想始终使用-WhatIf:$False运行的cmdlet;但是再一次,仅仅为了不使用而实现某些东西感觉很愚蠢。

我确信还有更好的选择;但到目前为止我还没有找到。

此继承的示例:

Function Nest1 {
[CmdletBinding(SupportsShouldProcess)]
Param ()
"Nest1 $WhatIfPreference"
Nest2
}
Function Nest2 {
[CmdletBinding()]
Param ()
"Nest2 $WhatIfPreference"
Nest3
Nest3 -WhatIf:$false
}
Function Nest3 {
[CmdletBinding(SupportsShouldProcess)]
Param ()
"Nest3 $WhatIfPreference"
}

使用和不使用-WhatIf参数调用这些函数将产生以下行为:

Nest1
# Output:
#  Nest1 False
#  Nest2 False
#  Nest3 False
#  Nest3 False
Nest1 -WhatIf
# Output:
#  Nest1 True
#  Nest2 True
#  Nest3 True
#  Nest3 False

我想要的是这样的东西:

Nest1 -WhatIf
# Output:
#  Nest1 True
#  Nest2 False     # as it doesn't implement SupportsShouldProcess
#  Nest3 False     # as its caller doesn't implement SupportsShouldProcess
#  Nest3 False     # multiple reasons (caller and -WhatIf:$False)

我当前的解决方案是将$WhatIfPreference = $false设置为任何未实现SupportsShouldProcess的cmdlet的第一行,这样它们就不会将此值传递给它们调用的任何cmdlet,即使这些cmdlet实现了SupportsShouldProcess。它感觉很粗糙,但比其他选项更干净。由于变量作用域,谢天谢地,对此变量的更改不会影响调用者;所以在下面的例子中,两个Nest1输出都显示这个值为true,即使第二个是在Nest2调用之后。

Function Nest1 {
[CmdletBinding(SupportsShouldProcess)]
Param ()
"Nest1 $WhatIfPreference"
Nest2
"Nest1 $WhatIfPreference"
}
Function Nest2 {
[CmdletBinding()]
Param ()
$WhatIfPreference = $false
"Nest2 $WhatIfPreference"
Nest3
}
Function Nest3 {
[CmdletBinding(SupportsShouldProcess)]
Param ()
"Nest3 $WhatIfPreference"
}

相关内容

  • 没有找到相关文章

最新更新