【问题标题】:Better parameter error handling; and better parameter parsing/handling?更好的参数错误处理;和更好的参数解析/处理?
【发布时间】:2013-01-18 14:05:54
【问题描述】:

我有一个这样的脚本:

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

感谢您的帮助!

【问题讨论】:

    标签: parsing powershell parameters arguments powershell-2.0


    【解决方案1】:

    您可以在此处查看一些内容。首先,如果参数永远不会有关联的值,而您只想知道是否使用该参数调用了脚本,那么请使用 [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
    

    【讨论】:

    • 我在设置默认值时仍然收到“缺少参数的参数”错误。如果我像这样传递参数,则会发生错误“ .\MyScript.ps1 -a ”。至于开关,我不确定我是否能够使用它。我将通读文档,但我不是在寻找通过参数传入的不同参数(例如:.\MyScript.ps1 -a ServerName),而是在寻找是否存在正在传递的参数(其中每个参数都是一个变量;例如:$a)。然后根据传入的参数,做不同的事情。
    • 这有点令人困惑。正如我所说,如果您只关心参数的存在与否,请使用开关类型参数。我编辑了答案以提供一个非常简单的示例。
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多