Rückgabewert in PowerShell

  1. Verwenden des Schlüsselworts return in PowerShell
  2. Rückgabewerte in der Pipeline in PowerShell
  3. Definieren von Klassen in PowerShell 5
Rückgabewert in PowerShell

Im Allgemeinen verlässt das Schlüsselwort return eine Funktion, ein Skript oder einen Skriptblock. So können wir damit beispielsweise einen Geltungsbereich an einer bestimmten Stelle verlassen, einen Wert zurückgeben oder anzeigen, dass das Ende des Geltungsbereichs erreicht ist.

In Windows PowerShell kann die Verwendung des Schlüsselworts return jedoch etwas verwirrend sein, da Ihr Skript möglicherweise eine Ausgabe ausgibt, die Sie möglicherweise nicht erwartet haben.

In diesem Artikel wird erläutert, wie das Schlüsselwort return funktioniert und wie es in Windows PowerShell richtig verwendet wird.

Verwenden des Schlüsselworts return in PowerShell

Der folgende Skriptblock ist die Grundform der Syntax des Schlüsselworts return.

return <expression>

Das Schlüsselwort return kann alleine erscheinen, oder es kann ein Wert oder Ausdruck folgen. Allein das Schlüsselwort return bringt die Befehlszeile zum vorherigen Aufrufpunkt zurück.

return
return $a
return (1 + $a)

Das folgende Beispiel verwendet das Schlüsselwort return, um eine Funktion zu verlassen, wenn an einem bestimmten Punkt eine Bedingung erfüllt ist. In diesem Beispiel werden die ungeraden Zahlen nicht multipliziert, weil die return-Anweisung kommt, bevor diese Anweisung ausgeführt werden kann.

function MultiplyOnlyEven
{
    param($num)

    if ($num % 2) { return "$num is not even" }
    $num * 2
    return
}

1..10 | ForEach-Object {MultiplyOnlyEven -Num $_}

Ausgabe:

1 is not even
4
3 is not even
8
5 is not even
12
7 is not even
16
9 is not even
20

Windows PowerShell weist eine verwirrende Rückgabesemantik auf, wenn es aus einer eher nativen Programmierperspektive betrachtet wird. Es gibt zwei Hauptideen, die wir berücksichtigen müssen:

  1. Alle Ausgaben werden erfasst und zurückgegeben.
  2. Das Schlüsselwort return gibt einen logischen Ausgangspunkt an.

Vor diesem Hintergrund geben die folgenden paar Skriptblöcke den Wert der Variablen $a zurück.

Schlüsselwort mit einem Ausdruck zurückgeben:

$a = "Hello World"
return $a

Schlüsselwort ohne Ausdruck zurückgeben:

$a = "Hello World"
$a
return

Das Schlüsselwort return wird im zweiten Skriptblock ebenfalls nicht benötigt, da der Aufruf der Variablen in der Befehlszeile diese Variable explizit zurückgibt.

Rückgabewerte in der Pipeline in PowerShell

Wenn Sie einen Wert von Ihrem Skriptblock oder Ihrer Skriptfunktion zurückgeben, öffnet Windows PowerShell automatisch die Member und überträgt sie einzeln durch die Pipeline. Der Grund für diesen Anwendungsfall liegt in der Einzelverarbeitung von Windows PowerShell.

Die folgende Funktion zeigt, dass diese Idee ein Array von Zahlen zurückgibt.

function Test-Return
{
    $array = 1,2,3
    return $array
}
Test-Return | Measure-Object | Select-Object Count

Ausgabe:

Count
-----
    3

Bei Verwendung des Cmdlets Test-Return wird die Ausgabe der unten stehenden Funktion an das Cmdlet Measure-Object weitergeleitet. Das Cmdlet zählt die Anzahl der Objekte in der Pipeline, und bei der Ausführung ist die zurückgegebene Anzahl drei.

Um einen Skriptblock oder eine Funktion dazu zu bringen, nur ein einzelnes Objekt an die Pipeline zurückzugeben, verwenden Sie eine der folgenden Methoden:

Verwenden von unären Array-Ausdrücken in PowerShell

Die Verwendung eines unären Ausdrucks kann Ihren Rückgabewert als einzelnes Objekt über die Pipeline senden, wie im folgenden Beispiel gezeigt.

function Test-Return
{
    $array = 1,2,3
    return (,$array)
}
Test-Return | Measure-Object | Select-Object Count

Ausgabe:

Count
-----
    1

Verwendung von Write-Output mit NoEnumerate-Parameter in PowerShell

Wir können auch das Cmdlet Write-Output mit dem Parameter -NoEnumerate verwenden. Im folgenden Beispiel wird das Cmdlet Measure-Object verwendet, um die Objekte zu zählen, die von der Beispielfunktion mit dem Schlüsselwort return an die Pipeline gesendet werden.

Beispielcode:

function Test-Return
{
    $array = 1,2,3
    return Write-Output -NoEnumerate $array
}
Test-Return | Measure-Object | Select-Object Count

Ausgabe:

Count
-----
    1

Eine weitere Methode, um die Pipeline zu zwingen, nur ein einzelnes Objekt zurückzugeben, wird in PowerShell Version 5 eingeführt, die wir im nächsten Abschnitt des Artikels besprechen werden.

Definieren von Klassen in PowerShell 5

Mit Windows PowerShell Version 5.0 können wir jetzt unsere benutzerdefinierten Klassen erstellen und definieren. Ändern Sie Ihre Funktion in eine Klasse, und das Schlüsselwort return gibt nur das einzelne Objekt zurück, das ihr unmittelbar vorausgeht.

Beispielcode:

class test_class {
    [int]return_what() {
        Write-Output "Hello, World!"
        return 1000
    }
}
$tc = New-Object -TypeName test_class
$tc.return_what()

Ausgabe:

1000

Wenn die obige Klasse eine Funktion ist, gibt sie alle gespeicherten Werte in der Pipeline zurück.

Ausgabe:

Hello World!
1000
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn