1

我有一个这样的脚本:

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

谢谢你的帮助!

4

1 回答 1

0

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

这是一个使用开关参数的非常简单的示例:

param(
        [switch]$a
     )

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

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

如果您有时会出现参数并传入一些值但有时没有值,则在定义参数时为参数提供默认值:

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

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

至于你拥有的 if-then 结构,有很多选项可以处理这种逻辑。根据您分享的少量信息,我怀疑使用 switch 结构将是最好的计划:

Get-Help about_Switch
于 2013-01-18T14:36:24.460 回答