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...
PowerShell-Erfolgsrezepte – die Profi-Tipps für effektives Scripting
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.
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
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"
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.
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.
Jan 7, 2025 by Aleksandar Nikolić und Dr. Tobias Weltner
Schluss mit unübersichtlichem Code! Entdecke, wie du in PowerShell Objekte erstellst, geordnete Hash-Tabellen nutzt und...
Dez 27, 2024 by Aleksandar Nikolić und Dr. Tobias Weltner
Du hast genug von versteckten Fehlern in PowerShell-Skripten? Entdecke, wie Validierungs- und Transformationsattribute...
Dez 20, 2024 by Aleksandar Nikolić und Dr. Tobias Weltner
Du willst deine PowerShell-Skripte schneller und flexibler gestalten? Erfahre hier, wie du die Pipeline mit...
Tobias Weltner und Aleksandar Nikolić haben gemeinsam die Blogpost-Reihe „Tobias&Aleksandars PowerShell-Tipps“ verfasst. Deshalb möchten wir euch beide hier vorstellen:
----------------------------
Aleksandar Nikolić ist ein Microsoft Azure MVP und Mitbegründer von PowerShellMagazine.com, der ultimativen Online-Ressource für PowerShell-Enthusiasten. Mit über 18 Jahren Erfahrung in der Systemadministration ist er ein angesehener Trainer und Redner, der rund um den Globus reist, um sein Wissen und seine Fähigkeiten über Azure, Entra und PowerShell weiterzugeben. Er hat auf IT-Veranstaltungen wie Microsoft Ignite, ESPC, NIC, CloudBrew, NTK und der PowerShell Conference Europe gesprochen.
----------------------------
Tobias ist ein langjähriger Microsoft MVP und war von Anfang an an der Entwicklung von PowerShell beteiligt. Er hat die PowerShell IDE „ISESteroids“ erfunden, zahlreiche Bücher über PowerShell für Microsoft Press und O'Reilly geschrieben, die PowerShell Conference EU (psconf.eu) gegründet und trägt derzeit als Mitglied der „Microsoft Cmdlet Working Group“ zur Weiterentwicklung der PowerShell bei. Tobias gibt sein Wissen als Berater in Projekten und als Trainer in Inhouse-Schulungen für zahlreiche Unternehmen und Agenturen in ganz Europa weiter.