如何定义一个需要两个参数之一的函数?

时间:2015-05-05 20:10:49

标签: powershell

对于以下函数,它必须具有int类型的Group参数或int数组类型的Items参数。如何定义功能?它必须具有这些参数之一,但不能同时具有这两个参数。

Start-Execute -Group 1
Start-Execute -Items 100,200,300

1 个答案:

答案 0 :(得分:6)

您想使用Parameter Sets,这是Advanced Functions的一项功能。

function Start-Execute {
[CmdletBinding()]
param(
    [Parameter(
        ParameterSetName='ByGroup',
        Mandatory=$true
    )]
    [int]
    $Group ,

    [Parameter(
        ParameterSetName='ByItems',
        Mandatory=$true
    )]
    [int[]]
    $Items
)
# function code
}

在函数内部,您可以通过测试$PSCmdlet.ParameterSetName的值来确定指定了哪个参数集,以查看它匹配的参数集。

要查看您的参数集是否已正确创建,请在执行函数定义后运行以下命令:

Get-Help Start-Execute

这将显示每个参数集的单独调用。

话虽如此,我们无法分辨你的功能。如果$Items只是一个包含多个$Group的数组(也就是说,itemgroup相同),那么您的函数应该接受单个int数组[int[]]然后总是用foreach处理它,因为即使提供了一个值,它也能正常工作。

将参数添加到多个参数集。

您询问了如何添加名为-Debug的参数。我只想指出-DebugCommon Parameter,因此您可能不应该使用该名称。我将使用名为-Test的参数显示示例:

function Start-Execute {
[CmdletBinding()]
param(
    [Parameter(
        ParameterSetName='ByGroup',
        Mandatory=$true
    )]
    [int]
    $Group ,

    [Parameter(
        ParameterSetName='ByItems',
        Mandatory=$true
    )]
    [int[]]
    $Items ,

    [Switch]
    $Test
)

)
# function code
}

这是一种方法:不提供任何参数集名称。它将在所有套装中提供。

另一种方法是为每个参数集提供单独的[Parameter()]属性:

    [Parameter(
        ParameterSetName='ByItems',
        Mandatory=$true
    )]
    [Parameter(
        ParameterSetName='ByGroup',
        Mandatory=$false
    )]
    [Switch]
    $Test

当您想对不同的集合使用不同的设置时,这非常有用,例如在一个参数集中强制使用此参数,在另一个参数集中强制使用此参数,或者使参数可用于多个但不是所有集合。