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

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

Eqv Operator

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

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

пример

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

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

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

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)
Другие вопросы по тегам