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
Schluss mit unübersichtlichem Code! Entdecke, wie du in PowerShell Objekte erstellst, geordnete Hash-Tabellen nutzt und effizient mit Klassen arbeitest.
Es ist immer eine gute Vorgehensweise, dass Skripte Objekte statt einfache Daten zurückgeben. Wenn ein Skript oder eine Funktion mehrere Informationen zurückgeben muss, sollte man in Erwägung ziehen, sie als benutzerdefiniertes Objekt zu strukturieren.
Der häufigste und einfachste Ansatz ist es, mit einer Hash-Tabelle zu beginnen und diese dann in ein PSCustomObject umzuwandeln.
$returnValue = [PSCustomObject]@{
Datum = Get-Date
Benutzer = $env:username
Id = 12
Status = 'OK'
}
return $returnValue
Beachte, dass dein Objekt von deiner Hash-Tabelle abgeleitet ist und nicht ohne Grund eine Hash-Tabelle genannt wird: die Reihenfolge der Schlüssel ist zufällig. Wenn du sie später in ein PSCustomObject umwandelst, kann daher die Reihenfolge der Eigenschaften deines Objekts ebenfalls zufällig erscheinen.
$hash = @{}
$hash.Date = Get-Date
$hash.User = $env:username
$hash.Id = 12
$hash.Status = 'OK'
$returnValue = [PSCustomObject]$hash
return $returnValue
Wenn die Reihenfolge der Eigenschaften für dich wichtig ist, beginne mit einer geordneten Hash-Tabelle. Solche Hash-Tabellen behalten die Reihenfolge bei, in der die Schlüssel erstellt wurden.
$hash = [Ordered]@{}
$hash.Date = Get-Date
$hash.User = $env:username
$hash.Id = 12
$hash.Status = 'OK'
$returnValue = [PSCustomObject]$hash
return $returnValue
PSCustomObjects sind durchaus geeignet, um strukturierte Daten zurückzugeben, aber es gibt einen besseren (wenn auch weniger bekannten) Ansatz: Klassen. Klassen können eine Menge, und es kostet nicht viel Mühe, sie für die Erstellung von Objekten zu verwenden.
# Definiere deine Objektstruktur
class MyDataSet
{
[DateTime]$Date
[string]$User
[int]$Id
[string]$Status
}
# ein neues leeres Objekt aus der "Vorlage" (oder dem Typ) holen
$returnValue = [MyDataSet]::new()
# fülle die Werte
$returnValue.Date = Get-Date
$returnValue.User = $env:username
$returnValue.Id = 12
$returnValue.Status = 'OK'
return $returnValue
Klassen bieten mehrere Vorteile: sie können stark typisiert werden (mit eindeutigen Eigenschaftstypen), von der Klasse abgeleitete Objekte haben garantiert eine identische Struktur (wodurch Tippfehler in Hash-Tabellenschlüsseln vermieden werden) und die Objekte haben immer einen bestimmten Typ (während die bisherigen Objekte alle vom Typ PSCustomObject waren):
PS> $returnValue.GetType().FullName
MyDataSet
Es gibt noch viel mehr über Klassen zu sagen, aber mit der einfachen Klassendefinition oben kannst du bereits alle Arten von typsicheren Objekten erstellen.
Wenn du Lust auf mehr hast, kannst du der Klasse einen sogenannten 'Konstruktor' hinzufügen, der die Dinge noch einfacher macht. Ein Konstruktor ist eine Methode, die innerhalb der Klasse definiert ist und den gleichen Namen wie die Klasse trägt. Er kann Argumente entgegennehmen, um Eigenschaften zu initialisieren, so dass du nicht nur neue, leere Objekte erstellen kannst (via ::new()), sondern auch initialisierte, die bereits alle Informationen enthalten, die du kapseln willst:
# Definiere die Objektstruktur
class MyDataSet
{
[DateTime]$Date
[string]$User
[int]$Id
[string]$Status
MyDataSet()
{}
MyDataSet([DateTime]$Date,[string]$User,[int]$Id,[string]$Status)
{
$this.Date = $Date
$this.User = $User
$this.Id = $Id
$this.Status = $Status
}
}
return [MyDataSet]::new((Get-Date), $env:username, 12, 'OK')
Wenn du Konstruktoren hinzufügst, können die Klassen auch zur Umwandlung von Objekten verwendet werden. Stelle einfach sicher, dass die Klasse einen Konstruktor hat, dessen Eigenschaftsnamen und -typen mit denen des zu konvertierenden Objekts übereinstimmen.
Hier ist ein Beispiel: Ein einfacher (untypisierter) Satz von CSV-Daten wird mithilfe deiner neuen Klasse eindeutig typisiert:
# Definiere deine Objektstruktur
class MyDataSet
{
[DateTime]$Date
[string]$User
[int]$Id
[string]$Status
MyDataSet()
{}
MyDataSet([DateTime]$Date,[string]$User,[int]$Id,[string]$Status)
{
$this.Date = $Date
$this.User = $User
$this.Id = $Id
$this.Status = $Status
}
}
# einige Daten können von überall her stammen
$data = 'Date,User,Id,Status
2021-01-19 12:10:11, willi, 123, OK
2024-10-09 09:22:42, linda, 44.3, FAIL' |
ConvertFrom-Csv
# eindeutig typisiert
[MyDataSet[]]$dataTyped = $data
$data
$dataTyped
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.