Преобразование оператора Eqv VBScript


Если вы ищете в google PowerShell Eqv, вы найдете Руководство по преобразованию VBScript в Windows PowerShell в верхней части списка. Тем не менее ответ заключается в значительной технической помощи:

Оператор Eqv

определение: выполняет логическую эквивалентность для двух выражений.
Без сомнения, Eqv имеет свое применение; мы просто не уверены, есть ли у него практическое применение. Хотя может существовать эквивалент Windows PowerShell, мы должны быть честными: мы на первый взгляд это было не так уж трудно.

Фактически, я использовал оператор Eqv (также записанный как: A↔B) несколько раз в VBScript и, вероятно, использовал бы его в PowerShell, если бы он существовал.

Пример

У меня есть список групп ("HR", "SAP", "!IT", "..."). Если пользователь является членом всех перечисленных групп и явно не является членом групп, которым предшествует знак эскалации (например, "!IT", который распадается на: $Negate = $True и $Group = "IT"), необходимо выполнить конкретную задачу. Сценарий должен быть перебирайте группы и немедленно прерывайте итерацию, когда условие группы не выполняется (для экономии времени).
Команда для этого была бы примерно такой:
If ($Negate -eqv (IsMember($Group))) {Break}

Как построить оператор логической эквивалентности с минимумом кода?

1 2

1 ответ:

Если вы возьмете определение quiet буквально, вы, вероятно, уже увидите возможный способ достижения операции логической эквивалентности:

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, но согласуется с другими операторами PowerShell, содержащими выражения $Null. например, оператор 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)