Skip to the main content.

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

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 effizient mit Klassen arbeitest.

 

Erstellen von Objekten

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.

 

Benutzerdefinierte Objekte

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 

 

Echte Objekte

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):

mydataset


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 

 

 

Good2know

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: