Skip to the main content.

PowerShell-Erfolgsrezepte – die Profi-Tipps für effektives Scripting

PowerShell-Skripte zur Validierung und Transformation von Daten

Du hast genug von versteckten Fehlern in PowerShell-Skripten? Entdecke, wie Validierungs- und Transformationsattribute Präzision und Automatisierung in deinen Code bringen können!

Wenn du Variablen Informationen zuweist, führt PowerShell standardmäßig keine zusätzliche Arbeit aus. PowerShell übernimmt einfach den Wert und speichert ihn in der Variable:


$test = '1.2.3.4'
$test 

 

Dies ist zwar praktisch, kann aber in größeren Skripten Fehler verdecken und die Fehlersuche erschweren. Falls gewünscht, kannst du PowerShell bitten, Typkonvertierungen aufzurufen, ganze Skriptblöcke auszuführen, um Variablenzuweisungen zu überprüfen und umzuwandeln, und Fehler auszugeben, wenn ungültige Daten gefunden werden.

 

Zuweisung eines Typs

Wenn einer Variablen ein Typ zugewiesen wird, muss jeder neue Wert, der ihr zugewiesen wird, von diesem Typ sein oder in diesen konvertierbar sein. Wenn ungültige Werte nicht konvertiert werden können, wird eine Ausnahme/ein Fehler ausgelöst:


[int]$id = 123
$id = 12.5
$id # jetzt 12 (gerundet)
$id = 'falsch' # löst einen Fehler aus, nicht konvertierbar in int

 

Typenzuweisungen bieten einen weiteren großen Vorteil: Sie ermöglichen es, einen geeigneteren Typ für deine Daten auszuwählen, was dir eine Menge Arbeit erspart. Schau dieses Beispiel an:


$installed = '2.3.4.5'
$available = '10.1.2.3'

$shouldInstall = $installed -lt $available
$shouldInstall 

 

Da PowerShell einen alphanumerischen Vergleich für Zeichenketten verwendet, gilt "2.3.4.5" als größer als "10.1.2.3". Es wäre ein erheblicher Aufwand, um die Zahlen einzeln zu vergleichen.

Alternativ delegierst du diese Aufgabe an einen geeigneteren Typ: Sobald die Variablen dem Typ "[Version]" zugewiesen wird, erfolgt der Abgleich.


[version]$installed = '2.3.4.5'
[version]$available = '10.1.2.3'
$shouldInstall = $installed -lt $available
$shouldInstall 

 

Typen verfeinern

Gelegentlich gibt es keinen perfekt passenden Typ für die verwendeten Daten. In solchen Fällen hilft der Basistyp, den du mit einem Validierungsattribut verfeinern kannst.

Wenn du zum Beispiel eine Variable haben willst, die eine ID-Nummer im Bereich von 1 bis 1000 speichert und (über eine Ausnahme) die Benachrichtigung erfolgt, falls eine ungültige ID-Nummer auftritt, könntest du [int] als Basistyp verwenden und [ValidateRange(1, 1000)] hinzufügen:


[ValidateRange(1,1000)][int]$id = 10

# das funktioniert
$id = 1000

# das löst eine Ausnahme aus (fail)
$id = -1
$id = 1001 

 

Es gibt mehrere eingebaute Validierungsattribute; [ValidateScript()] ist jedoch das flexibelste, da es einem erlaubt, die Validierungskriterien selbst zu definieren.

Hier ist ein Beispiel für eine Variable, die nur Dateipfade zu Dateien speichern kann, die tatsächlich im Windows-Ordner existieren:


[ValidateScript({ Test-Path -Path $_ -PathType Leaf})][string]$filepath = 'C:\Windows\explorer.exe'

# das funktioniert
$filepath = "$env:windir\notepad.exe"

# das löst eine Ausnahme aus (fail)
$filepath = "c:\test.txt"

 

Transformation von Daten

