Conseil pour Windows PowerShell FilePicker

Qui ne connaît pas cette situation: on écrit un script PowerShell nécessitant une saisie par l’utilisateur; un chemin vers un fichier, que ce soit un fichier de paramètres ou un fichier d’entrée de script. Nous avons aussi tous reçu des appels du type «ton script ne fonctionne pas» parce que l’utilisateur devait saisir le chemin et a fait une faute de frappe ou a confondu un chemin explicite avec un chemin implicite.

Auteur Raphael Fäh
Date 21.07.2014
Temps de lecture 4 Minutes

Qui ne connaît pas cette situation : on écrit un script PowerShell nécessitant une saisie par l’utilisateur; un chemin vers un fichier, que ce soit un fichier de paramètres ou un fichier d’entrée de script. Nous avons aussi tous reçu des appels du type «ton script ne fonctionne pas» parce que l’utilisateur devait saisir le chemin et a fait une faute de frappe ou a confondu un chemin explicite avec un chemin implicite.

corporate-software-filepicker-comic-digicomp-1corporate-software-filepicker-comic-digicomp-2corporate-software-filepicker-comic-digicomp-3

Avec la fonction simple suivante, nous voulons remédier à ce problème et proposer à l’utilisateur une interface claire et familière.

corporate-software-filepicker-comic-digicomp-4

Tout d’abord, nous avons besoin du nom et du corps de la fonction, ainsi que d’une définition des paramètres. Voici par exemple à quoi cela ressemble :

Function Start-FilePicker{

Param(

$initialDirectory

)

}

Nous avons maintenant une fonction valable, mais avec un paramètre qui ne sert à rien pour le moment. Afin de pouvoir sélectionner des fichiers, nous avons recours à un assembly .NET appelé Windows.Forms :

void System.Reflection.Assembly::LoadWithPartialName \
("System.Windows.Forms")

void permet d’éviter toutes les sorties lors du chargement de l’assembly, de manière à empêcher des informations indésirables de se retrouver brusquement dans la console. System.Reflection.Assembly est utilisé avec la méthode statique LoadWithPartialName pour charger l’assembly Windows.Forms.

Mise à jour du 16.06.2014: une fois l’assembly chargé, nous devons instancier un objet de type System.Windows.Forms.OpenFileDialog de l’assembly :

$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog

Nous disposons maintenant d’un objet de type OpenFileDialog, que nous pouvons réutiliser ou configurer :

$OpenFileDialog.initialDirectory = $initialDirectory

$OpenFileDialog.filter = "XML files (*.xml)| *.xml"

Je mets ici, en tant qu’exemple, un répertoire initial pour signaler à quel endroit dans le système de fichiers le sélecteur doit commencer, ainsi qu’un filtre d’extension de fichier, dans ce cas pour XML. La version PDF serait :

$OpenFileDialog.filter = "PDF files (*.pdf)| *.pdf"

 

Une fois la configuration complète effectuée, nous pouvons appeler la fenêtre:

$OpenFileDialog.ShowDialog() | Out-Null

$OpenFileDialog.filename

La méthode ShowDialog() est utilisée pour afficher une fenêtre avec laquelle l’utilisateur peut interagir. Le pipeline vers Out-Null est requis pour faire disparaître les sorties indésirables.

Pour finir, nous récupérons sur la variable le nom de fichier sélectionné et le chemin explicite en appelant la propriété FileName. La valeur de retour de la fonction est ainsi de type System.String, vérifiable avec Get-Member.

corporate-software-filepicker-comic-digicomp-5

Bonne mise en pratique!

 

Revoici une vue d’ensemble de toutes les lignes de commande :

Function Start-FilePicker{

param(

$initialDirectory

)

void
System.Reflection.Assembly::LoadWithPartialName \
("System.Windows.Forms")
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "XML files (*.xml)| *.xml"
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
}

A propos de l'auteur

Raphael Fäh

Dès son Bachelor en informatique de gestion, Raphael Fäh a cherché et acquis une expérience pratique au sein de diverses PME, et dernièrement chez Corporate Software Sàrl. Depuis, il se déplace dans le cadre de différents projets clients dans le domaine Microsoft System Center, PowerShell et SharePoint. Fort de ses connaissances pratiques en qualité de Microsoft Certified Trainer, il forme des professionnels de l’informatique aux technologies Microsoft actuelles. Pendant son temps libre, il pratique le tir à l’arc. Que ce soit en tant qu’archer, maître de conférences ou consultant, il met toujours dans le mille.