Share via


about_Hash_Tables

Description courte

Décrit comment créer, utiliser et trier des tables de hachage dans PowerShell.

Description longue

Une table de hachage, également appelée dictionnaire ou tableau associatif, est une structure de données compacte qui stocke une ou plusieurs paires clé-valeur. Par exemple, une table de hachage peut contenir une série d’adresses IP et de noms d’ordinateurs, où les adresses IP sont les clés et les noms d’ordinateurs sont les valeurs, ou inversement.

Dans PowerShell, chaque table de hachage est un Hashtable[System.Collections.Hashtable] objet. Vous pouvez utiliser les propriétés et les méthodes des Hashtable objets dans PowerShell.

À partir de PowerShell 3.0, vous pouvez utiliser l’attribut [ordered] pour créer un [System.Collections.Specialized.OrderedDictionary] objet dans PowerShell.

Les dictionnaires triés diffèrent des tables de hachage en ce que les clés apparaissent toujours dans l’ordre dans lequel vous les répertoriez. L’ordre des clés dans une table de hachage n’est pas déterminé.

Les clés et la valeur dans les tables de hachage sont également des objets .NET. Il s’agit le plus souvent de chaînes ou d’entiers, mais ils peuvent avoir n’importe quel type d’objet. Vous pouvez également créer des tables de hachage imbriquées, dans lesquelles la valeur d’une clé est une autre table de hachage.

Hashtablesont fréquemment utilisés, car ils sont efficaces pour rechercher et récupérer des données. Vous pouvez utiliser des tables de hachage pour stocker des listes et créer des propriétés calculées dans PowerShell. De plus, PowerShell a une applet de commande, ConvertFrom-StringData, qui convertit les chaînes en table de hachage.

Syntax

La syntaxe d’une table de hachage est la suivante :

@{ <name> = <value>; [<name> = <value> ] ...}

La syntaxe d’un dictionnaire ordonné est la suivante :

[ordered]@{ <name> = <value>; [<name> = <value> ] ...}

L’accélérateur [ordered] de type a été introduit dans PowerShell 3.0.

Création de tables de hachage

Pour créer une table de hachage, suivez ces instructions :

  • Commencez la table de hachage par un au signe (@).
  • Enfermez la table de hachage dans des accolades ({}).
  • Entrez une ou plusieurs paires clé-valeur pour le contenu de la table de hachage.
  • Utilisez un signe égal (=) pour séparer chaque clé de sa valeur.
  • Utilisez un point-virgule (;) ou un saut de ligne pour séparer les paires clé-valeur.
  • Les clés qui contiennent des espaces doivent être placées entre guillemets. Les valeurs doivent être des expressions PowerShell valides. Les chaînes doivent apparaître entre guillemets, même si elles n’incluent pas d’espaces.
  • Pour gérer la table de hachage, enregistrez-la dans une variable.
  • Lorsque vous affectez une table de hachage ordonnée à une variable, placez le [ordered] type avant le @ symbole. Si vous le placez avant le nom de la variable, la commande échoue.

Pour créer une table de hachage vide dans la valeur de $hash, tapez :

$hash = @{}

Vous pouvez également ajouter des clés et des valeurs à une table de hachage lorsque vous la créez. Par exemple, l’instruction suivante crée une table de hachage avec trois clés.

$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

Création de dictionnaires triés

Vous pouvez créer un dictionnaire ordonné en ajoutant un objet du OrderedDictionary type, mais le moyen le plus simple de créer un dictionnaire ordonné est d’utiliser l’attribut [ordered] .

L’attribut [ordered] est introduit dans PowerShell 3.0.

Placez l’attribut immédiatement avant le symbole « @ ».

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Vous pouvez utiliser des dictionnaires triés de la même manière que vous utilisez des tables de hachage. Les deux types peuvent être utilisés comme valeur de paramètres qui prennent une table de hachage ou un dictionnaire (iDictionary).

Vous ne pouvez pas utiliser l’attribut [ordered] pour convertir ou caster une table de hachage. Si vous placez l’attribut ordonné avant le nom de la variable, la commande échoue avec le message d’erreur suivant.

[ordered]$hash = @{}
ParserError:
Line |
   1 |  [ordered]$hash = @{}
     |  ~~~~~~~~~~~~~~
     | The ordered attribute can be specified only on a hash literal node.

Pour corriger l’expression, déplacez l’attribut [ordonné].

$hash = [ordered]@{}

Vous pouvez convertir un dictionnaire ordonné en une table de hachage, mais vous ne pouvez pas récupérer l’attribut ordonné, même si vous effacez la variable et entrez de nouvelles valeurs. Pour rétablir l’ordre, vous devez supprimer et recréer la variable.

