Saisie utilisateur interactive avec Read-Host
Sommaire
I. Présentation
Le cmdlet "Read-Host" en PowerShell est précieux, car il permet d'interagir avec l'utilisateur en lui demandant de saisir des informations à partir de la console. Nous pourrons alors stocker la valeur saisie, c'est-à-dire le texte saisit, dans une variable afin de l'exploiter dans un script. Que ce soit pour demander un mot de passe, un nom et un prénom dans le but de constituer un identifiant, etc... "Read-Host" va rendre bien des services !
II. Prise en main de Read-Host
La forme la plus simple d'utilisation de "Read-Host" est de demander une entrée de l'utilisateur sans préciser de message, mais nous verrons que ce n'est pas très intuitif. Dans l'idéal, il convient d'affecter la valeur saisie par l'utilisateur à une variable afin qu'elle ne soit pas perdue :
$Texte = Read-Host
En exécutant ce code, PowerShell sera en attente que l'utilisateur saisisse quelque chose et qu'il appuie sur Entrée pour valider. Ce que l'utilisateur saisit est ensuite stocké dans la variable "$Texte".
Il est également possible de fournir un message à l'utilisateur pour lui indiquer quel type d'information est demandé. Nous allons simplement indiquer le message à la suite de la commande "Read-Host", ce qui sera associé comme valeur au paramètre "-Prompt".
Voici un exemple avec deux demandes de saisie :
$UtilisateurNom = Read-Host "Veuillez saisir votre nom"
$UtilisateurPrenom = Read-Host "Veuillez saisir votre prénom"
Write-Output "Nom : $UtilisateurNom - Prénom : $UtilisateurPrenom"
Dans ce cas, PowerShell affichera le message "Veuillez saisir votre nom", puis attendra que l'utilisateur saisisse quelque chose. Ensuite, PowerShell affichera le message "Veuillez saisir votre prénom" et il attendra que l'utilisateur saisisse une valeur. Il n'est pas nécessaire d'ajouter ":" à la fin de votre message pour le prompt car "Read-Host" l'ajoute automatiquement.
Voici le résultat en image :
III. Saisie d'une chaîne sécurisée
Dans certains cas, nous pouvons utiliser "Read-Host" pour demander à l'utilisateur de saisir un mot de passe. Cette valeur est une chaine de caractères sensibles et nous pourrions avoir envie que l'entrée de l'utilisateur ne soit pas visible directement. De plus, comme il s'agit d'un mot de passe, nous allons créer une chaîne sécurisée ("Secure String") plutôt qu'une simple chaine (string). "Read-Host" permet de faire cela en utilisant le paramètre "-AsSecureString".
Voici un exemple :
$MotDePasse = Read-Host "Veuillez saisir un mot de passe" -AsSecureString
Grâce cette syntaxe, PowerShell affichera le message "Veuillez saisir un mot de passe" et il masquera la saisie de l'utilisateur en affichant des astérisques (*) à la place des caractères.
Vous pouvez ensuite vérifier qu'il s'agisse bien d'une chaine sécurisée en vérifiant le type de la variable. De plus, la valeur de la variable "$MotDePasse" n'est pas accessible directement en tant que texte clair.
$MotDePasse.GetType()
Ensuite, nous pouvons récupérer cette valeur en utilisant le cmdlet "ConvertFrom-SecureString" et son paramètre "-AsPlainText" disponible avec PowerShell 7. La commande ci-dessous retournera le mot de passe en clair, c'est-à-dire celui saisit par l'utilisateur via le "Read-Host".
$MotDePasse | ConvertFrom-SecureString -AsPlainText
IV. Conclusion
Nous venons de voir comment utiliser le cmdlet "Read-Host" pour permettre la saisie d'information de la part de l'utilisateur, de façon interactive. Bien que nous n'ayons pas ce besoin dans tous les scripts, nous sommes contents de pouvoir de l'utilisateur lorsque l'occasion de présente.
Nous pourrions aller plus loin en couplant l'utilisation de "Write-Host" / "Write-Output" et "Read-Host" pour créer un menu interactif qui permettrait à l'utilisateur de faire un choix, et en fonction de ce choix, nous pourrions exécuter une action spécifique. Ceci implique l'utilisation d'une structure conditionnelle ("if" ou "switch") pour agir en fonction du choix de l'utilisateur.