Преобразование оператора 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)