Powershell:option 有多个参数

Powershell:option with multiple arguments

我想做这样的事情:

param (
    [String[]]${firstArray},
    [string[]]${secondArray}
    )
Write-Host "firstArray: $firstArray"
Write-Host "args: $args"
Write-Host "secondArray: $secondArray"

但我希望它在没有“,”的情况下被调用 实际上结果是:

.\test.ps1 -firstArray args1 args2 -secondArray args3 args4
firstArray: args1
args: args2 args4
secondArray: args3 

但我想要一种方法来做到这一点:

.\test.ps1 -firstArray args1 args2 -secondArray args3 args4
firstArray: args1 args2
args: 
secondArray: args3 args4

我知道可以用“,”来表示:

.\test.ps1 -firstArray args1, args2 -secondArray args3, args4
firstArray: args1 args2
args: 
secondArray: args3 args4

但我想知道没有它是否可行。

你可以用ValueFromRemainingArguments修饰一个参数:

function f {
  param(
    [Parameter(ValueFromRemainingArguments)]
    [String[]]${firstArray},
    [string[]]${secondArray}
  )

  Write-Host "firstArray: $firstArray"
  Write-Host "args: $args"
  Write-Host "secondArray: $secondArray"
}
PS ~> f -secondArray 1,2,3 a b c d
firstArray: a b c d
args:
secondArray: 1 2 3

向您展示如何使用 ValueFromRemainingArguments 参数属性 属性 来声明一个收集所有参数的参数:

  • 没有绑定任何其他参数,
  • 这意味着它们只能是位置,即未命名,意思是:不是前面加上参数name,比如-firstArray

换句话说:如果你用ValueFromRemainingArguments来声明$firstArray-firstArray)只有两种互斥的方式来传递多个数组)参数:

  • 通过命名目标参数,然后需要, 分隔(子)参数:

    • .\test.ps1 -firstArray args1, args2 -secondArray args3, args4
  • 如果您希望能够用空格分隔参数,您必须not 命名目标参数,即你必须按位置:

    传递参数
    • .\test.ps1 args1 args2 -secondArray args3, args4

PowerShell 不允许混合使用这两种方法;也就是说,你想要的语法:

.\test.ps1 -firstArray args1 args2 ... 有效。


解决这个问题(如果可能的话)将是一项非常重要的工作,但更重要的是,与 PowerShell 的参数语法作斗争以叠加自定义逻辑在概念上 是有问题的,尤其是因为它只适用于您的 scripts/functions,通常不适用。

当您不声明任何函数参数时(即不使用 param 块),这是可能的。然后自动变量 $args 将包含所有参数标记,您可以应用自己的解释逻辑。

Function Fun {
    [String[]] $firstArray  = @()
    [String[]] $secondArray = @()
    [ref] $arrayToAppend = $null

    # For each argument token
    foreach( $token in $args ) {
        if( $token -eq '-firstArray' ) {
            # Enter 1st array parsing mode
            $arrayToAppend = [ref] $firstArray
        }
        elseif( $token -eq '-secondArray' ) {
            # Enter 2nd array parsing mode
            $arrayToAppend = [ref] $secondArray
        }
        elseif( $null -ne $arrayToAppend ) {
            # Append to either 1st or 2nd array
            $arrayToAppend.Value += $token
        }
    }

    "firstArray : $($firstArray -join ', ')"
    "secondArray: $($secondArray -join ', ')"
}

Fun -firstArray 1 2 -secondArray 3 4

输出:

firstArray : 1, 2
secondArray: 3, 4

解释:

在函数代码中,我使用了 reference variable $arrayToAppend,它将引用第一个或第二个数组。因此,通过附加到此变量的 Value 成员,我们实际上将附加到两个数组之一。

备注:

我同意 这在概念上是有问题的。如果其他开发人员看到调用代码,可能会使他们感到困惑,因为它不同于传递数组文字的常规 PowerShell 代码。

话虽如此,此类代码可能有有效用途,例如。 G。为了向后兼容现有的工具链。