如果您使用Google PowerShell Eqv,则您目前会在列表顶部找到VBScript-to-Windows PowerShell Conversion Guide。然而答案很大程度上是技术上的帮助:
定义: 对两个表达式执行逻辑等效。
毫无疑问,Eqv有其用途;我们只是不确定它是否有任何实际用途。虽然可能有一个Windows PowerShell等价物,但我们必须诚实:我们看起来并不难。
事实上,我在VBScript中多次使用Eqv
运算符(也写作:A↔B
),如果存在,可能会在PowerShell中使用它。
我有一个群组列表("HR", "SAP", "!IT", "..."
)。如果用户是所有列出的组的成员,并且明确不是具有升级标记的组的成员(例如"!IT"
,其已被解析为:$Negate = $True
和$Group = "IT"
)应该完成一项特定的任务。脚本需要遍历组并在不满足组条件时立即中断迭代(以节省时间)
对此的命令可能是:
If ($Negate -eqv (IsMember($Group))) {Break}
如何使用最少的代码构建逻辑等价运算符?
答案 0 :(得分:1)
如果从字面上理解定义,您可能已经看到了实现逻辑等效操作的可能方法:
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
实现不同,但与包含$Null
表达式的其他PowerShell运算符一致。例如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)