PowerShell中If语句的多变量条件

Lac*_*ite 3 powershell logic if-statement

感谢您的帮助,我认为我已经过度复杂了下面的内容,但逻辑并没有回应我的思想是如何告诉它的.

问题逻辑:

$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"
}
Run Code Online (Sandbox Code Playgroud)

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

$a = "One"
$b = "One"
$c = "One"
$d = "One"
Run Code Online (Sandbox Code Playgroud)

提前致谢!

mkl*_*nt0 5

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

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

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

  • Compare-Objectcmdlet的比较两个阵列,默认情况下返回有关其差异的信息.

  • -SyncWindow 0只比较直接对应的数组元素; 换句话说:$a必须平等$c,$b必须平等$d; 没有-SyncWindow,数组元素将以任何顺序进行比较,以便例如1, 2被认为是相等的2, 1.

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


至于你试过的:

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

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

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