Share via


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 les commandes et les scripts.

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

  • New-Object : crée un 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 virgules.
  • ConvertFrom-Json : crée des objets personnalisés définis en JavaScript Object Notation (JSON).
  • 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 que vous pouvez instancier avec 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, comme [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 traitées dans cet article :

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

Méthode statique 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, puis appuyez sur <ENTER>.

[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 permettre d’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 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 au 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 un objet DirectoryInfo directement, 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

Create 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 paramétrables.

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

Create 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 sont 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 dans le Test-Object function définissent des valeurs de variable, puis utilisent ces valeurs pour créer un objet personnalisé. Vous pouvez voir cet objet utilisé dans l’exemple de section de la rubrique d’aide sur 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 table 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 les objets standard.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Create 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 obligatoire, même si vous pouvez omettre tout 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 de 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ètres. 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