[hashtable]$hash = [ordered]@{
  Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name                           Value
----                           -----
Color                          Blue
Shape                          Square
Number                         1

Affichage des tables de hachage

Pour afficher une table de hachage enregistrée dans une variable, tapez le nom de la variable. Par défaut, une table de hachage s’affiche sous la forme d’une table avec une colonne pour les clés et une colonne pour les valeurs.

$hash
Name                           Value
----                           -----
Shape                          Square
Color                          Blue
Number                         1

Les tables de hachage ont des propriétés Clés et Valeurs . Utilisez la notation par points pour afficher toutes les clés ou toutes les valeurs.

$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue

Chaque nom de clé est également une propriété de la table de hachage et sa valeur est la valeur de la propriété nom de clé. Utilisez le format suivant pour afficher les valeurs de propriété.

$hashtable.<key>
<value>

Par exemple :

$hash.Number
1

$hash.Color
Blue

Les tables de hachage ont une propriété Count qui indique le nombre de paires clé-valeur dans la table de hachage.

$hash.count
3

Les tables de table de hachage ne sont pas des tableaux. Vous ne pouvez donc pas utiliser d’entier comme index dans la table de hachage, mais vous pouvez utiliser un nom de clé pour l’indexer dans la table de hachage. Si la clé est une valeur de chaîne, placez le nom de la clé entre guillemets.

Par exemple :

$hash["Number"]
1

Gestion des collisions de noms de propriété

Si le nom de clé entre en collision avec l’un des noms de propriété du type HashTable, vous pouvez utiliser le membre intrinsèquepsbase pour accéder à ces propriétés. Par exemple, si le nom de la clé est keys et que vous souhaitez retourner la collection des clés HashTable , utilisez la syntaxe suivante :

$hashtable.psbase.Keys

Cela s’applique à d’autres types qui implémentent l’interface System.Collections.IDictionary , comme OrderedDictionary.

Itération sur les clés et les valeurs

Vous pouvez itérer sur les clés d’une table de hachage pour traiter les valeurs de plusieurs manières. Chacun des exemples de cette section a une sortie identique. Ils itèrent sur la $hash variable définie ici :

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Notes

Dans ces exemples, $hash est défini comme un dictionnaire ordonné pour garantir que la sortie est toujours dans le même ordre. Ces exemples fonctionnent de la même façon pour les tables de hachage normales, mais l’ordre de la sortie n’est pas prévisible.

Chaque exemple retourne un message pour chaque clé et sa valeur :

The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue

Cet exemple utilise un bloc foreach pour itérer sur les clés.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

Cet exemple utilise ForEach-Object pour itérer sur les clés.

$hash.Keys | ForEach-Object {
    "The value of '$_' is: $($hash[$_])"
}

Cet exemple utilise la méthode GetEnumerator pour envoyer chaque paire clé-valeur via le pipeline à ForEach-Object.

$hash.GetEnumerator() | ForEach-Object {
    "The value of '$($_.Key)' is: $($_.Value)"
}

Cet exemple utilise les méthodes GetEnumerator et ForEach pour itérer sur chaque paire clé-valeur.

$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})

Ajout et suppression de clés et de valeurs

Pour ajouter des clés et des valeurs à une table de hachage, utilisez le format de commande suivant.

$hash["<key>"] = "<value>"

Par exemple, pour ajouter une clé « Heure » avec la valeur « Now » à la table de hachage, utilisez le format d’instruction suivant.

$hash["Time"] = "Now"

Vous pouvez également ajouter des clés et des valeurs à une table de hachage à l’aide de la Add méthode de l’objet System.Collections.Hashtable . La Add méthode a la syntaxe suivante :

Add(Key, Value)

Par exemple, pour ajouter une Time clé avec une valeur à la table de Now hachage, utilisez le format d’instruction suivant.

$hash.Add("Time", "Now")

Vous pouvez également ajouter des clés et des valeurs à une table de hachage à l’aide de l’opérateur d’ajout (+) pour ajouter une table de hachage à une table de hachage existante. Par exemple, l’instruction suivante ajoute une Time clé avec une valeur de à la table de Now hachage dans la $hash variable.

$hash = $hash + @{Time="Now"}

Vous pouvez également ajouter des valeurs stockées dans des variables.

$t = "Today"
$now = (Get-Date)

$hash.Add($t, $now)

Vous ne pouvez pas utiliser un opérateur de soustraction pour supprimer une paire clé-valeur d’une table de hachage, mais vous pouvez utiliser la méthode Remove de l’objet Hashtable . La méthode Remove prend la clé comme valeur.

La Remove méthode a la syntaxe suivante :

Remove(Key)

Par exemple, pour supprimer la Time=Now paire clé-valeur de la table de hachage dans la valeur de la $hash variable, tapez :

$hash.Remove("Time")

Vous pouvez utiliser toutes les propriétés et méthodes des Hashtable objets dans PowerShell, notamment Contains, Clear, Cloneet CopyTo. Pour plus d’informations sur Hashtable les objets, consultez System.Collections.Hashtable.

Types d’objets dans HashTables

