3.3 : Hashtables : l’étiquette avec les caractéristiques

Dans un tableau, chaque pièce est repérée par sa position ($serveurs[0], $serveurs[1]…). Sophie fronce les sourcils : « Et si je te demande la RAM de SRV-02 sans savoir à quel index il se trouve ? Tu vas devoir chercher pièce par pièce. » Elle a raison — et c’est exactement le problème que résout la hashtable : chaque pièce est identifiée par une étiquette, pas par sa position.

Créer une hashtable

Une hashtable stocke des paires clé / valeur, avec la syntaxe @{ } :

$serveur = @{
    Nom     = "SRV-01"
    RAM_Go  = 16
    Critique = $true
}

Contrairement au tableau, l’ordre de stockage n’a ici aucune importance : ce qui compte, c’est la clé.

Accéder à une valeur par sa clé

$serveur["Nom"]
$serveur.Nom

Les deux syntaxes fonctionnent, notation entre crochets ou notation avec un point — vous choisirez celle que vous préférez, les scripts Nordika utilisent les deux selon les habitudes de chacun.

Ajouter, modifier, supprimer une entrée

$serveur["Emplacement"] = "Salle serveur - Baie 3"   # Ajout
$serveur["RAM_Go"] = 32                               # Modification
$serveur.Remove("Critique")                           # Suppression

Parcourir une hashtable

foreach ($cle in $serveur.Keys) {
    Write-Output "$cle : $($serveur[$cle])"
}

Vous avez déjà croisé une hashtable, sans le savoir

Souvenez-vous du TP de la section 2, pour formater la mémoire en Mo :

Select-Object -Property ProcessName, @{Name="RAM_Mo"; Expression={ [math]::Round($_.WS / 1MB, 1) }}

Ce @{Name="..."; Expression={...}} est… une hashtable. C’est la syntaxe que PowerShell utilise pour définir une propriété calculée : la clé Name donne le nom de la colonne, la clé Expression contient le calcul à exécuter. Maintenant que vous connaissez les hashtables, cette ligne devrait vous sembler beaucoup moins mystérieuse qu’à l’époque.

Un tableau de hashtables : la structure la plus utile au quotidien

En combinant les deux notions vues dans cette section, on obtient une structure très puissante : une liste d’objets, chacun avec ses propres caractéristiques nommées.

$parcSophie = @(
    @{ Nom = "SRV-01"; RAM_Go = 16; Critique = $true },
    @{ Nom = "SRV-02"; RAM_Go = 8;  Critique = $false }
)

foreach ($srv in $parcSophie) {
    Write-Output "$($srv.Nom) - $($srv.RAM_Go) Go - Critique: $($srv.Critique)"
}

C’est exactement ce type de structure qu’on manipulera en section 5 pour créer des comptes utilisateurs en masse à partir d’un fichier CSV : chaque ligne du fichier devient une hashtable, avec ses propres clés (Nom, Prenom, Service…).

Retenez la nuance simple entre les deux casiers de l’atelier : le tableau range des pièces par position (première, deuxième, troisième…), la hashtable range des pièces par étiquette (Nom, RAM, Critique…). Les deux se combinent très souvent dans un même script.

Dans la prochaine leçon, on apprend à communiquer avec l’utilisateur du script : afficher des messages avec Write-Host et Write-Output, et demander une saisie avec Read-Host.