反转位置参数

时间:2015-10-07 00:23:07

标签: powershell command-line-arguments

我想在我编写的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
)

有什么想法吗?如果我需要我只是在代码中处理参数,但我希望语法糖能为我做这个。

1 个答案:

答案 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很不错,因为它不会导致错误(默认)。您需要在代码中考虑这种可能性,但我想您已经涵盖了这种可能性。

此外,由于我们强制执行,如果省略“位置”参数,函数调用将失败。