我想在我编写的PowerShell脚本中使用位置参数,但我希望从右到左输入参数(其中一个是强制性的,一个是命名的)。这是一个例子:
command [-namedParams andTheirValues] [[param3] param2] param1
或者分别针对每个用例:
command [-namedParams andTheirValues] param1
command [-namedParams andTheirValues] param2 param1
command [-namedParam andItsValue] param3 param2 param1
我试图将[parameter(Position=n)]
与负索引一起使用(因为我真正想要的是根据它们的位置将参数绑定到最后),但这不起作用:
param (
[String]$namedParam,
[parameter(Position=-3)][String]$param3,
[parameter(Position=-2)][String]$param2,
[parameter(Mandatory=$True,Position=-1)][String]$param1
)
有什么想法吗?如果我需要我只是在代码中处理参数,但我希望语法糖能为我做这个。
答案 0 :(得分:2)
有趣的问题......正如您所发现的,您不能使用负值来定义位置参数。我发现最近的参考资料来自about_Functions_Advanced_Parameters:
Position参数的值指定为整数。一个位置 值0表示命令中的第一个位置,即位置 值1表示命令中的第二个位置,依此类推。
这将是缺乏负面价值的最佳支持。文档可能是错误的,但是在您进行实验时它不起作用。
但是,我想我找到了一个简单的方法来解决这个问题。考虑以下包含命名和“位置”ish参数的函数。我们使用advanced function parameter ValueFromRemainingArguments
。请注意,我在这个答案中围绕“位置”多次使用引号,因为它们不是真正的位置参数。
function Das-Bagel{
param (
[String]$namedParam,
[parameter(Mandatory=$true,
ValueFromRemainingArguments=$true)]
[String[]]$remainingArguments
)
$param1 = $remainingArguments[-1]
$param2 = $remainingArguments[-2]
$param3 = $remainingArguments[-3]
Get-Variable -Name param* | select name, value
}
它所做的就是显示param#变量及其值。话虽如此,让我们看看这两个不同命令的输出。首先只有一个“位置”参数。
PS C:\Users\Cameron> Das-Bagel -namedParam This First
Name Value
---- -----
param1 First
param2
param3
现在我们运行3个“位置”参数
PS C:\Users\Cameron> Das-Bagel -namedParam This First Second Third
Name Value
---- -----
param1 Third
param2 Second
param3 First
第一个只有另一个超出命名的参数,因此它进入第一个位置。在第二个例子中,它成为第三个参数。不存在的参数将显示为各自变量的空值。 PowerShell很不错,因为它不会导致错误(默认)。您需要在代码中考虑这种可能性,但我想您已经涵盖了这种可能性。
此外,由于我们强制执行,如果省略“位置”参数,函数调用将失败。