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语句的多个变量条件的主要内容,如果未能解决你的问题,请参考以下文章

在变量赋值powershell中执行if语句

shell脚本中的if中多条件语句如何写。

具有多个条件的 if 语句

Cmake中的条件判断if/elseif/else

powershell脚本隐藏退出码

makefile条件判断语句