Kurz: function Get-Quadrat([int]Zahl) { Zahl * $Zahl }
Teil des Kurses PowerShell
Kapitel 5 von 8 im Kurs PowerShell (Abschnitt „Skripte schreiben“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.
Funktionen
function Get-Gruss {
param(
[string]$Name = "Welt",
[string]$Anrede = "Hallo"
)
"$Anrede, $Name!"
}
function Get-Quadrat([int]$Zahl) { $Zahl * $Zahl }
Get-Gruss
Get-Gruss -Name "Mia"
Get-Gruss "Tom" "Hi"
Get-Gruss -Anrede "Servus" -Name "Zoe"
Get-Quadrat 7
Get-Quadrat -Zahl 8
function Get-Statistik {
param([double[]]$Werte)
[pscustomobject]@{
Anzahl = $Werte.Count
Summe = ($Werte | Measure-Object -Sum).Sum
Mittel = [math]::Round(($Werte | Measure-Object -Average).Average, 2)
}
}
$stat = Get-Statistik -Werte 2, 4, 4, 4, 5, 5, 7, 9
"$($stat.Anzahl) $($stat.Summe) $($stat.Mittel)"Ausgabe:
Hallo, Welt!
Hallo, Mia!
Hi, Tom!
Servus, Zoe!
49
64
8 40 5Funktionen geben alles zurück, was sie in die Ausgabe schreiben (nicht nur return!). Zwischenergebnisse also mit $null = ..., | Out-Null oder [void] unterdrücken.
Erweiterte Funktionen (Advanced Functions)
Mit [CmdletBinding()] verhält sich deine Funktion wie ein echtes Cmdlet: Pflichtparameter, Validierung, Pipeline-Eingabe, -Verbose:
function Get-Alterstufe {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[ValidateRange(0, 150)]
[int]$Alter,
[ValidateSet("kurz", "lang")]
[string]$Format = "kurz"
)
process {
$stufe = switch ($Alter) {
{ $_ -lt 13 } { "Kind"; break }
{ $_ -lt 18 } { "Jugendlicher"; break }
default { "Erwachsener" }
}
if ($Format -eq "lang") { "$Alter Jahre: $stufe" } else { $stufe }
}
}
10, 15, 40 | Get-Alterstufe
Get-Alterstufe -Alter 15 -Format lang
try {
Get-Alterstufe -Alter 200
} catch {
"Validierung: " + $_.Exception.GetType().Name
}
(Get-Command Get-Alterstufe).Parameters.Keys | Where-Object { $_ -in "Alter", "Format" } | Sort-ObjectAusgabe:
Kind
Jugendlicher
Erwachsener
15 Jahre: Jugendlicher
Validierung: ParameterBindingValidationException
Alter
FormatWichtige Attribute: Mandatory, Position, ValueFromPipeline, ValidateSet, ValidateRange, ValidatePattern, ValidateNotNullOrEmpty, [switch] für Schalter ohne Wert.
Fehlerbehandlung
PowerShell unterscheidet abbrechende (terminating) und nicht abbrechende Fehler. try/catch fängt nur abbrechende; mit -ErrorAction Stop machst du aus einem Fehler einen abbrechenden:
try {
Get-Item "/gibt/es/nicht" -ErrorAction Stop
"wird nie erreicht"
} catch [System.Management.Automation.ItemNotFoundException] {
"nicht gefunden: " + $_.Exception.GetType().Name
} catch {
"anderer Fehler: $($_.Exception.Message)"
} finally {
"finally läuft immer"
}
$ergebnis = Get-Item "/gibt/es/nicht" -ErrorAction SilentlyContinue
$null -eq $ergebnis
$Error.Count -ge 1
function Test-Teilen {
param([int]$A, [int]$B)
if ($B -eq 0) { throw "Division durch null" }
$A / $B
}
try { Test-Teilen 1 0 } catch { "Gefangen: $($_.Exception.Message)" }
try { [int]"abc" } catch { "Umwandlung: " + $_.Exception.GetType().Name }
try { 1 / 0 } catch { "Rechnen: " + $_.Exception.GetType().Name }
$ErrorActionPreference = "Stop" # alle Fehler abbrechend machen (für Skripte empfohlen)
try { Get-Content "/gibt/es/nicht" } catch { "Skript-Modus: Fehler erkannt" }Ausgabe:
nicht gefunden: ItemNotFoundException
finally läuft immer
True
True
Gefangen: Division durch null
Umwandlung: RuntimeException
Rechnen: RuntimeException
Skript-Modus: Fehler erkanntKonventionen für robuste Skripte: Set-StrictMode -Version Latest, $ErrorActionPreference = "Stop", Write-Verbose/Write-Warning/Write-Error statt Write-Host, Rückgaben als Objekte.
Merke
function Name { param(...) ... }; Parameter mit Typ, Standardwert, Validierung- Funktionen geben alle Ausgaben zurück, nicht nur
return [CmdletBinding()],Mandatory,ValueFromPipeline,ValidateSetmachen Funktionen cmdlet-artigtry/catch/finally,throw,-ErrorAction Stopfür abbrechende Fehler$ErrorActionPreference = "Stop"undSet-StrictModein Skripten
Übungsaufgabe
Schreibe eine Funktion Convert-Temperatur mit den Parametern -Wert und -Einheit (ValidateSet C oder F).
Quiz zur Selbstkontrolle
Was passiert mit allen Ausgaben einer Funktion?
- Sie werden als Rückgabewert gesammelt (richtig)
- Nur return zählt
- Sie werden verworfen
- Sie gehen immer an die Konsole
Wie macht man einen Cmdlet-Fehler für try/catch fangbar?
- Mit -ErrorAction Stop (richtig)
- Mit -Force
- Mit -Quiet
- Mit -Catch
?
- Der Parameter ist Pflicht (richtig)
- Der Parameter ist versteckt
- Der Parameter ist Standard
- Der Parameter ist veraltet
Weiter im Kurs
Zurück: Kontrollfluss, Arrays und Hashtables
Weiter: Dateien, Text, Regex, Module und Remoting
Alle Kapitel: PowerShell im Überblick