Zum Hauptinhalt springen

Konstruktoren

Das Datetime-Objekt, das im obigen Beispiel erzeugt wurde, hatte als Startwert den 01 Januar des Jahres 01. Man kann ein neues Datetime-Objekt aber auch mit einem bestimmten Datums- und Zeitwert erzeugen. Hierfür muss man das neue Objekt initialisieren. Typen stellen hierfür Konstruktoren (abgekürzt .ctor) zur Verfügung. Konstruktoren sind nichts anderes als Methoden, die Parameter verwenden, um die Eigenschaften für das neue Objekt zu konfigurieren. Da Konstruktoren ausschließlich dafür da sind, neue Objekte zu initialisieren, verfügen nur Typen über Konstruktoren – an Objekten werden Sie Konstruktoren vergeblich suchen.

Die Parameter für den Konstruktor können Sie beim Erstellen eines Objektes mit New-Object über den Parameter -Argumentlist übergeben. Denken Sie daran – ein Konstruktor ist eine Methode, es werden also nur die Argumente übergeben. Um ein Datumobjekt mit einem definierten Datum zu erstellen, gehen Sie so vor:

New-Object -TypeName DateTime -ArgumentList 2020,05,25
> Montag, 25. Mai 2020 00:00:00

In Beispiel wird das Jahr, der Monat und der Tag übergeben. Sie können das Datetime-Objekt aber auch mit Ticks (1 Tick = 1/10.000.000 Sekunde) erstellen:

New-Object -TypeName DateTime -ArgumentList 637259616000000000
> Montag, 25. Mai 2020 00:00:00

Da es sich beim Konstruktor letztlich nur um eine Methode handelt, können Sie die Argumente auch direkt mit dem Typ übergeben:

New-Object -TypeName DateTime(637259616000000000)

 Achten Sie darauf, dass viele Typen ausschließlich Konstruktoren mit Pflicht-Parametern haben. Wenn Sie Beispielsweise versuchen, ein Powershell-Credential-Objekt zu erzeugen, ohne Argumente für den Konstruktor zu übergeben, bekommen Sie eine Fehlermeldung:

New-Object -TypeName PSCredential
> New-Object : Kein Konstruktor gefunden. Es kann kein geeigneter Konstruktor für den Typ "PSCredential" gefunden werden.
>   In Zeile:1 Zeichen:1

Diese inzwischen gar nicht mehr so kryptische Fehlermeldung besagt, dass es keinen Konstruktor gibt, der ohne Argument ein Objekt erzeugen kann. Sobald Sie alle notwendigen Argumente zum Erzeugen eines Konstruktors übergeben, erzeugt Ihnen Powershell das PSCredential-Objekt:

$Cred = ConvertTo-SecureString -String "Password" -AsPlainText -Force New-Object -TypeName PSCredential -ArgumentList ('admin',$Cred)

Das PSCredential-Objekt befindet sich übrigens eigentlich im Namespace System.Management.Automation, der zu Powershell gehört und ebenfalls nicht angegeben werden muss.

Um herauszufinden, welche Konstruktoren existieren, stellt Ihnen jeder Typ eine Method GetConstructors() bereit.

[PSCredential].GetConstructors()

Jeder Konstruktor ist eine eigene Methode mit eigenen Parametern. Sie können die Parameter jedes Konstruktors mit folgendem Skript ausgeben. Die Darstellung der Konstruktoren ähnelt den Überladungen einer Methode:

[PSCredential].GetConstructors() | 
    ForEach-Object { ($_.GetParameters() |
    ForEach-object { $_.ToString()} ) -join ', ' }

> System.String userName, System.Security.SecureString password 
> System.Management.Automation.PSObject pso

Achten Sie darauf, dass der zweite Foreach-Object hier innerhalb des ersten Foreach-Object ausgeführt wird. Der erste Foreach-Object nimmt einen Konstruktor aus der Pipeline und ruft alle Parameter mit der Methode GetParameters() ab. Die Parameter werden dann in einer Pipeline innerhalb der ersten Pipeline weiterverarbeitet, die die Parameter für jedes Konstruktor in Strings konvertiert und mit einem ', ' zusammenfasst.

Am einfachsten können Sie sich die Konstruktoren anzeigen lassen, indem Sie auf die New()-Methode eines Typen zugreifen. New() erzeugt ein neues Objekt und stellt Überladungen (in Powershell würde man Parametersätze sagen) für jeden Konstruktor bereit. Wie bei Methoden üblich, gibt Powershell Ihnen alle Überladungen der Methode zurück.

[PSCredential]::new
> OverloadDefinitions
>     pscredential new(string userName, securestring password) 
>     pscredential new(psobject pso)
 
[PSCredential].GetConstructors() | ForEach-Object { ($_.GetParameters() |
ForEach-object { $_.ToString()} ) -join ', '
}

System.String userName, System.Security.SecureString password System.Management.Automation.PSObject pso