105 votes

Comment créer un type personnalisé dans PowerShell à utiliser par mes scripts?

J'aimerais pouvoir définir et utiliser un type personnalisé dans certains de mes scripts PowerShell. Par exemple, supposons que j'ai besoin d'un objet ayant la structure suivante:

 Contact
{
    string First
    string Last
    string Phone
}
 

Comment pourrais-je créer ceci afin de pouvoir l'utiliser comme suit:

 function PrintContact
{
    param( [Contact]$contact )
    "Customer Name is " + $contact.First + " " + $contact.Last
    "Customer Phone is " + $contact.Phone 
}
 

Est-ce possible, ou même recommandé dans PowerShell?

160voto

Jaykul Points 6484

PowerShell Adaptatif de Type de Système ne vous permet pas de créer des types de béton, vous pouvez tester à l'encontre de la façon dont vous l'avez fait dans votre paramètre. Si vous n'avez pas besoin de ce test, vous êtes bien avec l'une des méthodes mentionnées ci-dessus.

Si vous voulez un type réel que vous pouvez exprimés pour ou type-vérifier avec, comme dans votre exemple de script ... il ne peut pas être fait sans compilation. Dans PowerShell 2, vous pouvez utiliser le bouton "Ajouter" Type de commande pour ce faire, il suffit de:

add-type @"
public struct contact {
   public string First;
   public string Last;
   public string Phone;
}
"@

Dans PowerShell 1, vous pouvez utiliser CodeDom, il y a un nouveau-struct script sur PoshCode.org qui va nous aider. Votre exemple devient:

New-Struct Contact @{
    First=[string];
    Last=[string];
    Phone=[string];
}

À l'aide de la Nouvelle-Struct script vous permettra de tester la classe dans votre param([Contact]$contact) et de faire de nouveaux à l'aide de $contact = new-object Contact et ainsi de suite...

D'ailleurs, si vous décidez que vous n'avez pas besoin d'une "vraie" classe que vous pouvez lancer et de tester contre, dans PowerShell 2.0, vous pouvez utiliser le paramètre de Propriété pour les Nouveau-Objet:

$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }

De cette façon, vous obtenez l'objet de base que vous voulez avec moins de code qu'avant. Mais vous êtes seulement un objet unique, de sorte que vous avez à exécuter du code comme ça pour chaque Contact, et vous ne pouvez pas facilement test pour voir si un objet "est" un de ces type.

58voto

Steven Murawski Points 6665

La création de types personnalisés peut être fait en PowerShell.
Kirk Munro a en fait deux grands postes qui décrivent en détail les processus de fond.

Le livre de Windows PowerShell Dans l'Action par Manning a aussi un exemple de code pour la création d'un langage spécifique au domaine pour créer des types personnalisés. Le livre est excellent tout autour, donc je vous le recommande vraiment.

Si vous êtes à la recherche d'un moyen rapide de le faire ci-dessus, vous pouvez créer une fonction pour créer l'objet personnalisé comme

function New-Person()
{
  param ($FirstName, $LastName, $Phone)

  $person = new-object PSObject

  $person | add-member -type NoteProperty -Name First -Value $FirstName
  $person | add-member -type NoteProperty -Name Last -Value $LastName
  $person | add-member -type NoteProperty -Name Phone -Value $Phone

  return $person
}

18voto

EBGreen Points 14478

C'est la méthode du raccourci:

 $myPerson = "" | Select-Object First,Last,Phone
 

9voto

Nick Meldrum Points 551

La réponse de Steven Murawski est excellente, mais j'aime bien le plus court (ou plutôt le plus précis objet de sélection au lieu d'utiliser la syntaxe add-member):

 function New-Person() {
  param ($FirstName, $LastName, $Phone)

  $person = new-object PSObject | select-object First, Last, Phone

  $person.First = $FirstName
  $person.Last = $LastName
  $person.Phone = $Phone

  return $person
}
 

4voto

David Mohundro Points 5158

Vous pouvez utiliser le concept de PSObject et Add-Member.

 $contact = New-Object PSObject

$contact | Add-Member -memberType NoteProperty -name "First" -value "John"
$contact | Add-Member -memberType NoteProperty -name "Last" -value "Doe"
$contact | Add-Member -memberType NoteProperty -name "Phone" -value "123-4567"
 

Cela produit comme:

 [8] » $contact

First                                       Last                                       Phone
-----                                       ----                                       -----
John                                        Doe                                        123-4567
 

L’autre solution (à ma connaissance) consiste à définir un type dans C # / VB.NET et à charger cet assemblage dans PowerShell pour l’utiliser directement.

Ce comportement est certainement encouragé car il permet à d'autres scripts ou sections de votre script de fonctionner avec un objet réel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X