PowerShell中If语句的多变量条件

时间:2018-04-09 06:44:40

标签: powershell if-statement logic

感谢您的帮助,我认为我已经过度复杂了以下内容,但逻辑并没有回应我的思想也是如此。

问题中的逻辑:

$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"

提前致谢!

3 个答案:

答案 0 :(得分:5)

您可以使用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个差异 - 将评估为$True

至于您尝试的内容

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

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

  • ($a -and $b) -ne ($c -and $d)将所有变量视为布尔;实际上,在给定PowerShell隐式转换为布尔值的情况下,您需要比较一个值对是否至少有一个空字符串,而另一个值是否为。

答案 1 :(得分:1)

mklement0的答案外,还要避免相当慢的Compare-Object cmdlet

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

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

由于Comparison Operators-eq)取higher precedence而不是Logical Operators-and),您可以将括号括起来并简化为:< / p>

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

为了使其更加DRY并且可以轻松扩展以获得更多值:

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

答案 2 :(得分:-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"
    }