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

    10-11 21:35