Afficher une boite de dialogue en Powershell (avec fermeture automatique)

I. Présentation

Pour faire suite à mon article précédent “Afficher un messagebox en Powershell“, je vous propose une petite variante basée sur l’utilisation d’un objet COM (bien connu des scripteurs VBS 🙂 )

Quel intérêt me direz-vous ? Eh bien, comme tous les objets, il y a des limites et en l’occurrence, l’usage de la classe [System.Windows.Forms.MessageBox] n’a pas (à ma connaissance) la capacité de fermer automatiquement la boite de dialogue. Cela peut s’avérer problématique ou contraignant dans un cadre d’automatisation, que votre script reste en attente d’une action de la part d’un utilisateur distrait ou parti prendre son café :-).

C’est pour cela que je vous présente une solution alternative basée sur l’objet COM “wscript.shell” issu du VBS mais naturellement exploitable au sein de Powershell 🙂

II. Détails du script

Je me suis donc fortement inspiré de ma fonction précédente et j’ai modifié le script comme suit :

function Show-MessageCOM {

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,
 [int]$Second = 0 # Durée d'affiche du message, 0 pour permanent
 )

# 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 }

# Afficher la boite de dialogue (via objet COM) et renvoyer la valeur de retour (bouton appuyé)
# = "-1" si fermeture par dépassement de délai 
$BtnType = $Btn + $Icon
$Reponse = (New-Object -ComObject wscript.shell).popup("$Message",$Second,"$Titre",$BtnType)
Return $Reponse
}

 

Vous constaterez l’ajout d’un nouveau commutateur “-Second“, qui permet de définir la durée d’affichage du message. En cas d’absence, ou de valeur à 0, la  boite de dialogue reste affichée jusqu’à l’intervention de l’utilisateur. En cas de dépassement du délai stipulé, la boite de dialogue se ferme automatiquement et la valeur retournée est alors “-1

Après avoir chargé cette fonction en mémoire, il vous suffit de l’invoquer comme suit :

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


if ($Reponse -eq -1) { Write "Oups, y'a personne ?"} else { Write "La valeur retournée est [$Reponse]" }

 

J’espère que cette petite astuce vous sera utile 😉

A bientôt

Christophe

Laisser un commentaire

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

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