Prima di PowerShell 3
Il sistema di tipi estensibili di PowerShell originariamente non ti consentiva di creare tipi concreti che puoi testare nel modo in cui hai fatto nel tuo parametro. Se non hai bisogno di quel test, stai bene con uno degli altri metodi sopra menzionati.
Se si desidera un tipo effettivo a cui eseguire il cast o il controllo del tipo, come nel proprio script di esempio ... non è possibile farlo senza scriverlo in C # o VB.net e compilare. In PowerShell 2, puoi utilizzare il comando "Add-Type" per farlo in modo abbastanza semplice:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Nota storica : in PowerShell 1 era ancora più difficile. Dovevi usare manualmente CodeDom, c'è una vecchia funzione new-struct script su PoshCode.org che ti aiuterà. Il tuo esempio diventa:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Usare Add-Type
o New-Struct
ti permetterà di testare effettivamente la classe nel tuo param([Contact]$contact)
e crearne di nuovi usando $contact = new-object Contact
e così via ...
In PowerShell 3
Se non hai bisogno di una classe "reale" a cui puoi eseguire il cast, non devi usare il modo di aggiungere membri che Steven e altri hanno dimostrato sopra.
Da PowerShell 2 è possibile utilizzare il parametro -Property per New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
E in PowerShell 3, abbiamo la possibilità di utilizzare l' PSCustomObject
acceleratore per aggiungere un TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Stai ancora ottenendo solo un singolo oggetto, quindi dovresti creare una New-Contact
funzione per assicurarti che ogni oggetto risulti uguale, ma ora puoi facilmente verificare un parametro "è" uno di quei tipi decorando un parametro con l' PSTypeName
attributo:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
In PowerShell 5
In PowerShell 5 tutto cambia e finalmente abbiamo class
e enum
come parole chiave della lingua per la definizione dei tipi (non c'è struct
ma va bene):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Abbiamo anche un nuovo modo di creare oggetti senza usare New-Object
: [Contact]::new()
- infatti, se mantieni la tua classe semplice e non definisci un costruttore, puoi creare oggetti eseguendo il casting di una tabella hash (sebbene senza un costruttore, non ci sarebbe modo per imporre che tutte le proprietà devono essere impostate):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}