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。为了向后兼容现有的工具链。
我想做这样的事情:
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
成员,我们实际上将附加到两个数组之一。
备注:
我同意
话虽如此,此类代码可能有有效用途,例如。 G。为了向后兼容现有的工具链。