阻止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"
}