Powershell:多参数验证

时间:2015-03-09 10:07:25

标签: powershell

我的 Powershell 功能如下:

function myfunct {

    param(
        [Parameter(ParameterSetName="p1")]
        [string] $p1,
        [Parameter(ParameterSetName="p21")]
        [string] $p21,
        [Parameter(ParameterSetName="p22")]
        [string] $p22
    )

    # ...

}

此脚本接受两种参数配置:

  1. 指定p1的值:p1 and [not (p21 and p22)]

  2. 指定p21p22的值:(not p1) and (p21 and p22)

  3. 现在,我想检查他们的共同排他性。通过阅读MSDN上的文章 PowerShell V2: ParameterSets ,我找到了一个示例,说明如何正确使用$PsCmdlet.ParameterSetName的值来检查指定的参数:

    function test-param 
    { 
    param( 
    [Parameter(ParameterSetName="p1",Position=0)] 
    [DateTime] 
    $d, 
    
    [Parameter(ParameterSetName="p2", Position=0)] 
    [int] 
    $i 
    ) 
        switch ($PsCmdlet.ParameterSetName) 
        { 
        "p1"  { Write-Host $d; break} 
        "p2"  { Write-Host $i; break} 
        } 
    }
    

    根据上面的示例,$PsCmdlet.ParameterSetName返回单个参数的值,但在我的第二个配置中,我需要知道是否已插入p21p22(如果当然,p1是空的。

    有没有办法按要求执行参数验证?如果是,怎么样?

1 个答案:

答案 0 :(得分:2)

function Test(
    [Parameter(ParameterSetName="ID")] [int]$ID,
    [Parameter(ParameterSetName="Name")] [string]$Name,
    [Parameter(ParameterSetName="Name")] [string]$Path
) {
    switch ($PsCmdlet.ParameterSetName) {
        'ID' {
            "ID: $ID"
        }
        'Name' {
            "Name: $Name    Path: $Path"
        }
    }
}

如果需要,您还可以使用Mandatory=$true强制执行某些参数。

没有必要检查“互斥性”。 PowerShell为您做到了这一点 - 这就是您首先定义参数集的原因。