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

ca9*_*3d9 4 powershell

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

Start-Execute -Group 1
Start-Execute -Items 100,200,300
Run Code Online (Sandbox Code Playgroud)

bri*_*ist 6

您想使用参数集,它是高级功能的一项功能.

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

    [Parameter(
        ParameterSetName='ByItems',
        Mandatory=$true
    )]
    [int[]]
    $Items
)
# function code
}
Run Code Online (Sandbox Code Playgroud)

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

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

Get-Help Start-Execute
Run Code Online (Sandbox Code Playgroud)

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

话虽如此,我们无法分辨你的功能.如果$Items只是一个多个$Groups 的数组(也就是说,单个item与a相同group),那么你的函数应该接受一个int数组[int[]]然后总是用它来处理它foreach,因为即使只有一个,它也能正常工作提供的价值.

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

你问过添加一个名为的参数-Debug.我只想指出这-Debug是一个公共参数,所以你可能不应该使用该名称.我将使用名为的参数显示一个示例-Test:

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

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

    [Switch]
    $Test
)

)
# function code
}
Run Code Online (Sandbox Code Playgroud)

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

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

    [Parameter(
        ParameterSetName='ByItems',
        Mandatory=$true
    )]
    [Parameter(
        ParameterSetName='ByGroup',
        Mandatory=$false
    )]
    [Switch]
    $Test
Run Code Online (Sandbox Code Playgroud)

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