Преобразование оператора 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 ответ:
Если вы возьмете определение 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
. Это отличается от реализации VBScriptEqv
, но согласуется с другими операторами PowerShell, содержащими выражения$Null
. например, оператор VBScript:If 1 And vbNull Then msgbox "True" Else msgbox "False"
, возвращаетTrue
, где оператор PowerShellIf (1 -and $Null) {"True"} Else {"False"}
, возвращаетFalse
.Побитовое
Если вы ищем побитовый оператор
Eqv
(который, вероятно, должен был бы называться -bEqv
, если бы он существовал), то он был бы:$Equivalence = -bNot Expression1 -bXOr Expression2 # e.g.: -bNot 3 -bXOr 5 = -7 (-bAnd 0xF = 9)