Powershell函数中的可重复参数(最好是链接参数集)

时间:2016-04-12 21:52:20

标签: function powershell parameters

我想知道是否有可能(如果是这样)在PowerShell函数中创建可重复(并且希望链接)的参数。这就是我在寻找这个工作的方式:

function foo()
{
    [CmdletBinding()]
    Params(
        [Parameter(Mandatory=$true,ParameterSetName="Default")]
        [Parameter(Mandatory=$true,ParameterSetName="Set1")]
        [Parameter(Mandatory=$true,ParameterSetName="Set2")]
         [string]$SomeParam1,
        [Parameter(Mandatory=$true,ParameterSetName="Set1")]
        [Parameter(Mandatory=$true,ParameterSetName="Set2")]
        *some magic here, likely, to make this repeatable*
         [string]$SomeRepeatableParam,
        [Parameter(Mandatory=$true,ParameterSetName="Set1")]
         [string]$SomeLinkedParam1,
        [Parameter(Mandatory=$true,ParameterSetName="Set2")]
         [string]$SomeLinkedParam2
    )
    Begin
    {
        *some code here*
    }
    Process
    {
        foreach ($val in $SomeRepeateableParam)
        {
            *some code here using param and its linked param*
        }
    }
    End
    {
        *some code here*
    }
}

然后像这样调用这个函数:

foo -SomeParam "MyParam" -SomeRepeatableParam "MyProperty1" -SomeLinkedParam1 "Tall" -SomeRepeatableParam "MyProperty2" -SomeLinkedParam2 "Wide"

依此类推,能够在一次通话中多次使用可重复参数。

可以这样做吗?如果是这样的话?

感谢您的时间。

编辑:为清楚起见,我不是指一个数组参数,而是一个可重复的参数,其中链接的参数集可以与可重复参数的每个实例匹配。

1 个答案:

答案 0 :(得分:2)

由于PowerShell支持 arrays 作为参数值,因此通常无需重复参数。

没有语法方法来强制执行配对(链接)参数值的方式与重复实例相同的参数名称,因为参数名称必须是唯一的(即使他们没有必须是独一无二的,单凭它也不会强制执行所需的配对)。

但是,您可以使用并行数组参数,并在函数中强制执行它们的对称​​,例如:

function foo
{
    [CmdletBinding()]
    Param(
         [string]   $SomeParam1,
         [string[]] $SomeRepeatableParam,
         [string[]] $SomeLinkedParam
    )
    if ($SomeRepeatableParam.Count -ne $SomeLinkedParam.Count) {
      Throw "Please specify paired values for -SomeRepeatableParam and -SomeLinkedParam"
    }
    for ($i = 0; $i -lt $SomeRepeatableParam.Count; ++$i) {
       $SomeRepeatableParam[$i] + ': ' + $SomeLinkedParam[$i]
    }
}

然后您将按如下方式调用它(注意,以分隔数组元素):

foo -SomeParam1 "MyParam" `
    -SomeRepeatableParam "MyProperty1", "MyProperty2" `
    -SomeLinkedParam     "Tall",        "Wide"