Les clés et les valeurs d’une table de hachage peuvent avoir n’importe quel type d’objet .NET, et une seule table de hachage peut avoir des clés et des valeurs de plusieurs types.

L’instruction suivante crée une table de hachage de chaînes de noms de processus et de valeurs d’objet de processus et l’enregistre dans la $p variable.

$p = @{
    "PowerShell" = (Get-Process PowerShell)
    "Notepad" = (Get-Process notepad)
}

Vous pouvez afficher la table de hachage dans $p et utiliser les propriétés key-name pour afficher les valeurs.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)

PS> $p.PowerShell

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    441      24    54196      54012   571     5.10   1788 PowerShell

PS> $p.keys | ForEach-Object {$p.$_.handles}
441
251

Les clés d’une table de hachage peuvent être n’importe quel type .NET. L’instruction suivante ajoute une paire clé-valeur à la table de hachage dans la $p variable. La clé est un objet Service qui représente le service WinRM et la valeur est la status actuelle du service.

$p = $p + @{
    (Get-Service WinRM) = ((Get-Service WinRM).Status)
}

Vous pouvez afficher la nouvelle paire clé-valeur et y accéder à l’aide des mêmes méthodes que celles que vous utilisez pour d’autres paires dans la table de hachage.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

PS> $p.keys
PowerShell
Notepad

Status   Name               DisplayName
------   ----               -----------
Running  winrm              Windows Remote Management (WS-Manag...

PS> $p.keys | ForEach-Object {$_.name}
WinRM

Les clés et les valeurs d’une table de hachage peuvent également être Hashtable des objets. L’instruction suivante ajoute une paire clé-valeur à la table de hachage dans la $p variable dans laquelle la clé est une chaîne, Hash2, et la valeur est une table de hachage avec trois paires clé-valeur.

$p = $p + @{
    "Hash2"= @{a=1; b=2; c=3}
}

Vous pouvez afficher les nouvelles valeurs et y accéder à l’aide des mêmes méthodes.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Hash2                          {[b, 2], [c, 3], [a, 1]}
WinRM                          Running
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.Hash2

Name                           Value
----                           -----
b                              2
c                              3
a                              1

PS> $p.Hash2.b
2

Tri des clés et des valeurs

Les éléments d’une table de hachage sont intrinsèquement non triés. Les paires clé-valeur peuvent apparaître dans un ordre différent chaque fois que vous les affichez.

Bien que vous ne puissiez pas trier une table de hachage, vous pouvez utiliser la méthode GetEnumerator des tables de hachage pour énumérer les clés et les valeurs, puis utiliser l’applet Sort-Object de commande pour trier les valeurs énumérées pour l’affichage.

Par exemple, les commandes suivantes énumèrent les clés et les valeurs de la table de hachage dans la $p variable, puis trient les clés par ordre alphabétique.

PS> $p.GetEnumerator() | Sort-Object -Property key

Name                           Value
----                           -----
Hash2                          {[b, 2], [c, 3], [a, 1]}
Notepad                        System.Diagnostics.Process (Notepad)
PowerShell                     System.Diagnostics.Process (pwsh)
WinRM                          Running

La commande suivante utilise la même procédure pour trier les valeurs de hachage dans l’ordre décroissant.

PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)
Hash2                          {[b, 2], [c, 3], [a, 1]}
WinRM                          Running

Création d’objets à partir de tables de hachage

À partir de PowerShell 3.0, 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 qui n’a aucun paramètre. Les propriétés de l’objet doivent être publiques et paramétrables.

Pour plus d’informations, consultez about_Object_Creation.

ConvertFrom-StringData

L’applet ConvertFrom-StringData de commande convertit une chaîne ou une chaîne ici de paires clé-valeur en table de hachage. Vous pouvez utiliser l’applet ConvertFrom-StringData de commande en toute sécurité dans la section Données d’un script, et vous pouvez l’utiliser avec l’applet Import-LocalizedData de commande pour afficher les messages utilisateur dans la culture de l’interface utilisateur de l’utilisateur actuel.

Les chaînes ci-dessous sont particulièrement utiles lorsque les valeurs de la table de hachage incluent des guillemets. Pour plus d’informations sur les chaînes here, consultez about_Quoting_Rules.

L’exemple suivant montre comment créer une chaîne de here-string des messages utilisateur dans l’exemple précédent et comment les utiliser ConvertFrom-StringData pour les convertir d’une chaîne en table de hachage.

La commande suivante crée une chaîne ici des paires clé-valeur, puis l’enregistre dans la $string variable .

$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@

Cette commande utilise l’applet ConvertFrom-StringData de commande pour convertir la chaîne ici en table de hachage.

ConvertFrom-StringData $string

Name                           Value
----                           -----
Msg3                           Enter an alias (or "nickname").
Msg2                           She said, "Hello, World."
Msg1                           Type "Windows".

Pour plus d’informations sur les chaînes here, consultez about_Quoting_Rules.

Voir aussi