2017-06-22 87 views
2

如果您的谷歌爲PowerShell Eqv您目前會在列表的頂部找到VBScript-to-Windows PowerShell Conversion Guide。然而,答案是很大的技術幫助:轉換VBScript的Eqv Operator

當量操作

定義:對兩個表達式的邏輯等效性。
毫無疑問,Eqv有其用途;我們不確定它是否有任何實際用途。儘管可能有Windows PowerShell的等價物,但我們必須誠實地說:我們並沒有真正爲此付出一點努力。

事實上,我在VBScript中多次使用Eqv運算符(也寫爲:A↔B),並且如果存在的話,可能會在PowerShell中使用它。

我有基團("HR", "SAP", "!IT", "...")的列表。如果用戶是所有列出的組的成員,並且明確地不是以升級標記開頭的組的成員(如"!IT",該標記解析爲:$Negate = $True$Group = "IT"),則應完成特定任務。腳本需要遍歷組,並在組條件不滿足時立即中斷迭代(以節省時間)。
的命令爲這個本來是這樣的:

If ($Negate -eqv (IsMember($Group))) {Break} 

如何建立用最少的代碼邏輯等價算?

回答

1

如果你把定義安靜字面上看,你可能已經看到一個可能的方式來實現邏輯等價操作:

If ([Bool]$Expression1 -eq [Bool]$Expression2) {...} 

但是,如果你仔細看真值表您可能會注意到的結果對於EqvXor操作完全相反。 這意味着你還可以實現邏輯等價操作用倒置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) 
+0

在您鏈接到您在網頁中問題是「這個頁面有用嗎?」部分。如果您點擊「否」,您有機會讓MS知道文檔不足,並說明如何改進。 –