TP : Construire un mini inventaire de serveurs interactif

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

Voir la solutionMasquer la solution

É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.