Powershell 反向位置参数

Powershell 反向位置参数,powershell,command-line-arguments,Powershell,Command Line Arguments,我想为我正在编写的PowerShell脚本使用位置参数,但我希望参数从右到左输入(其中一个是必需的,另一个是命名的)。下面是一个示例,它看起来像什么: command [-namedParams andTheirValues] [[param3] param2] param1 或分别针对每个用例: command [-namedParams andTheirValues] param1 command [-namedParams andTheirValues] param2 param1 co

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

有什么想法吗?如果需要的话,我只需要在代码中处理参数,但我希望语法糖能帮我做到这一点。

有趣的问题……正如您发现的,不能使用负值来定义位置参数。我找到的最接近于此的参考资料来自:

Position参数的值被指定为整数。职位 值0表示命令中的第一个位置,即位置 值1表示命令中的第二个位置,依此类推

这将是对缺乏负面价值观的最好支持。文档可能是错误的,但在您进行实验时,它不起作用

然而,我想我找到了一个简单的方法来处理这个问题。考虑下面的函数,其中包含命名的和“位置”的ISH参数。我们使用剩余参数中的
值。请注意,我在这个答案中多次使用引号来表示“位置”,因为它们不是真正的位置参数

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
}
它所能做的就是显示参数变量及其值。话虽如此,让我们看看这两个不同命令的输出。首先,仅使用一个“位置”参数

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在这方面很好,因为它不会导致错误(默认情况下)。您需要在代码中说明这种可能性,但我想您已经涵盖了这一点


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

在高级函数的设计中,您可能无法做到这一点。您可能需要使用
$args
。您正在尝试反向执行PowerShell的设计目的。FWIW我认为这是一个很好的问题,可能不现实。我收回。我认为有一种方法可以做到这一点。对我来说,将所有三个参数都设置为必需参数可能更有意义,但我非常确定我已经看到过使用内置PowerShell commandlet反转位置参数的示例。如果我发现了任何问题,那么我将使用它作为我的示例,它将解决任何关于这是否是一个现实问题的问题。我刚刚完成了一个答案,我认为它以您想要的方式进行了一些额外的编码。顺便说一下,此解决方案用于支持以下参数选项:
/script.ps1[-Option1 |-Option2][[user]server]user@server]文件