Converting VBScript's Eqv Operator

北战南征 提交于 2019-12-11 02:43:53

问题


If you google for PowerShell Eqv you currently will find the VBScript-to-Windows PowerShell Conversion Guide on top of the list. Yet the answer is much of technical help:

Eqv Operator

Definition: Performs a logical equivalence on two expressions.
No doubt Eqv has its uses; we’re just not sure if it has any practical uses. Although there might be a Windows PowerShell equivalent we have to be honest: we didn’t look real hard for one.

In fact, I used the Eqv operator (also written as: A↔B) a number of times in VBScript and likely would have used it in PowerShell if it existed.

Example

I have a list of groups ("HR", "SAP", "!IT", "..."). If a user is a member of all the listed groups and explicitly not a member of groups that are preceded with an escalation mark (like "!IT", which is unraveled to: $Negate = $True and $Group = "IT") a specific task should be done. The script needs to iterate through the groups and immediately break the iteration when a group condition is not met (to save time).
A command for this would have been something like:

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

How can I build a logical equivalence operator with a minimum of code?


回答1:


If you take definition quiet literally, you will probably already see a possible way to achieve a logical equivalence operation:

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

But if you take a close look to the truth table you might notice that the results for Eqv are exactly the opposite of an Xor operation. Meaning that you can also achieve logical equivalence operation with an inverted Xor:

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

And as it doesn’t matter what you invert for an Xor (either the whole operation or one of the expressions), you can even simplify it to:


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

Check

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

Truth Table

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

Note: In this solution $Null expressions are considered $False. This differs from the VBScript Eqv implementation but is consistent with other PowerShell operators that contain $Null expressions. e.g. The VBScript statement: If 1 And vbNull Then msgbox "True" Else msgbox "False", returns True where the PowerShell statement If (1 -and $Null) {"True"} Else {"False"}, returns False.

Bitwise

If you looking for a bitwise Eqv operator (which should probably be called -bEqv, if it existed), then it would be:

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


来源:https://stackoverflow.com/questions/44701074/converting-vbscripts-eqv-operator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!