停止不使用 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"
}
阻止 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"
}