检查功能中是否存在参数

时间:2014-08-15 12:52:46

标签: powershell

我的功能如下:

function T
{
    Param
    (
        [switch] $IsValueNameRegularExpression
    )

    ..
}

通常要确定某个参数是否存在,您会if ($Param),只看到这是[switch],如果该函数被调用为T -IsValueNameRegularExpression:$false将在if ($IsValueNameRegularExpression)返回false即使参数存在 - 即调用者为可选参数指定了值。

如果我将参数类型从[switch]更改为[bool],显然会发生相同的事情。

在我的函数的代码中,我调用了一些.NET方法,其中包含我的[bool]`[switch]`参数的默认设置,所以除非用户指定了一个值(是真还是假)我不想将它传递给.NET方法。

我可以为参数指定默认值以匹配.NET方法的默认值,但这可以假设.NET方法的默认值永远不会改变,这可能不是真的... < / p>

那么,有更优雅的方式吗?

3 个答案:

答案 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