Vor PowerShell 3
Mit dem Extensible Type System von PowerShell konnten Sie ursprünglich keine konkreten Typen erstellen, die Sie anhand der Parameter testen können. Wenn Sie diesen Test nicht benötigen, können Sie eine der anderen oben genannten Methoden anwenden.
Wenn Sie einen tatsächlichen Typ möchten, den Sie wie in Ihrem Beispielskript umwandeln oder mit dem Sie ihn überprüfen können, können Sie dies nicht tun, ohne ihn in C # oder VB.net zu schreiben und zu kompilieren. In PowerShell 2 können Sie den Befehl "Typ hinzufügen" verwenden, um dies ganz einfach zu tun:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Historischer Hinweis : In PowerShell 1 war es noch schwieriger. Sie mussten CodeDom manuell verwenden, es gibt ein sehr altes Funktions- New- Struct - Skript auf PoshCode.org, das helfen wird. Ihr Beispiel wird:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Mit Add-Type
oder New-Struct
können Sie die Klasse in Ihrer Klasse testen param([Contact]$contact)
und neue erstellen, indem Sie $contact = new-object Contact
usw. verwenden ...
In PowerShell 3
Wenn Sie keine "echte" Klasse benötigen, in die Sie umwandeln können, müssen Sie nicht die Add-Member-Methode verwenden, die Steven und andere oben demonstriert haben .
Seit PowerShell 2 können Sie den Parameter -Property für New-Object verwenden:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
In PowerShell 3 haben wir die Möglichkeit, mithilfe des PSCustomObject
Beschleunigers einen Typnamen hinzuzufügen:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Sie erhalten immer noch nur ein einzelnes Objekt. Sie sollten daher eine New-Contact
Funktion erstellen, um sicherzustellen, dass jedes Objekt gleich ausgegeben wird. Sie können jetzt jedoch leicht überprüfen, ob ein Parameter "ist" einer dieser Typen ist, indem Sie einen Parameter mit dem folgenden PSTypeName
Attribut dekorieren :
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
In PowerShell 5
In PowerShell 5 ändert sich alles und wir haben endlich class
und enum
als Sprachschlüsselwörter zum Definieren von Typen (es gibt keine, struct
aber das ist in Ordnung):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Wir haben auch eine neue Möglichkeit zum Erstellen von Objekten ohne Verwendung New-Object
: [Contact]::new()
- Wenn Sie Ihre Klasse einfach halten und keinen Konstruktor definieren, können Sie Objekte erstellen, indem Sie eine Hashtabelle umwandeln (obwohl es ohne Konstruktor keine Möglichkeit gibt um zu erzwingen, dass alle Eigenschaften festgelegt werden müssen):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}