我的功能如下:
function T
{
Param
(
[switch] $IsValueNameRegularExpression
)
..
}
通常要确定某个参数是否存在,您会if ($Param)
,只看到这是[switch]
,如果该函数被调用为T -IsValueNameRegularExpression:$false
将在if ($IsValueNameRegularExpression)
返回false即使参数存在 - 即调用者为可选参数指定了值。
如果我将参数类型从[switch]
更改为[bool]
,显然会发生相同的事情。
在我的函数的代码中,我调用了一些.NET方法,其中包含我的[bool]
`[switch]`参数的默认设置,所以除非用户指定了一个值(是真还是假)我不想将它传递给.NET方法。
我可以为参数指定默认值以匹配.NET方法的默认值,但这可以假设.NET方法的默认值永远不会改变,这可能不是真的... < / p>
那么,有更优雅的方式吗?
答案 0 :(得分:46)
使用$PSBoundParameters.ContainsKey()
检查参数是否存在:
function T
{
Param
(
[switch] $IsValueNameRegularExpression
)
$PSBoundParameters.ContainsKey('IsValueNameRegularExpression')
}
T
T -IsValueNameRegularExpression
T -IsValueNameRegularExpression:$false
输出:
False
True
True
答案 1 :(得分:0)
更简单(也更准确)的方法是使用IsPresent属性。使用大致相同的代码:
function T {
Param (
[switch] $IsValueNameRegularExpression
)
$IsValueNameRegularExpression.IsPresent
}
T
T -IsValueNameRegularExpression
T -IsValueNameRegularExpression:$false
产生以下输出:
False
True
False
请注意,将开关绑定为false会使其“不存在”
答案 2 :(得分:-2)
function T
{
Param([switch]$IsValueNameRegularExpression)
$IsValueNameRegularExpression.ToBool()
}
结果
T
False
T -IsValueNameRegularExpression
True
T -IsValueNameRegularExpression:$true
True
T -IsValueNameRegularExpression:$false
False