Afficher un messagebox en Powershell

Comment afficher une boite de dialogue en Powershell ?

Durant mes formations sur Powershell, j’ai régulièrement cette question qui bien que légitime, sort quelque peu des fondamentaux d’un script basique. (mais rien de très compliqué, voir tout public) après la lecture de ce billet wlEmoticon-smile.png.

La principale difficulté (si il en est) réside dans le chargement de la bibliothèque d’objets graphiques “Windows.Forms” qui se fera par la ligne de code suivante :

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

A l’issue de cette commande quelque peu déroutante pour un débutant, la session ou le script dispose d’objets (dans le GAC) de fonctions graphiques .NET dont le membre “msgbox” spécialisé dans l’affichage des boites de dialogue.

On pourrait donc afficher un message simple avec le bouton “OK” par ce “simple” code

[System.Windows.Forms.MessageBox]::Show("Mon message")

Mais les possibilités de cette fonction sont un peu plus riches que ce fade “popup”. En fait, il est possible de spécifier un titre, le type et nombre des boutons ainsi qu’une icône de message. Syntaxiquement parlant, cela donne quelque chose comme ça :

[System.Windows.Forms.MessageBox]::Show($Message, $Titre , $Btn, $Icon)

Pour la valeur de “$message”, c’est une simple chaine (string) libre à vous  …

Pour la valeur de “$titre”, c’est également une simple chaine (string) libre à vous  …

Pour la valeur de “$btn”, c’est l’une des valeurs numériques suivantes :
0 :     OK
1 :     OK Cancel
2 :     Abort Retry Ignore
3 :     Yes No Cancel
4 :     Yes No
5 :     Retry Cancel

(J’ai volontairement spécifié les équivalences en anglais, du fait qu’elles correspondent aux chaines de retour du bouton appuyé – ce qui peux éventuellement servir pour la suite à donner à votre script :-))

Pour la valeur de “$Icon, c’est l’une des valeurs numériques suivantes :
0 : Aucune icône
16 : Erreur – Croix sur fond rouge32 : Question – Point d’interrogation sur fond bleu
48 : Avertissement – Point d’exclamation sur fond jaune
64 : Information – Point d’exclamation sur fond bleu

Voilà pour la théorie, reste a écrire une fonction  plus conviviale 😉

function Show-Message {

param (
    [string]$Message = "Veuillez entrer votre message",
    [string]$Titre = "Titre de la fenêtre",
    [switch]$OKCancel,
    [switch]$AbortRetryIgnore,
    [switch]$YesNoCancel,
    [switch]$YesNo,
    [switch]$RetryCancel,
    [switch]$IconErreur,
    [switch]$IconQuestion,
    [switch]$IconAvertissement,
    [switch]$IconInformation
    )

# Affecter la valeur selon le type de boutons choisis
if ($OKCancel) { $Btn = 1 }
elseif ($AbortRetryIgnore) { $Btn = 2 }
elseif ($YesNoCancel) { $Btn = 3 }
elseif ($YesNo) { $Btn = 4 }
elseif ($RetryCancel) { $Btn = 5 }
else { $Btn = 0 }

# Affecter la valeur pour l'icone 
if ($IconErreur) {$Icon = 16 }
elseif ($IconQuestion) {$Icon = 32 }
elseif ($IconAvertissement) {$Icon = 48 }
elseif ($IconInformation) {$Icon = 64 }
else {$Icon = 0 }
    

# Charger la bibliotheque d'objets graphiques Windows.Forms
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

# Afficher la boite de dialogue et renvoyer la valeur de retour (bouton appuyE)
$Reponse = [System.Windows.Forms.MessageBox]::Show($Message, $Titre , $Btn, $Icon)
Return $Reponse
}

Voilà, il y a certainement mieux à faire mais vous voilà avec une fonction facile à utiliser en ligne de commande Powershell.

Pour rappel, vous pouvez charger cette fonction en enregistrant ce bout de code dans un fichier “msgbox.ps1” puis en utilisant l’astuce du “dot-sourcing” (en ajoutant simplement un point et un espace avec le nom du fichier .ps1 dans votre propre script ou session de console Powershell)

. .\msgbox.ps1

Ensuite, vous n’aurez plus qu’à utiliser la commande “show-message” avec la touche tabulation pour la complétion des paramètres :

Show-Message -Message "Alors, c'est plutot pas mal Powershell ?" -Titre "A votre avis" -YesNo -IconQuestion

