PowerShell中If语句的多变量条件
谢谢你在这方面的帮助,我想我已经把下面的事情复杂化了,但是逻辑并没有回应我的想法 有关逻辑:PowerShell中If语句的多变量条件,powershell,if-statement,logic,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" } 我希望If语句在$a和$b与$c和$d不同时运行,如果相同,请参见
$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"
}
我希望If语句在$a和$b与$c和$d不同时运行,如果相同,请参见下文,我希望它输出值相同
$a = "One"
$b = "One"
$c = "One"
$d = "One"
提前谢谢 只需从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"
}
您可以使用将值对作为数组进行比较:
if (Compare-Object $a, $b $c, $d -SyncWindow 0) {
'different'
} else {
'same'
}
请注意,这很方便,但速度相对较慢,这在具有许多迭代的循环中可能很重要
- 比较两个数组,默认情况下返回有关其差异的信息
仅直接比较对应的数组元素;换句话说:-SyncWindow 0
必须等于$a
,$c
必须等于$b
;如果没有$d
,数组元素将按任何顺序进行比较,以便将-SyncWindow
视为等于1,2
2,1
- 使用
调用的结果作为条件隐式将结果强制为布尔值,任何非空结果(指示至少存在1个差异)将计算为Compare Object
$True
至于你所尝试的:
if (Compare-Object $a, $b $c, $d -SyncWindow 0) {
'different'
} else {
'same'
}
在条件语句中使用{…}
是不合适的。包含在
{…}
中的表达式是脚本块-可以稍后执行的代码段,例如使用&
或
即使您使用(…)
来澄清运算符优先级(-ne
的优先级高于-和
),您的条件也不会按预期工作,但是:
将所有变量视为布尔变量;实际上,给定PowerShell的隐式到布尔转换,您正在比较一个值对是否至少有一个空字符串和另一个值对是否有空字符串($a-和$b)-ne($c-和$d)
($a -eq $b) -and ($a -eq $c) -and ($a -eq $d)
因为(-eq
)比(-和
)要长一点,所以可以保留括号并将其简化为:
$a -eq $b -and $a -eq $c -and $a -eq $d
要使其更易于扩展以获得更多值,请执行以下操作:
if (!($a, $b, $c | Where {$_ -ne $d})) {
'different'
} else {
'same'
}
由于运算符优先级,您的条件与
$a-和($b-ne$c)-和$d
相同,但即使使用(…)
澄清优先级,逻辑也不会按预期工作。您认为{…}
不合适是正确的,但是。@mklement0如果($a-和$b)-ne($c-和$d)){…}
会澄清优先级吗?@Jelphy:它会澄清优先级,但它不符合OP的要求(请参阅我的答案了解它的实际功能)。