PowerShell中If语句的多个变量条件
Posted
技术标签:
【中文标题】PowerShell中If语句的多个变量条件【英文标题】:Multiple Variable Conditions for If Statement in PowerShell 【发布时间】: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"
提前致谢!
【问题讨论】:
【参考方案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 想要的(请参阅我的回答了解它的实际作用)。以上是关于PowerShell中If语句的多个变量条件的主要内容,如果未能解决你的问题,请参考以下文章