我创建了一个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)}
}
但是,我想通过为每种情况抛出不同的错误消息来使脚本更复杂:
如果没有传递参数,则消息将为"您尚未指定任何参数" 。
当第二个参数不是" +"," - "," *"或" /",消息将是 "您尚未指定有效的运算符(+ - * /)作为第二个参数" 。
如果前两种情况没有发生但没有通过第三个参数(第二个数字),则消息将是"您还没有指定第二个数字&#34 #34;
因此,考虑到这一点,我对脚本进行了一些更改,如下所示:
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
语句中出现了错误,尽管它在语法上是正确的。
答案 0 :(得分:4)
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
,那么就显示错误。”它更容易理解。
但更简单,更安全,更可维护的是使用内置参数验证选项。学习它们;他们很棒!
答案 1 :(得分:1)
考虑一下你的条件陈述:
elseif (($op -ne "+") -or ($op -ne "-") -or ($op -ne "*") -or ($op -ne "/"))
-or表示如果其中任何一个为真,那么整个测试都是正确的。 你想要的是整个测试只有在所有测试都成立的情况下才真实。
你能做些什么来解决这个问题?