Avant PowerShell 3
Le système de type extensible de PowerShell ne vous permettait pas à l'origine de créer des types concrets que vous pouvez tester comme vous l'avez fait dans votre paramètre. Si vous n'avez pas besoin de ce test, vous êtes d'accord avec l'une des autres méthodes mentionnées ci-dessus.
Si vous voulez un type réel avec lequel vous pouvez transtyper ou vérifier le type, comme dans votre exemple de script ... cela ne peut pas être fait sans l'écrire en C # ou VB.net et le compiler. Dans PowerShell 2, vous pouvez utiliser la commande "Add-Type" pour le faire assez simplement:
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
Note historique : dans PowerShell 1, c'était encore plus difficile. Vous deviez utiliser manuellement CodeDom, il y a un très ancienscript defonction new-struct sur PoshCode.org qui vous aidera. Votre exemple devient:
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Utiliser Add-Type
ou New-Struct
vous permettra de tester la classe dans votre param([Contact]$contact)
et d'en créer de nouvelles en utilisant $contact = new-object Contact
et ainsi de suite ...
Dans PowerShell 3
Si vous n'avez pas besoin d'une "vraie" classe dans laquelle vous pouvez effectuer un cast, vous n'avez pas besoin d'utiliser la méthode d'ajout de membre que Steven et d'autres ont démontrée ci-dessus.
Depuis PowerShell 2, vous pouvez utiliser le paramètre -Property pour New-Object:
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
Et dans PowerShell 3, nous avons la possibilité d'utiliser l' PSCustomObject
accélérateur pour ajouter un TypeName:
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
Vous n'obtenez toujours qu'un seul objet, vous devez donc créer une New-Contact
fonction pour vous assurer que chaque objet sort de la même manière, mais vous pouvez maintenant facilement vérifier qu'un paramètre "est" l'un de ces types en décorant un paramètre avec l' PSTypeName
attribut:
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
Dans PowerShell 5
Dans PowerShell 5, tout change et nous avons finalement obtenu class
etenum
tant que mots-clés de langage pour définir les types (il n'y a pas struct
mais c'est ok):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
Nous avons également une nouvelle façon de créer des objets sans utiliser New-Object
: [Contact]::new()
- en fait, si vous gardez votre classe simple et ne définissez pas de constructeur, vous pouvez créer des objets en castant une table de hachage (bien que sans constructeur, il n'y aurait aucun moyen pour garantir que toutes les propriétés doivent être définies):
class Contact
{
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}