2013-04-09 21 views
8

Blick, dass die help section about_Comparison_Operators of PowerShell Ich verstehe diese:Powershell Logic

PS C:\> $false,$false -eq $true 
PS C:\> 

Nichts von links passt sich das Recht vor, so dass nichts eine $null nicht einmal zurückgegeben wird.

ich das nicht verstehen:

PS C:\> $true -eq $false,$false 
True 
PS C:\> 

Ist es, weil es $true -eq $false erste tut, die Falsch zurückkehrt, und dann nehmen, dass Falsch und $false -eq $false zu tun, die Wahre zurückkehrt?

Mehr Infos

Der Grund für die unten false zurückgibt, weil es einen String in einem Array zu vergleichen, richtig? Eine Zeichenfolge ist nicht gleich einem Array.

PS C:\> "abc" -eq "abc","def" 
False 

Antwort?

Weitere Grabungen zeigen, dass $true gleich einem Objekt ist.

PS C:\> $true -eq [array] 
True 
PS C:\> $true -eq [string] 
True 
PS C:\> $true -eq [int] 
True 
PS C:\> $true -eq [bool] 
True 

Es sind die Werte dieser Objekte, die wichtig sind.

PS C:\> $true -eq [int]0 
False 
+0

+1 Gute Frage, aber kann ich fragen, wofür Sie es brauchen? Ich habe Probleme, ein Szenario zu sehen, in dem ich es verwenden könnte. –

+0

Hier erfahren Sie, wie PowerShell funktioniert. Auch die [Link] (http://technet.microsoft.com/en-us/library/hh847759.aspx) nicht sicher, warum "abc" -eq "abc", "def" 'nicht funktioniert. –

+0

[Sie müssen Ihre Streifen verdienen] (http://beefycode.com/post/PowerShell-Mini-game-Equality.aspx) –

Antwort

7

Ich mag grundlegende Fragen über das Verhalten und die Funktionen der Sprache wie folgt ... Geben Sie mir eine Entschuldigung, um die PowerShell-Sprachspezifikation zu lesen.

Sie können die Spezifikation herunterladen: 2.0 und 3.0. Siehe Abschnitt 7.8.1 - Gleichheit und relationale Operatoren.

Zum ersten Teil der Frage ist tatsächlich etwas zurück - ein leeres Array, die durch dargestellt ist: ($false,$false -eq $true).psbase

Length   : 0 
LongLength  : 0 
Rank   : 1 
SyncRoot  : {} 
IsReadOnly  : False 
IsFixedSize : True 
IsSynchronized : False 
Count   : 0 

Von der Spezifikation -

Wenn der von der festgelegten Wert linker Operand ist keine Sammlung, das Ergebnis hat Typ bool. Ansonsten ist das Ergebnis ein möglicherweise leeres unbeschränktes 1-dimensionales Array, das die Elemente der Sammlung enthält, die True im Vergleich zu dem Wert, der durch den rechten Operanden festgelegt ist, enthält.

Für den zweiten Teil, weil der linke Operand selbst ein bool ist, denke ich, dass es immer das Ergebnis ist. Dies ist nur der Fall, wenn der rechte Operand eine Sammlung ist.

Einige Beispiele:

$true -eq 1,2,3,4 
$true -eq '','','','' 
$true -eq '',1,$true,$false 
$true -eq $null,$false,1,'' 

Alle diese Rückkehr $true. Conversly alle diese Rück $false

$false -eq 1,2,3,4 
$false -eq '','','','' 
$false -eq '',1,$true,$false 
$false -eq $null,$false,1,'' 
$false -eq $true,$true,$true 

Der Typ des linken Operanden ist sehr wichtig. Dies wird $true: $false -eq 0 zurückgegeben, da der rechte Operand in den Typ des linken Operanden umgewandelt werden kann.

+1

Andy ist auf der Marke. Der logische Ausdruck wird von links nach rechts verarbeitet, und der Typ des linken Operanden bestimmt, wie der rechte Operand interpretiert wird. Wenn Sie Schwierigkeiten haben, die Spezifikation zu visualisieren, brechen Sie die Logik ab und untersuchen Sie die von PowerShell ausgeführten Umwandlungen: [bool] 0; [bool] 1; [bool] @(); [bool] @ ($ false); [bool] @ ($ false, $ false); [bool] '; [bool] $ null; #ad nauuseum ... – beefarino

+0

Ich würde erwarten, dass diese dasselbe bewerten, aber sie nicht: [bool] (@ (1) -eq 1) [bool] (1 -eq @ (1)) – mjolinor

+0

Zuerst : '-eq' gibt '1' aus der Sammlung zurück, dann wird nach bool' $ true' gemacht. Das zweite '-eq' gibt einen Booleschen Wert zurück, da der linke Operand ein Skalierer ist und die Umwandlung als Bool ihn als falsch definiert. Ich bin mir nicht sicher, was PowerShell tut, um den booleschen Wert zu bestimmen, wenn der rechte Operand eine Sammlung ist. Die Spezifikation sagt nichts speziell über sie aus, also ist es ein lustiges Spiel für uns, daraus zu folgern: D –

2

Vielleicht ist der -eq Betreiber prüft ihre Existenz (aka nicht $null) und nicht ihren Wert.

Ähnlich wie die IF-Anweisung vielleicht?

PS> if("anyval"){$true}else{$false} 
True 

This Antwort von @Joey bereitgestellt könnte sich als nützlich erweisen.

+2

Eigentlich denke ich, dass die Verbindung, die Sie zur Verfügung stellen, die Antwort ist. – zdan

3

Beste Vermutung:

Es Auswertung als wahr, weil es ein Array ist mit mehr als einem Mitglied. Ein Array verfügt nicht über eine ToBoolean() -Methode.

Solange es ein Skalar ist, oder ein Array mit nur einem Mitglied kann Powershell das zu einem Skalar zwingen und zu einer ToBoolean() -Methode auf dem Mitglied gelangen. Sobald es zu 2 oder mehr geht, gibt es immer True zurück, unabhängig davon, was die Elemets sind. Wenn es kein ToBoolean() gibt und es auf die Standardmethode ToString() zurückgreift, wird dies immer als True ausgewertet.

Oder vielleicht nicht.

+0

Ich habe eine ToBoolean-Methode hinzugefügt, die false an eine Arraylist zurückgibt, aber der Vergleich ergab einen falschen Test '$ false -eq $ array_list_with_to_bool'. Ich bin also nicht sicher, ob es eine Methode namens ToBoolean gibt. –