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

Stop WhatIf inheritance in cmdlets which don't use SupportsShouldProcess

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

我写了一些函数,使用 WhatIf 参数使它们在 safe/test 模式下成为 运行 是有意义的。但是,无论 WhatIf 参数如何,这些函数都会调用我想要 运行 的其他 cmdlet(例如将日志记录写入文件)。我假设 WhatIfPreference 会被实现了 SupportsShouldProcess 的命令自动继承(事实就是如此),但是任何没有此属性的命令都不会意识到 SupportsShouldProcess/WhatIfPreference,所以会断链。

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

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

我确定有更好的选择;但我至今没找到。

这种继承的例子:

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 输出都显示此值为真,即使第二个输出在 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"
}