Sophie s’arrête devant un poste où un script vient de planter. « Regarde cette ligne : le développeur a utilisé Write-Host pour afficher un résultat, puis a essayé de le récupérer dans une variable plus loin. Ça n’a jamais fonctionné, et il a mis une heure à comprendre pourquoi. » C’est l’un des pièges les plus classiques de PowerShell, et il mérite qu’on s’y arrête.
Write-Output : reposer une pièce sur le tapis roulant
Write-Output envoie un objet dans le pipeline. Ce que vous « écrivez » peut donc être capturé, redirigé, transformé par la cmdlet suivante :
function Get-Salutation {
Write-Output "Bonjour depuis Nordika"
}
$message = Get-Salutation # $message contient bien le texteEn réalité, dans une fonction ou un script, Write-Output est même souvent implicite : écrire juste "Bonjour depuis Nordika" sans la cmdlet produit exactement le même résultat, car PowerShell renvoie automatiquement tout ce qui n’est pas explicitement capturé ou redirigé ailleurs.
Write-Host : afficher à l’écran, et rien d’autre
Write-Host affiche directement dans la console, avec parfois des options de couleur — mais ne renvoie jamais rien dans le pipeline :
function Get-Salutation {
Write-Host "Bonjour depuis Nordika" -ForegroundColor Green
}
$message = Get-Salutation # $message est vide ($null) !C’est exactement le piège rencontré par le développeur du script en panne : Write-Host est parfait pour un message purement visuel destiné à un humain (une progression, une couleur d’alerte), mais catastrophique si vous comptez réutiliser cette valeur ensuite dans le script.
Règle simple à retenir : si le résultat doit pouvoir être réutilisé (stocké, transmis, transformé), utilisez
Write-Output(ou rien du tout). Si le message est uniquement destiné à l’œil de l’utilisateur à l’écran,Write-Hostconvient.
Les autres niveaux de message
Pour structurer les messages d’un script un peu sérieux, PowerShell propose plusieurs cmdlets dédiées, chacune avec son propre flux :
Write-Verbose "Connexion au serveur SRV-01 en cours..."
Write-Warning "Le service Spooler est arrêté sur SRV-02"
Write-Error "Impossible de joindre SRV-03"Write-Verbose: n’affiche rien par défaut, sauf si le script est lancé avec le paramètre-Verbose— pratique pour du détail optionnel sans polluer une exécution normaleWrite-Warning: toujours affiché, en jaune, pour signaler un point d’attention sans bloquer le scriptWrite-Error: signale une erreur (on détaille la gestion complète des erreurs en section 5)
Read-Host : demander une information à l’utilisateur
À l’inverse, Read-Host met le script en pause et attend une saisie au clavier :
$nomServeur = Read-Host "Sur quel serveur voulez-vous intervenir ?"
Write-Output "Intervention prévue sur : $nomServeur"Pour un mot de passe ou une donnée sensible, l’option -AsSecureString masque la saisie à l’écran et la stocke sous une forme sécurisée :
$motDePasse = Read-Host "Mot de passe du compte de service" -AsSecureStringUn exemple concret Nordika
$serveur = Read-Host "Quel serveur souhaitez-vous redémarrer ?"
Write-Warning "Vous êtes sur le point de redémarrer $serveur"
$confirmation = Read-Host "Confirmer ? (O/N)"
if ($confirmation -eq "O") {
Write-Verbose "Redémarrage de $serveur en cours..." -Verbose
Write-Output "Redémarrage confirmé pour $serveur"
} else {
Write-Output "Opération annulée"
}(Le if sera détaillé en profondeur en section 5 — vous pouvez déjà en deviner la logique.)
Retenez la distinction centrale de cette leçon :
Write-Output(ou rien) alimente le tapis roulant et peut être réutilisé,Write-Hosts’adresse uniquement à l’œil de l’utilisateur, etRead-Hostfait l’inverse en récupérant une information depuis le clavier. Confondre ces rôles est l’une des toutes premières causes de scripts PowerShell qui « ne marchent pas comme prévu ».
Dans la prochaine leçon, place au quiz de fin de section, pour valider variables, tableaux, hashtables et communication utilisateur.