J’espère que la valeur renvoyée sera “Yes” wlEmoticon-surprisedsmile.png

A bientôt

Christophe

16 Commentaires

  1. JPJ

    Merci pour l’idée et le code !

    Répondre
  2. Pingback: Créer une Pop-up dans un Powershell - La boite à JB

  3. Pingback: Afficher une boite de dialogue en Powershell (avec fermeture automatique) – CnF1G's Blog

  4. Bobby

    Bonjour, j’ai utiliser ton code qui est tres interressant en passant ! mais j’ai un probleme a valider avec la variable $reponse.

    if ($reponse -eq “Yes”)
    { write-host “ca marche” }
    Else
    { write-host “ca marche pas” }

    Le output est toujours “ca ne marche pas” !

    As-tu une idée du pourquoi ?

    Merci

    Répondre
    1. CxMan (Auteur de l'article)

      Bonjour Bobby,
      Je pense que ton code est incomplet et que tu as oublié de charger le résultat de la fonction dans la variable.
      Par exemple, ce code fonctionne (pour moi 🙂 )

      $reponse = Show-Message -Message "Alors, c'est plutot pas mal Powershell ?" -Titre "A votre avis" -YesNo -IconQuestion

      if ($reponse -eq "Yes")
      { write-host "ca marche - On a appuyé sur Oui" }
      Else
      { write-host "ca marche pas - On a appuyé sur Non ou fermé la boite" }

      Bonne continuation

      Répondre
  5. Bobby

    Merci pour ta réponse. en fait c’était du au fait que ma variable n’était pas Global, et il était dans un autre PS1.
    Ca fonctionné quand j’ai ajouté $Global:reponse= $Null au début de mon code.

    Merci a toi !

    Répondre
    1. CxMan (Auteur de l'article)

      Merci pour le retour.
      Pour info, je conseille de mettre ses propres fonctions (régulièrement utilisées) dans un fichier module .psm1, puis de faire un import-module dans le script appelant, ou au pire d’utiliser la technique du dot-sourcing “. chemin\fonction.ps1”
      mais la déclaration de la portée des variables est très bien aussi…
      Au besoin, https://www.it-connect.fr/powershell-pour-les-debutants-2eme-partie/
      Bien à toi

      Répondre
  6. Bobby

    merci pour la précision, je vais essayer ca car j’ai de la difficulté a envoyer de l’information dans mon “TextboxOutput” d’un Ps1 a l’autre… ca reglera peut-etre mon probleme 🙂

    Répondre
  7. Pingback: Message box | lepetit-powershell.fr

  8. Maka

    Merci 🙂

    Répondre
  9. Yann

    Bonjour,
    Comment faire un retour à la ligne pour la partie message ?
    J’ai essayé \n mais cela ne fonctionne pas.
    Merci d’avance,
    Yann

    Répondre
    1. CxMan (Auteur de l'article)

      Bonjour Yann,
      Rien de compliqué, en Powershell, il suffit d’ajouter [altGr]+[7]+[n] et normalement ça marche.
      Exemple d’ajout d’un retour ligne après le mot “Alors”

      $Message = "Alors`n, c'est plutot pas mal Powershell ?"
      $Reponse = Show-Message -Message $Message -Titre "A votre avis" -YesNo -IconQuestion

      Parfois, il faut ajouter `n`r (pour un équivalent CrLf)
      Bonne continuation

      Répondre
  10. Constantin

    vous pourriez donner un exemple de code complet s’il vous plaît

    Répondre
    1. CxMan (Auteur de l'article)

      Bonjour,
      Merci de préciser la question ou le besoin car pour moi le code est déjà au complet ! la fonction dans l’article, et l’exemple dans le commentaire en réponse à Yann.
      A copier/coller dans un ISE ou un fichier .PS1 puis à exécuter, tout simplement.
      Cdlt

      Répondre
      1. Constantin

        désoler de vous déranger mais comment on enregistre dans un ficher .PS1 (je débute dans l’informatique je suis en 3ème)?

        Répondre
        1. CxMan (Auteur de l'article)

          Bonjour Constantin,
          Cette question est bien loin du sujet et du codage.
          On peut créer / enregistrer un fichier .ps1 via un bloc-notes comme un fichier texte.
          Mais à mon avis, il faut commencer par le début en travaillant sur les fondamentaux (de l’informatique) et chercher ailleurs …
          Bonne continuation

          Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.