【问题标题】:Reversed Positional Parameters反转位置参数
【发布时间】:2016-01-04 01:42:06
【问题描述】:

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

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

【问题讨论】:

  • 您可能无法使用其设计方式中的高级功能来执行此操作。您可能需要使用$args。您正在尝试倒退 PowerShell 的设计目的。
  • FWIW 我认为这是一个很好的问题,只是可能不切实际。我把它收回。我认为有办法做到这一点
  • 将所有三个参数都设为必需对我来说可能更有意义,但我很确定我已经看到使用内置 PowerShell 命令行开关反转位置参数的示例。如果我发现任何问题,那么我将使用它作为我的示例,它会解决任何关于这是否是一个现实问题的担忧。
  • 我刚刚完成了一个答案,我认为它通过一些额外的编码以您想要的方式涵盖了这个问题。 .

标签: powershell command-line-arguments


【解决方案1】:

有趣的问题......正如您所发现的,您不能使用负值来定义位置参数。我找到的最接近的参考来自about_Functions_Advanced_Parameters

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

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

但是,我想我想出了一个简单的方法来处理这个问题。考虑以下包含命名和“位置”参数的函数。我们使用advanced function parameterValueFromRemainingArguments。请注意,我在这个答案中多次使用引号围绕“位置”,因为它们不是真正的位置参数。

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

此外,由于我们将其设为强制性,因此如果我们省略“位置”参数,函数调用将失败。

【讨论】:

  • 顺便说一下,这个方案是用来支持以下参数选项的:./script.ps1 [-Option1 | -Option2] [[user] server | user@server] file
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多