Durch Hinzufügen von Transformationsattributen teilst du einer Variablen mit, wie sie eine Zuweisung zu interpretieren hat, und sie in eine beliebige Form umwandelt.

Hier ist ein Beispiel für ein benutzerdefiniertes Transformationsattribut:


class ServerIdAttribute : System.Management.Automation.ArgumentTransformationAttribute
{
[object]
Transform([System.Management.Automation.EngineIntrinsics]$engineIntrinsics, [object] $inputData)
{
################## Beginn des benutzerdefinierten Codes ##################################

# Variablenzuweisung wird in $inputData gefunden

# Benutzereingabe war bereits ein wohlgeformter Servername (well-formed)
if ($inputData -match '^Server\d{4}$')
{
return $inputData
}
# Benutzereingabe war eine Zahl, konstruiere den Servernamen
elseif ($inputData -is [int])
{
return 'Server{0:d4}' -f $inputData
}
# Benutzereingabe war ein String, kann er in eine Zahl (des Typs int) umgewandelt werden?
elseif ($inputData -as [int])
{
return 'Server{0:d4}' -f ($inputData -as [int])
}
# ungültige Benutzereingabe
else
{
throw "Servernamen müssen 'ServerXXXX' sein, wobei 'XXXX' eine Zahl ist."
}
################## Ende des benutzerdefinierten Codes ###################################
}
}

 

Diese Vorlage bleibt gleich; nur der Code zwischen den Markierungen ändert sich und bestimmt, wie $inputData (die Zuweisung) umgewandelt werden soll, bevor sie in der Variablen gespeichert wird.

Der Klassenname definiert den Namen deines Transformationsattributs und muss immer mit 'Attribut' enden. In diesem Beispiel lautet der Klassenname ServerIdAttribute, also heißt das Transformationsattribut [ServerId()].

Wenn dieses Attribut definiert ist, kannst du Variablen wie folgt zuweisen:


[ServerId()]$serverName = 12 

 

Die Variable enthält nun 'Server0012'. Da Variablen ihre Typen und Attribute beibehalten, wird immer dann, wenn du der Variablen eine Zahl zuweist, automatisch ein Servername mit einer vierstelligen Zahl erzeugt:


PS C:\> $serverName
Server0999

PS C:\> $Servername = "98"

PS C:\> $Servername
Server0098

PS C:\> $Servername = 'Server0123'

PS C:\> $Servername
Server0123
 

 

Transformationsattribute bleiben während der gesamten Lebensdauer einer Variablen aktiv. Immer, wenn neue Werte zugewiesen werden, wird der Code innerhalb des Transformationsattributs ausgeführt.

 

Alle unsere Goodies für dich auf einer Seite: Active Directory, Graph, Teams, Exchange, PowerShell allgemein und mehr zum Thema Sicherheit

Dein ultimativer PowerShell-Spickzettel

Entfessele das volle Potenzial von PowerShell mit unserem praktischen Poster. Egal, ob frischer Einsteiger oder erfahrener Profi, dieser Spickzettel ist so konzipiert, dass du schnell die wichtigsten und am häufigsten verwendeten Cmdlets findest.

Das Poster ist zum Download und in Papierform erhältlich.

PowerShell Poster 2023

Hol dir hier dein Poster!

 

 

Weiterführende Links 

 

Zusammenhängende Posts

4 min read

Objekte in PowerShell: So bringst du Struktur in deine Skripte

Schluss mit unübersichtlichem Code! Entdecke, wie du in PowerShell Objekte erstellst, geordnete Hash-Tabellen nutzt und...

5 min read

PowerShell-Skripte zur Validierung und Transformation von Daten

Du hast genug von versteckten Fehlern in PowerShell-Skripten? Entdecke, wie Validierungs- und Transformationsattribute...

4 min read

Setze auf die PowerShell-Pipeline

Du willst deine PowerShell-Skripte schneller und flexibler gestalten? Erfahre hier, wie du die Pipeline mit...

Über den Autor: