使用 SWITCH 参数进行递归调用的最佳方法是什么?
What's the best way to make a recursive call with a SWITCH parameter?
在下面的示例中,我有一个 IF
语句来确定在递归调用时将哪些参数发送到 Demo
。如果 $y
是一个布尔值而不是一个开关,我可以简单地调用 Demo -x $x -y $y
;但作为一个开关,这不是一个可行的选择。
function Demo {
[CmdletBinding()]
param (
[int]$x
,[switch]$y
)
process {
$x--
if ($x -gt 0) {
"$x - $($y.IsPresent)"
if($y.IsPresent) {
Demo -x $x -y
} else {
Demo -x $x
}
}
}
}
Demo 10 -y
Demo 10
问题
以上是处理这种情况的正确方法,还是存在更简洁的选择?
您可以通过这样调用它来强制切换参数:-Switch:$true
(在大多数情况下显然是多余的)或 -Switch:$false
因此对于您的示例:
Demo -y:$y
顺便说一句,在这个例子中,你也可以只使用 splatting:
Demo @PSBoundParameters
但是您的 post 显然是一个 MVCE,因此这可能不适用于您实际正在做的事情,或者可能需要修改,尤其是 if you have default values for some parameters(完全披露:我的博客)。
在下面的示例中,我有一个 IF
语句来确定在递归调用时将哪些参数发送到 Demo
。如果 $y
是一个布尔值而不是一个开关,我可以简单地调用 Demo -x $x -y $y
;但作为一个开关,这不是一个可行的选择。
function Demo {
[CmdletBinding()]
param (
[int]$x
,[switch]$y
)
process {
$x--
if ($x -gt 0) {
"$x - $($y.IsPresent)"
if($y.IsPresent) {
Demo -x $x -y
} else {
Demo -x $x
}
}
}
}
Demo 10 -y
Demo 10
问题
以上是处理这种情况的正确方法,还是存在更简洁的选择?
您可以通过这样调用它来强制切换参数:-Switch:$true
(在大多数情况下显然是多余的)或 -Switch:$false
因此对于您的示例:
Demo -y:$y
顺便说一句,在这个例子中,你也可以只使用 splatting:
Demo @PSBoundParameters
但是您的 post 显然是一个 MVCE,因此这可能不适用于您实际正在做的事情,或者可能需要修改,尤其是 if you have default values for some parameters(完全披露:我的博客)。