【问题标题】:How to define a function which requires one of two parameters?如何定义需要两个参数之一的函数?
【发布时间】:2015-07-15 17:47:03
【问题描述】:

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

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

【问题讨论】:

标签: powershell


【解决方案1】:

您想使用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 只是一个包含多个$Groups 的数组(即单个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

当您想为不同的集合使用不同的设置时,这很有用,例如使该参数在一个参数集中是必需的,而在另一个参数集中是可选的,或者使该参数可用于多个但不是所有的集合。

【讨论】:

  • 是否可以向两个参数集添加一个参数(例如,-Debug)而不为每个集创建两个-Debug 参数?
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2020-05-23
  • 2021-12-18
  • 2013-02-16
  • 1970-01-01
  • 2020-07-18
  • 2011-06-26
相关资源
最近更新 更多