感谢您的帮助,我认为我已经过度复杂了以下内容,但逻辑并没有回应我的思想也是如此。
问题中的逻辑:
$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"
提前致谢!
答案 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"
}