17 Stimmen

Rückgabeverhalten von PowerShell-Funktionen

Ich sehe ein ziemlich seltsames Verhalten mit PowerShell. Es sieht so aus, als ob benutzerdefinierte Funktionen einen "Klammer-Wrapper" benötigen, um so ausgewertet zu werden, wie man es erwarten könnte. Gegeben eine einfache PowerShell-Funktion:

function Return-True { return $true }

und dann ein Beispielcode, um es aufzurufen:

PS C:\> Return-True
True
PS C:\> Return-True -eq $false
True
PS C:\> (Return-True) -eq $false
False

Ideen? Kommentare?

35voto

Grant Wagner Punkte 24137

Wenn PowerShell das Token sieht Return-True identifiziert es als Befehl und bis zur Auswertung oder dem Ende der Anweisung ist alles andere ein Argument, das an die Funktion übergeben wird Return-True .

Sie können dies in Aktion sehen, wenn Sie es tun:

PS > function Return-True { "The arguments are: $args"; return $true }
PS > Return-True -eq $false
The arguments are: -eq False
True

Deshalb geben alle folgenden Befehle 'True' zurück, denn alles, was Sie sehen, ist das Ergebnis des Aufrufs Return-True mit verschiedenen Argumenten:

PS > Return-True -eq $false
True
PS > Return-True -ne $false
True
PS > Return-True -eq $true
True
PS > Return-True -ne $true
True

Verwendung von (Return-True) zwingt PowerShell, die Funktion (ohne Argumente) auszuwerten.

6voto

hurcane Punkte 1161

In der zweiten Zeile wird keine boolesche Auswertung vorgenommen. Schauen Sie sich an, was passiert, wenn Sie dasselbe mit Strings machen.

PS C:\> function Return-True { return "True string" }
PS C:\> Return-True
True string
PS C:\> Return-True -eq "False string"
True string
PS C:\> (Return-True) -eq "False string"
False

In der zweiten Zeile wird einfach der Wert der Funktion zurückgegeben, ohne dass ein Vergleich durchgeführt wird. Ich bin mir nicht sicher, warum dieses Verhalten auftritt, aber es macht das Verhalten einfacher zu sehen, als bei der Verwendung von booleschen Werten, die in die Zeichenketten "True" und "False" umgewandelt werden.

5voto

mrwaim Punkte 1591

Wenn Sie den Editor von PowerShell V2 verwenden, sehen Sie, dass -eq im ersten Beispiel blau ist, da es ein Argument ist und -eq im zweiten Beispiel grau ist, weil es ein Operator ist

Auch in V2 können Sie die Argumente mit CmdletBinding und param genau festlegen

function Return-True
{
    [CmdletBinding()]
    param()
    return $true
}
Return-True -eq $false

Return-True -eq $false
Return-True : A parameter cannot be found that matches parameter name 'eq'.
At line:7 char:16
+ Return-True -eq <<<<  $false
    + CategoryInfo          : InvalidArgument: (:) [Return-True], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Return-True

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X