PowerShell-Parametervalidierung

Overview

Parametervalidierung prüft Eingaben einer Funktion oder eines Skripts, bevor der eigentliche Code läuft. Du setzt dafür Attribute in den param-Block. Ist ein Wert ungültig, bricht PowerShell mit einer Fehlermeldung ab, die den Parameter nennt. Eigener Prüfcode am Anfang der Funktion entfällt.

Verfügbare Attribute sind unter anderem ValidateCount, ValidateLength, ValidatePattern, ValidateRange, ValidateScript, ValidateSet, ValidateNotNull, ValidateNotNullOrEmpty, ValidateNotNullOrWhiteSpace, ValidateDrive und ValidateUserDrive. Dazu kommen AllowNull, AllowEmptyString und AllowEmptyCollection sowie das Argument Mandatory im Parameter-Attribut.

Seit PowerShell 6 gibt es zwei nützliche Erweiterungen: ValidateScript erlaubt eine eigene Fehlermeldung über das Argument ErrorMessage, und ValidateSet kann seine Werte dynamisch über eine Klasse mit IValidateSetValuesGenerator beziehen.

How it works

Typische Attribute und ihre Wirkung:

  1. [Parameter(Mandatory)] macht den Parameter zum Pflichtfeld, fehlt er, fragt PowerShell interaktiv nach.
  2. [ValidateSet('Test','Prod')] erlaubt nur feste Werte und liefert zugleich Tab-Vervollständigung.
  3. [ValidateRange(1,100)] begrenzt Zahlenbereiche, [ValidateLength(3,15)] die Länge von Strings, [ValidateCount(1,10)] die Anzahl der Elemente.
  4. [ValidatePattern('^[A-Z]{2}\d{4}$')] prüft gegen einen regulären Ausdruck.
  5. [ValidateScript({ Test-Path $_ }, ErrorMessage = '...')] führt eigene Logik aus, $_ ist dabei der übergebene Wert.

Für kompilierte Cmdlets in C# setzt Du dieselben Attribute auf die öffentlichen Eigenschaften der Cmdlet-Klasse. In PowerShell-Klassen können Methodenparameter keine Validierungsattribute tragen, Eigenschaften unterstützen kein ValidateScript.

Benefits

  • Frühe Fehler: Falsche Eingaben stoppen vor der ersten Änderung, nicht mitten in einer Massenoperation
  • Weniger Code: Prüflogik steht deklarativ im param-Block statt in if-Abfragen
  • Selbstdokumentierend: Erlaubte Werte sind im Code und über Get-Help sichtbar
  • Bessere Bedienung: ValidateSet liefert Tab-Vervollständigung für Kollegen, die das Skript nutzen

Practical example

Ein Pharmagroßhändler mit 350 Mitarbeitenden nutzt ein Skript, das Postfächer für ausscheidende Mitarbeitende umwandelt. Einmal wurde es versehentlich mit leerem Benutzernamen und Umgebung „Produktiv“ gestartet. Der Admin ergänzt Mandatory und ValidateNotNullOrWhiteSpace für den Benutzernamen, ValidateSet für die Umgebung und ValidateScript mit eigener Fehlermeldung, die prüft, ob das Konto existiert. Fehlaufrufe enden jetzt mit einer verständlichen Meldung, bevor etwas geändert wird.

Things to keep in mind

  • ValidateScript nur für Prüfungen nutzen, die kein anderes Attribut abdeckt, weil es schwerer lesbar ist
  • Bei ValidateScript eine eigene ErrorMessage setzen, die Standardmeldung zeigt nur den Scriptblock
  • Für Skripte, die unter Windows PowerShell 5.1 laufen, auf ErrorMessage und IValidateSetValuesGenerator verzichten, beide gibt es erst ab PowerShell 6
  • ValidatePattern mit ^ und $ verankern, sonst reicht ein Teiltreffer

Conclusion

Validierungsattribute sind die günstigste Absicherung gegen Fehlbedienung. Jede Funktion, die Änderungen vornimmt, sollte ihre Parameter so prüfen.