patpitchaya - Fotolia

Wie Sie mit Rückgabewerten in PowerShell Code-Arbeit sparen

Durch die Nutzung des Schlüsselwortes return erweitern Sie den Geltungsbereich einer PowerShell-Funktion und können so in einigen Fällen den Umfang des ganzen Skripts reduzieren.

Wenn Sie Get-Funktionen schreiben wollen, die Werte an die Konsole zurückgeben, gibt es verschiedene Wege, die unterschiedlich effizient sind.

Wenn Sie mit PowerShell-Funktionen arbeiten, kommen Sie relativ weit, wenn Sie nur Funktionen schreiben, die keine Daten zurückgeben. Beispielsweise geben viele Set- oder Update-Funktionen ohne den Parameter -Verbose kein Feedback an die Konsole zurück. Ein return-Schlüsselwort kann einen Wert zurückgeben oder einen Exit-Punkt in einem Bereich zur Verfügung stellen. Sie müssen jedoch genau verstehen, wie Rückgabewerte in PowerShell funktionieren.

1. Methode: Werteausgabe

Am einfachsten ist es, PowerShell den gewünschten Wert ausgeben zu lassen. Im folgenden Beispiel suchen wir nach dem Datei-Explorer-Prozess. Anstatt den gesamten Where-Object-Ausdruck einzugeben, können Sie ihn mit einer Funktion kürzen:

Function Get-Explorer {
    Get-Process | Where-Object Name -eq 'Explorer'
}

In der obigen Funktion ist möglicherweise nicht direkt erkennbar, wie dieser Code etwas zurückgibt. Das Cmdlet Get-Process, das normalerweise die auf dem Computer ausgeführten Prozesse zurückgibt, weist jedoch darauf hin. Da die Rückgabe dieses Cmdlets nicht auf eine Variable festgelegt ist, wird sie direkt in der Pipeline ausgegeben. Wenn Sie es expliziter machen möchten, weisen Sie es einer Variablen zu und geben Sie die Variable aus:

Function Get-Explorer {
    $explorer = Get-Process | Where-Object Name -eq 'Explorer'
    $explorer
}

Sie können das mit dem Cmdlet Write-Output weiter verfeinern:

Function Get-Explorer {
    $explorer = Get-Process | Where-Object Name -eq 'Explorer'
    Write-Output $explorer
}

Das obige Beispiel ist leicht verständlich, aber im täglichen Gebrauch wird die Effizienz beeinträchtigt, wenn der Ausgabewert in einer Variablen gespeichert wird. Während das dritte Beispiel besser lesbar ist, ist das erste die empfohlene Form.

Alle Beispiele erzeugen eine Ausgabe im Tabellenformat (Abbildung 1).

Ergebnis
Abbildung 1: Jede der drei Funktionen liefert dieses Ergebnis.

Wenn Sie Get-Process bereits verwendet haben, sollte Ihnen diese Ausgabe bekannt vorkommen, da es sich um ein Prozessobjekt handelt, das Sie mit der Methode GetType () überprüfen können (Abbildung 2).

GetType ()
Abbildung 2: Mithilfe von GetType () lassen Sie sich den Datentyp der Variablen anzeigen.

Mit diesem Code haben Sie alles, was Sie brauchen, um die Ausgabe in einer PowerShell-Funktion zurückzugeben. Es gibt jedoch noch eine andere Methode, die ihre eigenen Vorteile hat.

2. Methode: Verwendung von return

Wenn Sie bereits Erfahrung mit anderen Programmiersprachen wie zum Beispiel C haben, kennen Sie wahrscheinlich das Schlüsselwort return. Der Unterschied zwischen einem Rückgabewert in C und in PowerShell besteht darin, dass C nur Werte zurückgibt, wenn Sie das mit return veranlassen, während PowerShell Werte an die Pipeline zurückgeben kann, ohne das Schlüsselwort zu verwenden.

