{{tag>dev powershell}}
====== PowerShell : table de hachage ======
La table de hachage est proche du tableau à l'usage : elle permet de stocker un ensemble d'éléments. Cependant au lieu d'accéder aux éléments par un index, on utilise une clé : une chaîne de caractère unique associée à la valeur.
# Définit une table de hachage de 2 éléments
$computers = @{'NODE-AC31' = '192.168.0.17'; 'PC-03' = '192.168.0.21'}
# Ajouter un élément
$computers.Add('PYCOM', '192.168.0.34')
# Déterminer le nombre d'éléments
$computers.Count
3
# Supprimer un élément
$computers.Remove('PC-03')
$computers.Count
2
# Modifier un élément
$computers.'PYCOM' = '192.168.0.43'
# Rechercher une clé
$computers.ContainsKey('ATARI')
===== Itérations =====
foreach($key in $ageList.keys)
{
$message = '{0} is {1} years old' -f $key, $ageList[$key]
Write-Output $message
}
$ageList.keys | ForEach-Object{
$message = '{0} is {1} years old!' -f $_, $ageList[$_]
Write-Output $message
}
$ageList.GetEnumerator() | ForEach-Object{
$message = '{0} is {1} years old!' -f $_.key, $_.value
Write-Output $message
}
===== Passage des arguments =====
On peut utiliser les tables de hachages pour définir les paramètres d'une applet. Plutot que de fournir l'ensemble des options de la cmdlet sur une seule ligne, on peut empaqueter les différentes options dans la table de hachage et transmettre la table à la commande avec la syntaxe suivante :
$DHCPScope = @{
Name = 'TestNetwork'
StartRange = '10.0.0.2'
EndRange = '10.0.0.254'
SubnetMask = '255.255.255.0'
Description = 'Network for testlab A'
LeaseDuration = (New-TimeSpan -Days 8)
Type = "Both"
}
Add-DhcpServerV4Scope @DHCPScope
===== Créer un objet =====
Pour certains traitements, le type table de hachage n'est pas nécessaire : on souhaite simplement stocker un ensemble de valeurs et accéder aux propriétés. Dans ce cas on peut convertir la table de hachage en PSCustomObject :
$aPerson = [PSCustomObject]@{
lastname = "Doe"
age = "40"
firstname = "John"
}
# Affiche le type de $aPerson
$aPerson.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
$aPerson.firstname
John
On peut convertir à tout moment une table de hachage en objet via le transtypage :
$aPerson = @{
name = "Alix"
age = 33
}
# Renvoie Hashtable
$aPerson.GetType()
# Transtypage
$aPerson = [PSCustomObject]$aPerson
# Renvoie PSCustomObject
$aPerson.GetType()
===== Références =====
* [[https://learn.microsoft.com/fr-fr/powershell/scripting/learn/deep-dives/everything-about-hashtable?view=powershell-7.3|Tout sur les tables de hachage (Microsoft Learn)]]