更好的参数错误处理;和更好的参数解析/处理?

时间:2013-01-18 14:05:54

标签: parsing powershell parameters arguments powershell-v2.0

我有一个这样的脚本:

param(
  [Alias('a')]
  [string]$aval,
  [Alias('b')]
  [switch]$bval,
  [Alias('c')]
  [string]$cval
)

if($aval.length -gt 1)
{
  Do-Something
}
elseif($bval)
{
  Do-Something-Else
}
elseif($cval.length -gt 1)
{
  Do-Another-Thing
}
else
{
  Do-This
}

如果有人像我这样调用我的脚本,会显示一个丑陋的错误,说它缺少参数'aval / bval / cval'的参数:

PS C:\> .\MyScript.ps1 -a
C:\MyScript.ps1 : Missing an argument for parameter 'aval'. Specify a
parameter of type 'System.String' and try again.
At line:1 char:18
+ .\MyScript.ps1 -n <<<<
    + CategoryInfo          : InvalidArgument: (:) [MyScript.ps1],    ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,MyScript.ps1

有没有办法让干净,可能是一行,而是出现错误?另外,有没有更好的方法来处理参数然后是一个elseif语句列表(我的实际脚本有~10个参数)?

脚本有时会传递带参数的参数:

EX:
PS C:\> .\MyScript.ps1 -b ServerName

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以在这里查看一些内容。首先,如果参数永远不会有关联值,并且您只想知道是否使用参数调用脚本,则使用[switch]参数而不是字符串。

以下是使用switch参数的一个非常简单的示例:

param(
        [switch]$a
     )

if($a){
    'Switch was present'
}else{
    'No switch present'
}

将其保存为脚本并使用和不带-a参数运行它。

如果有时参数会传入某个值,但其他时间没有值,那么在定义参数时,请为参数指定一个默认值:

[Alias('a')]
[string]$aval = '',

然后在您的逻辑中,如果传入了某些内容,则字符串的长度将为gt 1.

至于你所拥有的if-then结构,处理这种逻辑有很多选择。通过您分享的一点点信息,我怀疑使用交换机结构将是最好的计划:

Get-Help about_Switch