如果您在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}
如何用最少的代码构建逻辑等价运算符?
最佳答案
如果从字面上使定义安静,那么您可能已经看到实现逻辑等效操作的可能方法:
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)
关于powershell - 转换VBScript的Eqv运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44701074/