【问题标题】:Check for existence of parameter in function检查函数中是否存在参数
【发布时间】:2014-08-15 12:52:46
【问题描述】:

我有一个函数如下:

function T
{
    Param
    (
        [switch] $IsValueNameRegularExpression
    )

    ..
}

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

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

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

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

那么,有没有更优雅的方法呢?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    使用$PSBoundParameters.ContainsKey() 来检查参数是否存在:

    function T
    {
        Param
        (
            [switch] $IsValueNameRegularExpression
        )
    
        $PSBoundParameters.ContainsKey('IsValueNameRegularExpression')
    }
    
    T
    T -IsValueNameRegularExpression
    T -IsValueNameRegularExpression:$false
    

    输出:

    False
    True
    True
    

    【讨论】:

    • 完美,谢谢。现在只需要再等待 5m 即可将其标记为答案 :)
    【解决方案2】:

    一种更简单(也更准确)的方法是使用 IsPresent 属性。使用大致相同的代码:

    function T {
        Param (
            [switch] $IsValueNameRegularExpression
        )
        $IsValueNameRegularExpression.IsPresent
    }
    
    T
    T -IsValueNameRegularExpression
    T -IsValueNameRegularExpression:$false
    

    产生以下输出:

    False
    True
    False
    

    请注意,将开关绑定为 false 会使其“不存在”

    【讨论】:

    • 这没用。这与仅检查变量的值完全相同。即,$IsValueNameRegularExpression.IsPresent 返回与 $IsValueNameRegularExpression 相同的结果。这不是我所追求的。我完全按照罗曼所说的去做。如果你传递了$false,我想知道传递了一个值,不管是哪个值($true$false),你的方法都没有做到这一点……
    【解决方案3】:
    function T 
    {
        Param([switch]$IsValueNameRegularExpression)
    
        $IsValueNameRegularExpression.ToBool()
    }
    

    结果

    T
    False
    
    T -IsValueNameRegularExpression
    True
    
    T -IsValueNameRegularExpression:$true
    True
    
    T -IsValueNameRegularExpression:$false
    False
    

    【讨论】:

    • 这不能回答问题 - 请参阅对 Flydog57 回答的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多