about_Object_Creation

Description courte

Explique comment créer des objets dans PowerShell.

Description longue

Vous pouvez créer des objets dans PowerShell et utiliser les objets que vous créez dans des commandes et des scripts.

Il existe de nombreuses façons de créer des objets, cette liste n’est pas définitive :

  • New-Object : crée une instance d’un objet .NET Framework ou d’un objet COM.
  • Import-Csv/ConvertFrom-CSV : crée des objets personnalisés (PSCustomObject) à partir des éléments définis en tant que valeurs séparées par des caractères.
  • ConvertFrom-Json : crée des objets personnalisés définis dans json (JavaScript Object Notation).
  • ConvertFrom-StringData : crée des objets personnalisés définis en tant que paires clé-valeur.
  • Add-Type : vous permet de définir une classe dans votre session PowerShell avec laquelle vous pouvez instancier New-Object.
  • New-Module : le paramètre AsCustomObject crée un objet personnalisé que vous définissez à l’aide du bloc de script.
  • Add-Member : ajoute des propriétés à des objets existants. Vous pouvez utiliser Add-Member pour créer un objet personnalisé à partir d’un type simple, par exemple [System.Int32].
  • Select-Object : sélectionne les propriétés d’un objet. Vous pouvez utiliser Select-Object pour créer des propriétés personnalisées et calculées sur un objet déjà instancié.

Les méthodes supplémentaires suivantes sont abordées dans cet article :

  • En appelant le constructeur d’un type à l’aide d’une méthode statique new()
  • Par typecasting tables de hachage des noms de propriétés et des valeurs de propriété

Méthode static new()

Tous les types .NET ont une new() méthode qui vous permet de construire des instances plus facilement. Vous pouvez également voir tous les constructeurs disponibles pour un type donné.

Pour afficher les constructeurs d’un type, spécifiez le nom de la new méthode après le nom du type et appuyez <ENTER>sur .

[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)

À présent, vous pouvez créer un System.Uri en spécifiant le constructeur approprié.

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

Vous pouvez utiliser l’exemple suivant pour déterminer quels types .NET sont actuellement chargés pour vous instancier.

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

Les objets créés à l’aide de la new() méthode peuvent ne pas avoir les mêmes propriétés que les objets du même type que ceux créés par les applets de commande PowerShell. Les applets de commande PowerShell, les fournisseurs et le système de type étendu peuvent ajouter des propriétés supplémentaires à l’instance.

Par exemple, le fournisseur FileSystem dans PowerShell ajoute six valeurs NoteProperty à l’objet DirectoryInfo retourné par Get-Item.

$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    6 NoteProperty
    1 ScriptProperty
   18 Method

Lorsque vous créez directement un objet DirectoryInfo , il n’a pas ces six valeurs NoteProperty .

$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    1 ScriptProperty
   18 Method

Pour plus d’informations sur le système de type étendu, consultez about_Types.ps1xml.

Cette fonctionnalité a été ajoutée dans PowerShell 5.0

Créer des objets à partir de tables de hachage

Vous pouvez créer un objet à partir d’une table de hachage de propriétés et de valeurs de propriété.

La syntaxe est la suivante :

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Cette méthode fonctionne uniquement pour les classes qui ont un constructeur sans paramètre. Les propriétés de l’objet doivent être publiques et définies.

Cette fonctionnalité a été ajoutée dans PowerShell version 3.0

Créer des objets personnalisés à partir de tables de hachage

Les objets personnalisés sont très utiles et sont faciles à créer à l’aide de la méthode de table de hachage. La classe PSCustomObject est conçue spécifiquement à cet effet.

Les objets personnalisés constituent un excellent moyen de retourner une sortie personnalisée à partir d’une fonction ou d’un script. Cela est plus utile que de retourner une sortie mise en forme qui ne peut pas être reformatée ou redirigée vers d’autres commandes.

Les commandes de l’ensemble Test-Object function de certaines valeurs de variable, puis utilisent ces valeurs pour créer un objet personnalisé. Vous pouvez voir cet objet en cours d’utilisation dans l’exemple de section de la rubrique d’aide de l’applet Update-Help de commande.

function Test-Object {
  $ModuleName = "PSScheduledJob"
  $HelpCulture = "en-us"
  $HelpVersion = "3.1.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
  $ModuleName = "PSWorkflow"
  $HelpCulture = "en-us"
  $HelpVersion = "3.0.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
}
Test-Object

La sortie de cette fonction est une collection d’objets personnalisés mis en forme sous forme de tableau par défaut.

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

Les utilisateurs peuvent gérer les propriétés des objets personnalisés comme ils le font avec des objets standard.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Les objets de type PSObject conservent la liste des membres dans l’ordre dans lequel les membres ont été ajoutés à l’objet. Même si les objets de table de hachage ne garantissent pas l’ordre des paires clé-valeur, la conversion d’une table de hachage littérale pour [pscustomobject] maintenir l’ordre.

La table de hachage doit être un littéral. Si vous encapsulez la table de hachage entre parenthèses ou si vous cassez une variable contenant une table de hachage, il n’existe aucune garantie que l’ordre est conservé.

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

Créer des objets non personnalisés à partir de tables de hachage

Vous pouvez également utiliser des tables de hachage pour créer des objets pour des classes non personnalisées. Lorsque vous créez un objet pour une classe non personnalisée, le nom de type qualifié d’espace de noms est requis, même si vous pouvez omettre n’importe quel composant d’espace de noms système initial.

Par exemple, la commande suivante crée un objet d’option de session.

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

Les exigences de la fonctionnalité de table de hachage, en particulier l’exigence du constructeur sans paramètre, éliminent de nombreuses classes existantes. Toutefois, la plupart des classes d’options PowerShell sont conçues pour fonctionner avec cette fonctionnalité, ainsi que d’autres classes très utiles, telles que la classe ProcessStartInfo.

[System.Diagnostics.ProcessStartInfo]@{
  CreateNoWindow="$true"
  Verb="run as"
}
Arguments               :
ArgumentList            : {}
CreateNoWindow          : True
EnvironmentVariables    : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
                           CommonProgramFiles(x86), APPDATA...}
Environment             : {[OneDriveConsumer, C:\Users\user1\OneDrive],
                           [PROCESSOR_ARCHITECTURE, AMD64],
                           [CommonProgramFiles(x86),
                           C:\Program Files (x86)\Common Files],
                           [APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
...

Vous pouvez également utiliser la fonctionnalité de table de hachage lors de la définition de valeurs de paramètre. Par exemple, la valeur du paramètre SessionOption du New-PSSession. l’applet de commande peut être une table de hachage.

New-PSSession -ComputerName Server01 -SessionOption @{
  IdleTimeout=43200000
  SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
  Frequency="Daily"
  At="15:00"
}

Objets génériques

Vous pouvez également créer des objets génériques dans PowerShell. Les génériques sont des classes, des structures, des interfaces et des méthodes qui possèdent des espaces réservés (ou paramètres de type) pour un ou plusieurs des types qu'ils stockent ou utilisent.

L’exemple suivant crée un objet Dictionary .

$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One     1

Pour plus d’informations sur les génériques, consultez Génériques dans .NET.

Voir aussi