我创建了一个PowerShell脚本,它基本上是一个简单的计算器。脚本需要传递3个参数,第一个是数字,第二个是算术运算符(+-* /),第三个是另一个数字,此后脚本返回计算值。
最初,脚本的工作方式如下:
param (
[double]$num1,
[string]$op,
[double]$num2
)
switch ($op) {
"+" {write-host $($num1+$num2)}
"-" {write-host $($num1-$num2)}
"*" {write-host $($num1*$num2)}
"/" {write-host $($num1/$num2)}
}
但是,我想通过针对每种情况抛出不同的错误消息来使脚本更加复杂:
“您没有指定有效的运算符(+-* /)作为第二个参数”。
因此,考虑到这一点,我对脚本进行了一些更改,如下所示:
param (
[double]$num1,
[string]$op,
[double]$num2
)
if ($num1 -eq "") {
write-host "You haven't specified any parameters"
} elseif (($op -ne "+") -or ($op -ne "-") -or ($op -ne "*") -or ($op -ne "/")) {
write-host "You haven't specified a valid operator (+ - * /) as the second parameter"
} elseif ($num2 -eq "") {
write-host "You haven't specified the second number"
} else {
switch ($op) {
"+" {write-host $($num1+$num2)}
"-" {write-host $($num1-$num2)}
"*" {write-host $($num1*$num2)}
"/" {write-host $($num1/$num2)}
}
}
因此,现在,如果我不向脚本传递任何参数,则会收到“您尚未指定任何参数”消息。
如果仅传递第一个参数,则会得到“您尚未指定有效的运算符(+-* /)作为第二个参数”,这很好。
但是,如果我传递第一个参数,并且传递第二个参数“+”,“-”,“*”或“/”,我仍然会得到“您尚未指定有效的运算符(+-* / )作为第二个参数”消息,因此第一个
elseif
语句中存在错误,尽管它在语法上似乎是正确的。 最佳答案
使用高级功能参数选项
mjolinor建议的解决方案(在他的评论中)看起来像这样:
[CmdletBinding()]
param(
[Parameter(
Mandatory=$true
)]
[double]
$num1,
[Parameter(
Mandatory=$true
)]
[ValidateSet('+', '-', '*', '/')]
[string]
$op,
[Parameter(
Mandatory=$true
)]
[double]
$num2
)
switch ($op) {
"+" {write-host $($num1+$num2)}
"-" {write-host $($num1-$num2)}
"*" {write-host $($num1*$num2)}
"/" {write-host $($num1/$num2)}
}
这具有让您通过制表符完成操作员的附加好处。
您的解决方案
您无法使用的原因是,当您应该使用
-or
时,您正在使用-and
:elseif (($op -ne "+") -and ($op -ne "-") -and ($op -ne "*") -and ($op -ne "/"))
由于您正在检查否定条件(即
if (an_invalid_value)
)(其中内部条件为-ne
)的事实,因此可能会造成混淆。如果选择负
-
,请考虑您的版本中发生了什么:您评估$op -ne '+'
,这是正确的,因此满足条件,没有进行其他任何测试,您可以告诉用户他们做错了什么。使用-and
,将需要满足所有-ne
条件。这是一种更简单的方式:
elseif ( ('+','-','*','/') -notcontains $op)
基本上,您说“如果此运算符数组不包含
$op
,则显示错误。”它更容易遵循。但是实际上更容易,更安全和可维护的是使用内置的参数验证选项。学习他们;他们很棒!
关于powershell - elseif语句包含多个以-或失败分隔的表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27536434/