如果您在Google上搜索PowerShell Eqv,则当前会在列表顶部找到VBScript-to-Windows PowerShell Conversion Guide。但是答案是很多技术帮助:

等式运算符

定义:对两个表达式执行逻辑等效。
毫无疑问,Eqv有其用途。我们只是不确定它是否有实际用途。尽管可能会有Windows PowerShell等效,但我们必须诚实地说:我们看上去并不难。

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



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

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

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

最佳答案

如果从字面上使定义安静,那么您可能已经看到实现逻辑等效操作的可能方法:

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)

关于powershell - 转换VBScript的Eqv运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44701074/

10-12 02:56