elseif语句,包含由-or失败的多个表达式

时间:2014-12-17 23:00:56

标签: powershell

我创建了一个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)}
}

但是,我想通过为每种情况抛出不同的错误消息来使脚本更复杂:

  1. 如果没有传递参数,则消息将为"您尚未指定任何参数"

  2. 当第二个参数不是" +"," - "," *"或" /",消息将是 "您尚未指定有效的运算符(+ - * /)作为第二个参数"

  3. 如果前两种情况没有发生但没有通过第三个参数(第二个数字),则消息将是"您还没有指定第二个数字&#34 #34;

  4. 因此,考虑到这一点,我对脚本进行了一些更改,如下所示:

    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语句中出现了错误,尽管它在语法上是正确的。

2 个答案:

答案 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表示如果其中任何一个为真,那么整个测试都是正确的。 你想要的是整个测试只有在所有测试都成立的情况下才真实。

你能做些什么来解决这个问题?