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).
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).
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:
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).
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.