Klassendefinition in PowerShell 5.0 mit dem neuen Schlüsselwort "class"

In der kommenden Version der PowerShell lassen sich Klassen direkt in der PowerShell-Skirptsprachensyntax definieren.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg

In der kommenden Version der PowerShell lassen sich Klassen direkt in der PowerShell-Skirptsprachensyntax definieren.

Viele Windows PowerShell-Nutzer, insbesondere solche, die auch als Entwickler mit objektorientierten Sprachen arbeiten, vermissten in der Windows PowerShell bisher die Möglichkeit, eigene Klassen direkt in der PowerShell-Skriptsprachensyntax zu definieren. Bisher musste man dafür auf die Syntax von C# oder Visual Basic .NET zurückgreifen, die man in PowerShell-Skripte einbetten kann.

Die PowerShell-Version 5.0 bringt nun die vermissten Sprachfeatures. Die am 4.9.2014 erschienene zweite Vorabversion der PowerShell 5.0 bietet das neue Schlüsselwort Class. Das folgende Beispiel zeigt einige typische Einsatzszenarien wie statische Mitglieder, Instanzmitglieder, Konstruktor und Methoden sowie das Instanziieren der Klasse.

Zu beachten ist, dass es in der Vorabversion noch einige Einschränkungen gibt, z.B.:

  • Alle Klassenmitglieder sind öffentlich.
  • Konstruktoren können sich nicht gegenseitig aufrufen.
  • Die Instanziierung mit dem Commandlets New-Object führt zu Problemen bei der Nutzung der Objekte (Fehler: The ThreadLocal object has been disposed).
Download
# Definition einer Klasse
class Benutzer
{
# Statische Mitglieder
static [Int64] $Anzahl
# Instanzmitglieder
[string] $Benutzername
[int32] $ID
[DateTime] $Datum

# Interne Methode, die man aber in der aktuellen Version nicht verstecken kann
[void] Init([int32] $neueid)
{
$id = $neueid
"Neuer Benutzer erzeugt!"
}

# Konstruktor 1: parameterlos
Benutzer()
{
[Benutzer]::Anzahl = [Benutzer]::Anzahl + 1
$this.Init([Benutzer]::Anzahl)
}

# Konstruktor 2: mit Parameter
Benutzer($neueid)
{
$this.Init($neueid)
}

# öffentliche Methode
[string] GetInfo([bool] $mitDatum)
{
if ($mitDatum) {
return "$($ID): $benutzername wurde am
$($Datum.ToShortDateString()) als Benutzer angelegt."
}
else
{
return "$($ID): $benutzername"
}
}
}
# Objketinstanziierung
$b = [Benutzer]::new(123) # new-object Benutzer führt noch zu Fehler bei Methodenausführung!

# Befüllen des Objekts
$b.Benutzername = "Holger Schwichtenberg"
$b.Datum = Get-Date "8.9.2014"

# Ausgaben
$b.Datum
$b.GetInfo($true) ()