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 biblithèque 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 appuyé)
$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 completion 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

 

 

8 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

Laisser un commentaire

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