【问题标题】:Multiple Variable Conditions for If Statement in PowerShellPowerShell中If语句的多个变量条件
【发布时间】:2018-09-18 11:58:14
【问题描述】:

感谢您的帮助,我想我已经把下面的事情复杂化了,但是逻辑并没有回应我的想法。

问题逻辑:

$a = "One"
$b = "Two"
$c = "Three"
$d = "Four"

If( {$a -and $b} -ne {$c and $d} ) {
   Write-Host "Values are Different"
} Else {
   Write-Host "values are the same"
}

我希望在 $a 和 $b 与 $c 和 $d 不同时运行 If 语句,如果相同,请参见下文,我希望它输出值相同

$a = "One"
$b = "One"
$c = "One"
$d = "One"

提前致谢!

【问题讨论】:

    标签: powershell if-statement logic


    【解决方案1】:

    您可以使用Compare-Object 将值对作为数组进行比较

    if (Compare-Object $a, $b   $c, $d  -SyncWindow 0) {
      'different'
    } else {
      'same'
    }
    

    请注意,这很方便,但相对较慢,这在具有多次迭代的循环中可能很重要。

    • Compare-Object cmdlet 比较两个数组并默认返回有关它们差异的信息。

    • -SyncWindow 0 只比较直接对应的数组元素;换句话说:$a 必须等于$c,并且$b 必须等于$d;如果没有-SyncWindow,数组元素将按任意顺序进行比较,例如1, 2 将被视为等于2, 1

    • 使用Compare-Object 调用的结果作为条件隐式将结果强制转换为布尔值,并且任何非空结果——表明存在至少1个差异——将评估为@987654335 @.


    至于你尝试了什么

    在您的条件句中使用{ ... } 是不合适的。
    { ... } 中包含的表达式是 脚本块 - 您可以稍后执行的代码片段,例如 &.

    即使您使用(...) 来阐明运算符优先级(-ne 的优先级高于
    -and),但您的条件也不会按预期工作:

    • ($a -and $b) -ne ($c -and $d) 将所有变量视为布尔值;实际上,鉴于 PowerShell 的隐式到布尔转换,您正在比较一个值对是否具有至少一个 空字符串 与另一个是否没有。

    【讨论】:

      【解决方案2】:

      除了mklement0 的回答和避免相当慢的Compare-Object cmdlet

      你尝试过的中,你需要将一个特定的值与其余的每个值进行比较:

      ($a -eq $b) -and ($a -eq $c) -and ($a -eq $d)
      

      因为Comparison Operators (-eq) 比Logical Operators (-and) 取higher precedence,所以您可以留下括号并将其简化为:

      $a -eq $b -and $a -eq $c -and $a -eq $d
      

      要使此代码DRY 并易于扩展以获得更多值:

      if ($a, $b, $c | Where {$_ -ne $d}) {
        'different'
      } else {
        'same'
      }
      

      【讨论】:

        【解决方案3】:

        只需从 if 语句中删除这些 {} 括号

           $a = "One"
            $b = "One"
            $c = "One"
            $d = "One"
        
            If($a -and $b -ne $c -and $d) {
               Write-Host "Values are Different"
            } Else {
               Write-Host "values are the same"
            }
        

        【讨论】:

        • 由于运算符优先级,您的条件与$a -and ($b -ne $c) -and $d 相同,但即使使用(...) 阐明了优先级,逻辑也不会按预期工作。但是,您对 {...} 的不当之处是正确的。
        • @mklement0 if (($a -and $b) -ne ($c -and $d)) { ... } 会澄清优先级吗?
        • @Jelphy:它会澄清优先级,但它并没有做 OP 想要的(请参阅我的回答了解它的实际作用)。
        猜你喜欢
        • 1970-01-01
        • 2015-01-20
        • 2013-12-17
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多