转换VBScript的Eqv运算符

时间:2017-06-22 13:38:53

标签: powershell logical-operators equivalence

如果您使用Google PowerShell Eqv,则您目前会在列表顶部找到VBScript-to-Windows PowerShell Conversion Guide。然而答案很大程度上是技术上的帮助:

Eqv运营商

定义: 对两个表达式执行逻辑等效。
毫无疑问,Eqv有其用途;我们只是不确定它是否有任何实际用途。虽然可能有一个Windows PowerShell等价物,但我们必须诚实:我们看起来并不难。

事实上,我在VBScript中多次使用Eqv运算符(也写作:A↔B),如果存在,可能会在PowerShell中使用它。

实施例

我有一个群组列表("HR", "SAP", "!IT", "...")。如果用户是所有列出的组的成员,并且明确不是具有升级标记的组的成员(例如"!IT",其已被解析为:$Negate = $True$Group = "IT")应该完成一项特定的任务。脚本需要遍历组并在不满足组条件时立即中断迭代(以节省时间) 对此的命令可能是:

If ($Negate -eqv (IsMember($Group))) {Break}

如何使用最少的代码构建逻辑等价运算符?

1 个答案:

答案 0 :(得分:1)

如果从字面上理解定义,您可能已经看到了实现逻辑等效操作的可能方法:

If ([Bool]$Expression1 -eq [Bool]$Expression2) {...}

但如果仔细查看真值表,您可能会注意到Eqv的结果与Xor操作正好相反。 这意味着您还可以使用反向Xor

实现逻辑等效操作
If (!(Expression1 -xor $Expression2)) {...}

因为你为Xor(整个操作或其中一个表达式)反转的内容并不重要,你甚至可以将它简化为:

If (!Expression1 -xor $Expression2) {...}

检查

0..3 | ForEach {
    $Expression1, $Expression2 = [Int]($_ / 2), [Int]($_ % 2)
    New-Object PSObject -Property @{
        Expression1 = [Bool]$Expression1
        Expression2 = [Bool]$Expression2
        Equivalence = !$Expression1 -xor $Expression2
    }
} | Format-Table -AutoSize

真值表

Expression1 Expression2 Equivalence
----------- ----------- -----------
      False       False        True
      False        True       False
       True       False       False
       True        True        True

注意:在此解决方案中,$Null表达式被视为$False。这与VBScript Eqv实现不同,但与包含$Null表达式的其他PowerShell运算符一致。例如VBScript语句:If 1 And vbNull Then msgbox "True" Else msgbox "False",返回True,其中PowerShell语句If (1 -and $Null) {"True"} Else {"False"}返回False

按位

如果您正在寻找一个按位Eqv运算符(可能应该调用它 - bEqv,如果存在的话),那么它将是:

$Equivalence = -bNot Expression1 -bXOr Expression2    # e.g.: -bNot 3 -bXOr 5 = -7 (-bAnd 0xF = 9)