我想创建一个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中?
答案 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.Substring(($MyInvocation.Line.IndexOf('--') + 2))
为您提供了第一个 - 。$_ -match '(\S+) ?(.+)?'
将参数名称分配给第一个匹配组,将值分配给第二个匹配组。 Out-Null
阻止PowerShell为每次迭代打印 True 。(.+)?
而不是(.*)
的原因是使switch参数的值为null。如果没有任何内容匹配,(.*)
将匹配空字符串,使 $ matches [2] 的值为空字符串,而(.+)?
将不匹配, strong> $ matches [2] null。这假设所有参数都以 - 开头。如果要允许单个连字符,将单个短划线参数名称限制为单个字母,或检查错误声明的参数(例如,如果存在三连字符则抛出错误),则必须考虑到代码,但这是基本的想法。