PowerShell 中的类似 GetOpt 的行为

Posted

技术标签:

【中文标题】PowerShell 中的类似 GetOpt 的行为【英文标题】:GetOpt-like Behavior in PowerShell 【发布时间】:2014-05-25 19:52:08 【问题描述】:

我正在将 Korn shell 脚本转换为 PowerShell。现有脚本利用 getopt 命令并使用区分大小写的命令行参数(例如,v 的行为与 V 不同)。

set -- `getopt T:ZISedDACkpWhzLJMl:n:g:x:r:R:V:v:N:G:o:m:O: $*`

for c in $*
 do
   case $c in
    -h)        echo $USAGE
    --)       shift; break;;
    esac
done

对于 PowerShell 版本,我希望保持参数名称和行为完全相同。我一直在研究命名函数参数的可能性;但是,PowerShell 不区分大小写,并且不允许重复的参数名称。所以,这行不通。

function dowork ()

    param
    (
      [string]$V,
      [string]$v,
    )
    ...

我可以使用包含未声明参数数组的自动 $args 变量;但是,我不知道 getopt 命令的 PowerShell 等效项。是否有另一种方法可以在不实现我自己的 getopt 的情况下实现这一点?

【问题讨论】:

如果您使用高级语法声明参数,您可以强制它不忽略大小写:becomelotr.wordpress.com/2012/01/31/case-sensitive-validateset 好建议,但我仍然得到:错误:参数列表中的参数 $O 重复。错误:错误:+ CategoryInfo:ParserError:(:) [],ParseException 错误:+ FullyQualifiedErrorId:DuplicateFormalParameter 要精确复制getopt,您需要使用$args。 【参考方案1】:

PowerShell 变量和参数名称不区分大小写。

[CmdletBinding()]
Param(
  [Parameter()]
  [Alias('F')]
  [string]$Foo
)

完全一样

[CmdletBinding()]
Param(
  [Parameter()]
  [Alias('f')]
  [string]$foo
)

使用参数调用任一脚本也是如此:

.\script.ps1 -Foo
.\script.ps1 -FOO
.\script.ps1 -foO
.\script.ps1 -F
.\script.ps1 -f

以上所有的都做同样的事情。

底线:使用 PowerShell 的内置参数处理,您不能有不同含义的大写和小写参数(例如 -A-a)。如果需要区分大小写的参数,则需要实现自己的参数解析器。不过,我强烈建议不要这样做,因为它与正常的 PowerShell 行为相矛盾。

【讨论】:

【参考方案2】:

getopt 的作用在 PowerShell 中无法直接实现,我建议不要直接重新创建它。正如您已经注意到的那样,参数大小写无关紧要,解析也有很大不同,不区分短选项和长选项,而是允许您缩短任何参数,只要它保持明确。

我的建议是看看您是否可以为选项提供有意义的名称,以便与 PowerShell 的参数解析一起使用,而不是反对它。然后,您可以包含有关 getopt 样式参数如何映射到 PowerShell 的文档(并且可能提供一个简单的脚本来在两者之间进行转换)。

【讨论】:

以上是关于PowerShell 中的类似 GetOpt 的行为的主要内容,如果未能解决你的问题,请参考以下文章

Go 中类似 getopt 的行为

PowerShell中的Compare-Object无法仅显示差异

getopt_long()备忘

R中的参数传递函数:commandArgs(),getopt().

Python getopt 中的多字符命令解析

Python3+getopt解析命令行参数