Sophie pose un dernier ticket avant la pause : « Sur le papier, j’ai une liste de serveurs avec leurs caractéristiques. Fais-en un petit script qui me permet de chercher un serveur par son nom, et qui m’affiche proprement ses infos. »
Objectif
Combiner variables, tableau de hashtables, Read-Host et Write-Host/Write-Output pour construire un mini-script interactif — sans boucle foreach ni if complexe : on reste sur ce qui a été vu jusqu’à la section 3 (un if simple est toléré si vous vous sentez à l’aise, mais pas obligatoire).
Consignes
Étape 1 — Créez un tableau de hashtables nommé $parcServeurs, contenant au moins 3 serveurs, chacun avec les clés Nom, RAM_Go et Critique (booléen).
Indice : revoyez la leçon 3.3, section « Un tableau de hashtables ».
Étape 2 — Avec Read-Host, demandez à l’utilisateur quel serveur il recherche, et stockez la réponse dans une variable $recherche.
Étape 3 — Parcourez $parcServeurs avec foreach, et pour le serveur dont le Nom correspond à $recherche, affichez ses informations avec Write-Output, sous la forme :
"SRV-01 : 16 Go de RAM - Critique : True"
Indice : revoyez la leçon 3.2, section « Parcourir un tableau », et utilisez l’interpolation de chaîne vue en 3.1 ("$($srv.Nom)").
Étape 4 — Avant d’afficher le résultat, affichez un message avec Write-Host en jaune : "Recherche en cours...". Vérifiez ensuite que ce message n’apparaît pas si vous stockez le résultat du script dans une variable.
Indice : revoyez la leçon 3.4, la différence entre Write-Host et Write-Output.
Étape 5 (bonus) — Si aucun serveur ne correspond à la recherche, affichez un message clair plutôt que de ne rien afficher du tout.
Solution commentée
Étapes 1 à 4 :
$parcServeurs = @(
@{ Nom = "SRV-01"; RAM_Go = 16; Critique = $true },
@{ Nom = "SRV-02"; RAM_Go = 8; Critique = $false },
@{ Nom = "SRV-03"; RAM_Go = 32; Critique = $true }
)
$recherche = Read-Host "Quel serveur recherchez-vous ?"
Write-Host "Recherche en cours..." -ForegroundColor Yellow
foreach ($srv in $parcServeurs) {
if ($srv.Nom -eq $recherche) {
Write-Output "$($srv.Nom) : $($srv.RAM_Go) Go de RAM - Critique : $($srv.Critique)"
}
}
Points clés :
Write-Host "Recherche en cours..." s’affiche toujours à l’écran, mais si vous testez $resultat = .\script.ps1, ce message apparaîtra quand même dans la console (car c’est son rôle), alors que $resultat ne contiendra que la ligne produite par Write-Output.$($srv.Nom) : les parenthèses autour de $srv.Nom dans une chaîne entre guillemets doubles permettent d’accéder à une propriété d’objet en interpolation — sans elles, PowerShell afficherait littéralement $srv.Nom au lieu de la valeur.
Étape 5 (bonus) :
$trouve = $false
foreach ($srv in $parcServeurs) {
if ($srv.Nom -eq $recherche) {
Write-Output "$($srv.Nom) : $($srv.RAM_Go) Go de RAM - Critique : $($srv.Critique)"
$trouve = $true
}
}
if (-not $trouve) {
Write-Output "Aucun serveur nommé '$recherche' trouvé dans le parc."
}
On utilise une variable $trouve comme « témoin » : elle passe à $true uniquement si un serveur correspondant a été rencontré dans la boucle. C’est une logique très courante, qu’on retrouvera sous une forme plus élégante avec les fonctions et le try/catch en section 5.
Ce TP est volontairement un peu plus long que les précédents : il combine presque tout ce qui a été vu depuis le début de la section 3. Si l’étape 5 vous a paru difficile, ce n’est pas grave du tout — la logique conditionnelle complète sera reprise en détail dès la prochaine section.