PowerShell – Création d’une interface graphique avec une ListBox automatique

Introduction

PowerShell est un langage de scripting pour Windows et Windows Server. Il permet de gérer plus simplement les systèmes. Il fonctionne à partir du .NET Framework, offrant ainsi des fonctionnalités riches comme l’interface graphique ou le POO.

Construction du script

Chez certains de mes clients, les scripts que j’ai conçu atteignent plus de 2000 lignes de code PowerShell. Les scripts sont donc complexes et afin de faciliter l’utilisation, il est parfois nécessaire de créer une interface graphique à partir des classes System.Windows.Forms et System.Drawing du .NET Framework.

En premier lieu, il faut d’abord charger les classes :

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

Ensuite, il faut créer un objet Form. Cet objet aura différentes propriétés comme Text et StartPosition :

 $ListForm = New-Object System.Windows.Forms.Form
 $ListForm.Text = "Test Formulaire"
 $ListForm.Size = New-Object System.Drawing.Size(300,200)
 $ListForm.StartPosition = "CenterScreen"

Idéalement, il faut également forcer l’ouverture du formulaire au dessus des autres fenêtres :

$ListForm.TopMost = $True

La dernière étape permet d’afficher l’objet Form :

$ListForm.ShowDialog()

Le résultat est plutôt clair :

ise1

Il est donc relativement simple de créer une interface avec PowerShell. Une fois que la forme de base est créée, il faut ajouter des boutons, une box et du traitement (Selon le besoin du script). En gardant le même script, je vais ajouter deux boutons.

Création d’un objet Button avec différentes propriétés comme Text, DialogResult ou Location :

$ButtonOk = New-Object System.Windows.Forms.Button
$ButtonOk.Location = New-Object System.Drawing.Point(75,120)
$ButtonOk.Size = New-Object System.Drawing.Size(75,23)
$ButtonOk.Text = "OK"
$ButtonOk.DialogResult = [System.Windows.Forms.DialogResult]::OK

Il est nécessaire de répéter l’opération pour le bouton « Annuler » :

$ButtonCancel = New-Object System.Windows.Forms.Button
$ButtonCancel.Location = New-Object System.Drawing.Point(150,120)
$ButtonCancel.Size = New-Object System.Drawing.Size(75,23)
$ButtonCancel.Text = "Annuler"
$ButtonCancel.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

Une fois que les boutons sont créés, il faut les ajouter à notre élément de base. Cette opération sera nécessaire pour tous les éléments qui devront être ajoutés :

$ListForm.Controls.Add($ButtonOk) 
$ListForm.Controls.Add($ButtonCancel)

Et voilà le résultat :

ise2

Le processus est le même pour l’ajout d’une ListBox et d’un Label :

$FormLabel = New-Object System.Windows.Forms.Label
$FormLabel.Location = New-Object System.Drawing.Point(10,20)
$FormLabel.Size = New-Object System.Drawing.Size(280,20)
$FormLabel.Text = "Test Label : "
$ListBox = New-Object System.Windows.Forms.ListBox 
$ListBox.Location = New-Object System.Drawing.Size(10,40) 
$ListBox.Size = New-Object System.Drawing.Size(260,20) 
$ListBox.Height = 80
$ListForm.Controls.Add($FormLabel) 
$ListForm.Controls.Add($ListBox)

Résultat :

ise3

Il est également nécessaire d’affecter une action lorsque que le clic de la souris est utilisé ou lorsqu’une touche du clavier est actionnée. Par exemple, si le clic est effectué sur le bouton « OK », l’item sélectionné dans la ListBox sera stocké en variable et le formulaire sera fermé :

$ListForm.KeyPreview = $True
$ListForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {
$x=$ListBox.SelectedItem; $Listform.Close()}})
$ListForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {
$Listform.Close()}})
$ButtonOk.Add_Click({$x=$ListBox.SelectedItem;$Listform.Close()})
$ButtonCancel.Add_Click({$Listform.Close()})

La ListBox peut être remplie manuellement ou automatiquement, par exemple grâce à un fichier CSV ou en listant des éléments spécifiques dans le système. Pour remplir manuellement, il faut utiliser la propriété de la ListBox, Items.Add :

[void]$ListBox.Items.Add("Test")

Dans l’exemple, je récupère automatiquement dans ma ListBox tous les sous-dossiers de mon dossier racine :

$ListFolders = Get-ChildItem -Path $global:cdlog | 
Where-Object {$_.PSIsContainer} | Select-Object Name
foreach ($Folders in $ListFolders) {
$FoldersName = [string]$Folders.Name 
[void]$ListBox.Items.Add("$FoldersName")
}

Résultat :

ise4

La dernière étape consiste à définir le traitement lorsque la valeur sélectionnée de la ListBox est validée par le bouton « OK » ou le bouton « Annuler » :

If ($Result -eq [System.Windows.Forms.DialogResult]::OK) {
$SelectItem = [string]$ListBox.SelectedItem
[System.Windows.Forms.MessageBox]::Show("$SelectItem" , "Test" , 0)
}

Elseif ($Result -eq [System.Windows.Forms.DialogResult]::Cancel) {
Exit
}

Il est également nécessaire de modifier la ligne Form.ShowDialog afin de stocker le résultat dans une variable :

$Result = $ListForm.ShowDialog()

Résultat :

Script complet

2 commentaires Ajoutez le vôtre

  1. harfangus dit :

    J’ai testé et je me demande si on peu personnaliser l’icône en haut a gauche de la fenêtre ?

    J'aime

    1. Oui, une fois que tu as créé ton objet $ListForm, tu peux trouver la méthode Icon qui te permet d’ajouter un icône en 16px x 16px ($ListForm.Icon).

      Aimé par 1 personne

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s