EMZETT.
Login

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 5

Funktionen 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-Object

Ausgabe:

Kind
Jugendlicher
Erwachsener
15 Jahre: Jugendlicher
Validierung: ParameterBindingValidationException
Alter
Format

Wichtige 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 erkannt

Konventionen 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, ValidateSet machen Funktionen cmdlet-artig
  • try/catch/finally, throw, -ErrorAction Stop für abbrechende Fehler
  • $ErrorActionPreference = "Stop" und Set-StrictMode in Skripten

Übungsaufgabe

Schreibe eine Funktion Convert-Temperatur mit den Parametern -Wert und -Einheit (ValidateSet C oder F).

Quiz zur Selbstkontrolle

?

  • 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