Splatting

Overview

Splatting übergibt eine Sammlung von Parameterwerten als Einheit an einen Befehl. Statt $params schreibst Du @params, das @ signalisiert PowerShell eine Sammlung statt eines Einzelwerts. Eine Hashtable liefert benannte Parameter, ein Array liefert Positionsparameter in der richtigen Reihenfolge.

Splatting gibt es seit Windows PowerShell 2.0 und funktioniert mit Cmdlets, Funktionen und Skripten. Array-Splatting lässt sich auch für native Programme nutzen. DSC-Ressourcen unterstützen kein Splatting.

Seit PowerShell 7.1 kannst Du einen gesplatteten Wert überschreiben, indem Du denselben Parameter zusätzlich explizit angibst. Abgrenzung: Splatting ist keine Pipeline-Übergabe, die Werte gehen direkt an die Parameter.

How it works

Varianten:

  1. Hashtable-Splatting: $p = @{ Path = 'test.txt'; Destination = 'test2.txt'; WhatIf = $true }; Copy-Item @p. Switch-Parameter erhalten $true oder $false.
  2. Array-Splatting: $a = 'test.txt','test2.txt'; Copy-Item @a. Die Werte müssen in Positionsreihenfolge stehen.
  3. Kombination: Gesplattete und explizite Parameter dürfen gemischt werden, mehrere Splats in einem Aufruf sind erlaubt, etwa Write-Host @a @b @c.
  4. Weiterleiten: @PSBoundParameters gibt alle an eine Funktion übergebenen Parameter an einen inneren Befehl weiter. Das ist die Grundlage für Wrapper- und Proxyfunktionen.
  5. Bedingte Parameter: Du fügst Schlüssel der Hashtable nur hinzu, wenn ein Wert vorliegt, und vermeidest so verschachtelte if-Konstruktionen.

Benefits

  • Lesbarkeit: Lange Aufrufe wie New-ADUser mit zehn Parametern bleiben übersichtlich, ohne Backtick-Zeilenumbrüche
  • Dynamische Parameter: Optionale Werte lassen sich zur Laufzeit ergänzen oder weglassen
  • Wiederverwendung: Gemeinsame Parameter wie Credential oder Server stehen in einer Hashtable und gelten für mehrere Aufrufe
  • Weniger Fehler: Werte stehen benannt untereinander, Verwechslungen fallen beim Lesen auf

Practical example

Ein Bildungsträger mit 400 Beschäftigten legt zu Semesterbeginn viele AD-Konten an. Das bisherige Skript bestand aus einem einzigen Aufruf von New-ADUser mit über zwölf Parametern und Backticks, Fehler waren schwer zu finden. Der Admin baut je Benutzer eine Hashtable aus der CSV-Zeile, ergänzt optionale Felder wie Abteilung nur bei vorhandenen Werten und ruft New-ADUser @userParams auf. Das Skript ist kürzer, und leere CSV-Felder erzeugen keine Fehler mehr.

Things to keep in mind

  • Bei Variablen @ statt $ verwenden, sonst übergibt PowerShell die Hashtable als einzelnen Wert an einen Positionsparameter
  • Positionsparameter in einer Hashtable immer mit Namen angeben
  • Für Wrapper-Funktionen @PSBoundParameters nutzen, statt Parameter einzeln weiterzureichen
  • In Skripten, die auch unter Windows PowerShell 5.1 laufen, nicht auf das Überschreiben gesplatteter Werte setzen, das funktioniert erst ab 7.1

Conclusion

Splatting ist eine kleine Technik mit großer Wirkung auf die Lesbarkeit. In Produktivskripten mit langen Cmdlet-Aufrufen sollte es Standard sein.