Afficher des informations avec Write-Host et Write-Output
Sommaire
I. Présentation
Dans ce chapitre, nous allons étudier deux cmdlets indispensables pour effectuer des sorties dans la console à destination des utilisateurs : "Write-Host" et "Write-Ouput". Ce sera également l'occasion d'évoquer "Write-Warning" et "Write-Error".
Lorsqu'un script s'exécute, il est indispensable qu'il y ait des retours dans la console afin de "ne pas être aveugle" pendant l'exécution, en complément d'éventuels journaux que le script pourrait générer. Ainsi, si un administrateur exécute un script à partir d'une console PowerShell, il pourra suivre en temps réel ce qu'il se passe : est-ce que tout se déroule correctement ? Est-ce qu'il y a des erreurs ? Que fait actuellement le script ? Les retours consoles permettront de répondre à diverses questions.
Les cmdlets PowerShell "Write-Host" et "Write-Output" répondent exactement à ce besoin puisqu'ils permettent d'afficher des informations dans la console pour l'utilisateur.
II. Prise en main Write-Host
Le cmdlet "Write-Host" permet d'écrire un message à destination de l'utilisateur directement dans la console PowerShell. Bien qu'il intègre un ensemble de paramètres, nous pouvons l'utiliser de façon très simple en indiquant le nom du cmdlet suivi du message souhaité.
Voici l'utilisation la plus basique de Write-Host :
Write-Host "<Message à afficher>"
Write-Host "Bonjour !"
Lorsque nous exécutons cette ligne de code dans PowerShell, elle affiche "Bonjour !" dans la console.
Le cmdlet "Write-Host" intègre deux paramètres très intéressants pour mettre en forme le texte :
- -ForegroundColor pour modifier la couleur du texte
- -BackgroundColor pour modifier la couleur d'arrière-plan du texte
Vous devez choisir une couleur dans la liste proposée par PowerShell. Vous ne pouvez pas définir une couleur à partir d'un code HTML.
Voici les valeurs disponibles :
Si nous souhaitons retourner dans la console un message qui indique qu'une opération s'est déroulée avec succès, nous pouvons utiliser la couleur verte via la valeur "Green". Ce qui donne :
Write-Host "Opération réussie !" -ForegroundColor Green
De plus, nous pourrions modifier la couleur de l'arrière-plan pour choisir le blanc, par exemple.
Write-Host "Opération réussie !" -ForegroundColor Green -BackgroundColor White
Dans la console PowerShell, nous pouvons visualiser la différence. Ceci est intéressant, car les couleurs permettront de mettre en évidence certains messages.
Par ailleurs, vous devez savoir que chaque commande "Write-Host" écrira son message sur une nouvelle ligne. Il n'est pas nécessaire d'intégrer un "Write-Host" vide dans ce but.
Ce qui peut être utile dans certains cas, c'est d'inclure un saut de ligne dans un même message. Pour cela, vous devez utiliser le caractère suivant : `n. C'est une apostrophe inversée suivie d'un n.
Voici un exemple pour écrire "Opération réussie !" sur une première ligne puis "Passons à la suite" sur une seconde ligne. Il n'est pas utile d'ajouter un espace entre "`n" et la suite du texte, sinon cela va réellement ajouter un espace dans la sortie.
Write-Host "Opération réussie ! `nPassons à la suite" -ForegroundColor Green -BackgroundColor White
III. Prise en main de Write-Output
Nous allons maintenant évoquer le cmdlet "Write-Output", qui lui aussi, permet d'afficher un message dans la console à destination de l'utilisateur. Malgré tout, il est différent de "Write-Host".
Voici comment utiliser "Write-Output" :
Write-Output "<Message à afficher>"
Write-Output "Bonjour !"
Nous pouvons constater que la logique est la même qu'avec "Write-Host". Néanmoins, ce cmdlet ne permet pas de modifier la mise en forme du texte : vous ne pouvez pas changer la couleur ! Voici une première différence, mais ce n'est pas la seule.
IV. Write-Host VS Write-Output
Je suis persuadé que vous préférez "Write-Host" plutôt que "Write-Output", car il permet d'adapter les couleurs, et donc de mettre en forme la sortie. Pourtant, une différence majeure entre "Write-Output" et "Write-Host" pourrait vous faire changer d'avis. De plus, sachez que dans les bonnes pratiques PowerShell, il est recommandé d'utiliser "Write-Output" plutôt que "Write-Host".
Le cmdlet "Write-Host" a pour seul objectif d'écrire du texte dans la console, de façon directe. Le cmdlet "Write-Output" quant à lui va écrire le texte dans la console, mais aussi l'envoyer comme objet dans le pipeline, ce qui le rend accessible à une autre commande.
Voyons cette différence en pratique avec un premier exemple.
Nous allons utiliser le cmdlet "Out-File" pour écrire la sortie dans un fichier texte nommé "message.txt", en plus de l'écrire dans la console. Avec "Write-Host", ceci donne cette commande :
"Bonjour !" | Write-Host | Out-File "C:\TEMP\message.txt"
Le message est bien retourné dans la console et le fichier "message.txt" est bien créé. Cependant, le fichier est vide, car "Write-Host" n'est pas capable d'envoyer l'objet via le pipeline à la commande "Out-File".
Si nous remplaçons simplement "Write-Host" par "Write-Output", nous obtenons un résultat différent : le message est retourné dans la console et en plus, il est écrit dans le fichier "message.txt".
"Bonjour !" | Write-Output | Out-File "C:\TEMP\message.txt"
Voyons un second exemple pour voir que ces cmdlets se comportent différemment.
Nous allons exécuter la commande "Get-LocalUser" et afficher la sortie dans la console à l'aide de "Write-Host". Le résultat sera également stocké dans la variable "$ListeUtilisateurs".
$ListeUtilisateurs = Get-LocalUser | Write-Host
Nous obtenons bien un retour dans la console, mais la variable "$ListeUtilisateurs" est vide.
Le même exercice avec "Write-Output" donnera un résultat différent : aucun message dans la console, toutefois la variable "$ListeUtilisateurs" n'est pas vide.
V. Les messages d'avertissements et d'erreurs
Les cmdlets "Write-Warning" et "Write-Error" sont utilisés pour afficher des messages d'avertissement et d'erreur à l'utilisateur, directement dans la console.
Le cmdlet "Write-Warning" est utilisé pour afficher un message d'avertissement à l'utilisateur, ce qui peut être utile pour signaler à l'utilisateur que quelque chose d'inhabituel s'est produit, mais que le script peut continuer à s'exécuter. La particularité de ce message, c'est qu'il sera coloré en jaune et précédé du texte "AVERTISSEMENT".
Voici un exemple d'utilisation de Write-Warning :
Write-Warning "Ceci est un avertissement"
AVERTISSEMENT : Ceci est un avertissement
Le cmdlet "Write-Error" quant à lui est utilisé pour afficher un message d'erreur à l'utilisateur. Il présente la particularité d'ajouter l'erreur générée à la variable "$Error" qui contient un tableau des dernières erreurs.
Voici un exemple d'utilisation de "Write-Error" :
Write-Error "Ceci est un message d'erreur"
Write-Error "Ceci est un message d'erreur" : Ceci est un message d'erreur
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
Il conviendra d'utiliser "Write-Warning" ou "Write-Error" en fonction de la gravité du message. Ces deux cmdlets s'utilisent aussi simplement que "Write-Host" et effectuent simplement un retour console (sauf "Write-Error" qui alimente la variable "$Error").
VI. Conclusion
Suite à la lecture de ce chapitre, vous êtes capable d'effectuer des retours dans la console au sein de votre script PowerShell, grâce à l'utilisation de 4 cmdlets différents. Vous pouvez faire le choix d'utiliser uniquement "Write-Output", si vous ne souhaitez pas mettre en forme la sortie.