3

在 Powershell V2 中,我尝试使用 Param() 声明来解析传递给脚本的开关。我的问题可以使用这个脚本(example.ps1)来说明:

Param(
    [switch] $A,
    [switch] $B,
    [switch] $C
)
echo "$A, $B, $C"

我的问题是这个脚本会默默地忽略任何不正确的开关。例如,“example.ps1 -asdf”只会打印“False, False, False”,而不是向用户报告不正确的使用情况。

我注意到如果添加位置参数,行为会发生变化:

Param(
    [switch] $A,
    [switch] $B,
    [switch] $C,
    [parameter(position=0)] $PositionalParameter
)
echo "A:$A, B:$B, C:$C"

现在,如果我运行“example2.ps1 -asdf”,将引发 ParameterBindingException。但是,“example2.ps1 asdf”(注意没有前导破折号的参数)仍将被静默接受。

我有两个问题:

  1. 有没有办法让 Powershell 总是向我的脚本报告一个额外的参数作为错误?在我的脚本中,我只想允许一组固定的开关(-A、-B、-C),而任何其他参数都应该是错误的。

  2. 当检测到参数错误时,我可以让 Powershell 打印用法(即“get-help example.ps1”)而不是引发 ParameterBindingException 吗?

4

2 回答 2

5

您可以尝试使用CmdletBindingas explain in about_Functions_CmdletBindingAttribute,在具有 CmdletBinding 属性的函数中,未知参数和没有匹配位置参数的位置参数会导致参数绑定失败。

[CmdletBinding()]
Param(
      [switch] $A,
      [switch] $B,
      [switch] $C)

echo "A:$A, B:$B, C:$C"
于 2012-06-30T16:24:26.067 回答
2

您可以尝试以这种方式检查$args

Function myfunction
{
  param(
        [switch] $A,
        [switch] $B,
        [switch] $C
)

foreach ( $key in $PSBoundParameters.keys )
{    
  if ( $args -gt 0) 
        {$script:test = $false ; break}
    else
        {$script:test = $true}
}    

if ($test)     
{ 
 "Parameters are ok" # ... your code script here
}    
else
{
  "Parameters error. Check Command" # or get-help myfuction
}
}
于 2012-06-29T21:18:17.820 回答