⚡ Skripting & Error-Handling

PS 07: Eigene Cmdlets [CmdletBinding()] & Validierung

Verwandle einfache PowerShell-Funktionen in vollwertige Enterprise-Cmdlets mit [CmdletBinding()], robuster Parameter-Validierung, Pipeline-Input und -WhatIf Unterstützung.

💡 1. Das [CmdletBinding()] Attribut

Durch das Hinzufügen von [CmdletBinding()] verwandelt PowerShell eine gewöhnliche Funktion in eine Advanced Function (Script-Cmdlet). Dadurch stehen automatisch Standard-Parameter wie -Verbose, -Debug, -ErrorAction und -WarningAction zur Verfügung:

function Get-CustomReport {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string]$ReportName
    )

    Write-Verbose "Erstelle Report '$ReportName'..."
    [PSCustomObject]@{
        Report = $ReportName
        Date   = (Get-Date)
    }
}
🛡️ Didaktische Analogie: Der Passierschein mit Sicherheitsprüfung

Parameter-Validierungsattribute wie [ValidateSet()] oder [ValidateRange()] sind deine Türsteher: Ungültige Eingaben werden sofort an der Pforte abgefangen, mit aussagekräftigen Fehlermeldungen abgewiesen und gelangen niemals in deine Geschäftslogik!

🛡️ 2. Die wichtigsten Validierungs-Attribute

Schütze deine Funktionen vor fehlerhaften Aufrufen mit den bewährten .NET Validierungsattributen:

Attribut Beispiel Wirkung
[ValidateSet()] [ValidateSet('Dev', 'Test', 'Prod')] Erlaubt nur exakt definierte Zeichenketten (inkl. Tab-Completion!).
[ValidateRange()] [ValidateRange(1, 65535)] Begrenzt Zahlen auf einen Min/Max-Bereich.
[ValidateNotNullOrEmpty()] [ValidateNotNullOrEmpty()] Verhindert Übergabe von $null oder "".
[ValidatePattern()] [ValidatePattern('^v\d+\.\d+')] Prüft das Argument gegen einen Regulären Ausdruck (Regex).

⚠️ 3. Risikofreie Ausführung mit SupportsShouldProcess & -WhatIf

Für potenziell destruktive Aktionen (z.B. Neustart von Servern, Löschen von Daten) unterstützt PowerShell -WhatIf und -Confirm out-of-the-box:

function Restart-CloudServer {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param(
        [Parameter(Mandatory = $true)]
        [string]$ServerName
    )

    if ($PSCmdlet.ShouldProcess($ServerName, "Server neustarten")) {
        Write-Host "Führe echten Neustart von $ServerName durch..."
    }
}

# Ausführung:
# Restart-CloudServer -ServerName "srv01" -WhatIf
# Ausgabe: What if: Performing the operation "Server neustarten" on target "srv01".

📑 4. Cheat-Sheet: Advanced Functions

Klausel Syntax Zweck
[CmdletBinding()] [CmdletBinding(SupportsShouldProcess)] Aktiviert Standard-Cmdlet-Funktionen und $PSCmdlet.
ValueFromPipeline [Parameter(ValueFromPipeline=$true)] Ermöglicht Übergabe von Objekten über die Pipeline.
Switch-Parameter [switch]$Detailed Boolescher Schalter ohne Argument (-Detailed).
ShouldProcess $PSCmdlet.ShouldProcess("Ziel", "Aktion") Auswertung von -WhatIf und -Confirm.

🧠 Diagnostischer Selbst-Check

Überprüfe dein Verständnis zu PowerShell-Architektur, Pipeline-Mechanik und Best Practices mit gezieltem Feedback:

🎯 Aufgaben & Checkliste in aufgabe.ps1

💻 In Web-IDE öffnen → ← Zurück zu PS 06 Weiter zu PS 08 →