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