如何在PowerShell脚本中提供Linux样式的参数名称

时间:2013-09-21 15:27:51

标签: powershell

我想创建一个Powershell脚本,该脚本采用标准Linux风格的参数,即--my-param,带有前导 - 。我认为这可能是使用alias参数属性,如

Param (
    [parameter(Mandatory=$true)]
    [alias("-my-param","p")]
    [String]
    $param
)

我希望这是电话

c:\src\ps\params.ps1 --my-param "x"

将被认为是指别名-my-param。不幸的是,我得到的是

C:\src\ps\params.ps1 : A positional parameter cannot be found that accepts argument 'x'.
At line:1 char:21
+ c:\src\ps\params.ps1 <<<<  --my-param1 "x"
    + CategoryInfo          : InvalidArgument: (:) [params.ps1], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,params.ps1

另一方面,使用别名my-param让我用-my-param调用脚本。 有没有办法用引导函数指定参数名称?在Powershell中?

2 个答案:

答案 0 :(得分:5)

您的语法在tokenizer级别失败。比较:

[Management.Automation.PSParser]::Tokenize(
    'Command -parameter',
    [ref]$null
)

...和...

[Management.Automation.PSParser]::Tokenize(
    'Command --parameter',
    [ref]$null
)

正如您所见,解析器将前者视为参数,后者 - 作为参数。 因此,唯一的方法是解析所有参数&#34;内部&#34;并猜测什么是参数(从你的角度来看),以及什么是参数。

答案 1 :(得分:2)

我不知道有哪些库会为你解析Unix风格的参数(这并不一定意味着没有一个...),但你可能不会声明任何参数,并解析参数你自己在剧本的身体。

这将创建参数的哈希表,其中键是参数名称,值是参数值。切换参数将具有空值。

$params = @{}
$MyInvocation.Line.Substring(($MyInvocation.Line.IndexOf('--') + 2)) -split ' --' | %{
  $_ -match '(\S+) ?(.+)?' | Out-Null
  $params.($matches[1]) = $matches[2]
}
  • $ MyInvocation.Line 为您提供用于调用脚本的命令行。 $MyInvocation.Line.Substring(($MyInvocation.Line.IndexOf('--') + 2))为您提供了第一个 -
  • 之后的所有内容
  • $_ -match '(\S+) ?(.+)?'将参数名称分配给第一个匹配组,将值分配给第二个匹配组。 Out-Null阻止PowerShell为每次迭代打印 True
  • 我使用(.+)?而不是(.*)的原因是使switch参数的值为null。如果没有任何内容匹配,(.*)将匹配空字符串,使 $ matches [2] 的值为空字符串,而(.+)?将不匹配, strong> $ matches [2] null。

这假设所有参数都以 - 开头。如果要允许单个连字符,将单个短划线参数名称限制为单个字母,或检查错误声明的参数(例如,如果存在三连字符则抛出错误),则必须考虑到代码,但这是基本的想法。