Wenn Sie auf den Hilfebereich about_Comparison_Operators von PowerShell schauen, verstehe ich Folgendes:
%Vor% Nichts von links stimmt mit dem Recht überein, also wird nichts zurückgegeben, nicht einmal ein $null
.
Ich verstehe das nicht:
%Vor% Liegt es daran, dass $true -eq $false
zuerst False zurückgibt und dann False und $false -eq $false
verwendet, was True zurückgibt ?
Weitere Informationen
Der Grund, warum unten false zurückgegeben wird, ist, dass es einen String mit einem Array vergleicht, richtig? Eine Zeichenfolge ist nicht gleich einem Array.
%Vor%Antwort?
Mehr Graben zeigt, dass $true
gleich einem Objekt ist.
Es sind die Werte dieser Objekte, auf die es ankommt.
%Vor%Ich mag grundlegende Fragen über das Verhalten und die Eigenschaften der Sprache wie dieses ... Gib mir eine Ausrede, um die PowerShell-Sprachspezifikation zu lesen.
Sie können diese Spezifikation herunterladen: 2.0 und 3.0 . Siehe Abschnitt 7.8.1 - Gleichheit und relationale Operatoren.
Für den ersten Teil der Frage wird tatsächlich etwas zurückgegeben - ein leeres Array, das veranschaulicht wird durch: ($false,$false -eq $true).psbase
Aus der Spezifikation -
Wenn der vom linken Operanden angegebene Wert keine Sammlung ist, wird der Ergebnis hat Typ bool. Ansonsten ist das Ergebnis möglicherweise leer unbeschränktes 1-dimensionales Array mit den Elementen des Sammlung dieser Test True im Vergleich zu dem Wert von der rechter Operand.
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:
%Vor% Alle von diesen geben $true
zurück. Umgekehrt geben alle diese $false
Der Typ des linken Operanden ist sehr wichtig. Dies wird $true
: $false -eq 0
zurückgeben, da der rechte Operand in den Typ des linken Operanden umgewandelt werden kann.
Beste Schätzung:
Es wird als True ausgewertet, da es sich um ein Array mit mehr als einem Member handelt. Ein Array hat keine ToBoolean () -Methode.
Solange es sich um einen Skalar oder ein Array mit nur einem Member handelt, kann Powershell das auf einen Skalar anwenden und eine ToBoolean () -Methode für das Member aufrufen. 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 ToString () - Standardmethode zurückgreift, wird diese immer als True ausgewertet.
Oder vielleicht nicht.
Vielleicht bewertet der Operator -eq
ihre Existenz (auch nicht $null
) und nicht ihren Wert.
Ähnlich wie die IF-Anweisung vielleicht?
%Vor%Diese Antwort von @Joey könnte erweisen sich auch als nützlich.
Tags und Links powershell equals logic compare