PowerShell-Logik

8

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.

%Vor%

Es sind die Werte dieser Objekte, auf die es ankommt.

%Vor%     
Mad Tom Vane 09.04.2013, 21:18
quelle

3 Antworten

7

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

%Vor%

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

zurück %Vor%

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.

    
Andy Arismendi 09.04.2013, 22:14
quelle
3

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.

    
mjolinor 09.04.2013 22:09
quelle
2

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.

    
Christopher Douglas 09.04.2013 21:52
quelle

Tags und Links