Da wir, wie in der ersten Methode, Werte von einer PowerShell-Funktion zurückgeben können, ist der Wert des Schlüsselworts return möglicherweise nicht sofort ersichtlich. Der Unterschied zwischen der Rückgabe von Werten mit Write-Output und mit return besteht darin, dass mit return der aktuelle Gültigkeitsbereich verlassen wird. Wenn Sie sich innerhalb einer Funktion befinden und einen Wert mit return zurückgeben, gibt die Funktion diesen Wert zurück und beendet die Operation.

Um das zu demonstrieren, verwenden wir im folgenden Beispiel zweimal das Schlüsselwort return, um alle PowerShell-Prozesse zurückzugeben, die auf einem Computer ausgeführt werden, sowohl aus Windows PowerShell als auch aus Open Source PowerShell:

Function Get-PowerShellProcess {
    return Get-Process | Where-Object Name -eq 'powershell'
    return Get-Process | Where-Object Name -eq 'pwsh'
}

Hätten wir diese Befehle mit Write-Output geschrieben, würden sowohl die PowerShell- als auch die Pwsh-Prozesse ausgegeben. Da wir jedoch return verwenden, werden die Windows-PowerShell-Prozesse zurückgegeben und dann beendet. Das ist die Ausgabe auf dem Computer:

Beendigung der Funktion durch return
Abbildung 3: Mit return beenden Sie die Funktion, nachdem der erste Prozess ausgegeben wurde.

Ersetzen Sie return durch Write-Output oder entfernen Sie es ganz, um sowohl PowerShell- als auch Pwsh-Prozesse zurückzugeben:

Function Get-PowerShellProcess {
    Get-Process | Where-Object Name -eq 'powershell'
    Get-Process | Where-Object Name -eq 'pwsh'
}

PowerShell generiert dann eine Ausgabe für beide Prozesse (Abbildung 4).

ohne return
Abbildung 4: Ohne return wird die ganze Funktion durchgeführt und gibt Informationen für beide Prozesse aus.

Vermeiden Sie die Verwendung von return, um beide Arten von Prozessen zurückzugeben.

Warum Sie return brauchen

Es gibt Fälle, in denen return nützlicher ist als Write-Output. Nehmen wir zum Beispiel an, Sie wollen eine Funktion schreiben, die den ersten Index eines Zeichens in einer Zeichenkette zurückgibt, und wenn es nicht existiert, soll sie -1 zurückgeben. Wenn Sie Write-Output verwenden wollen, damit die Funktion effizient beendet wird, wenn sie das Zeichen gefunden hat, sieht das wie folgt aus:

Function Find-Character {
    param ([char]$Char,[string]$String)
    $found = $false
    for($x=0;$x -lt $String.Length;$x++) {
        If($String[$x] -eq $Char) {
            Write-Output $x
            $found = $true
            break
        }
    }
    if (-not $found) {
        Write-Output -1
    }
}

Das Skript verlässt die for-Schleife, wenn es das Zeichen findet, aber wiederholt die Überprüfung im Skript. Das ist zu komplex für eine einfache Operation. Effizienter ist es, return mit folgendem Code zu verwenden:

Function Find-Character {
    param ([char]$Char,[string]$String)
    for($x=0;$x -lt $String.Length;$x++) {
        If($String[$x] -eq $Char) {
            return $x
        }
    }
    return -1
}

Dieses Skript ist kürzer, leichter zu lesen und erreicht das gleiche Ergebnis. Wenn der erste Rückgabewert zum ersten Mal ausgeführt wird, gibt er sofort $ x zurück und beendet die Funktion. Wenn das Zeichen nicht gefunden wird, fährt der Code mit dem letzten Rückgabewert fort und gibt -1 zurück.

Hinweis: Dieser Artikel wurde ursprünglich von Anthony Howell verfasst und von der ComputerWeekly-Redaktion aktualisiert, um Branchenveränderungen widerzuspiegeln und das Leseerlebnis zu verbessern.

Erfahren Sie mehr über Serverbetriebssysteme