我有一个这样的脚本:
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
感谢您的帮助!
答案 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