Tipp zum Windows PowerShell FilePicker

Bei einem PowerShell Script, das die Eingabe eines Users benötigt, kann es schnell zu Tippfehlern oder einem Missverständnis kommen. Raphal Fäh zeigt, wie man dem Benutzer eine einfache und gewohnte Oberfläche bieten kann.

Autor Raphael Fäh
Datum 02.06.2014
Lesezeit 3 Minuten

Wer kennt das nicht: Man schreibt ein PowerShell-Skript, das eine Eingabe vom User benötigt; einen Pfad zu einem File, sei das ein Parameterfile oder ein Skript-Inputfile. Ebenfalls kennen wir die «Dein Skript funktioniert nicht»-Anrufe, weil der User den Pfad eintippen musste und sich vertippt oder einen expliziten mit einem impliziten Pfad verwechselt hat.

Windows PowerShell FilePickerWindows PowerShell FilePickerWindows PowerShell FilePicker

Mit der folgenden, einfachen Funktion wollen wir Abhilfe schaffen und dem User eine einfache und gewohnte Oberfläche bieten.

Windows PowerShell FilePicker

Als Erstes brauchen wir den Funktionsnamen, den Funktionsbody und eine Parameterdefinition. Diese sehen zum Beispiel so aus:

Function Start-FilePicker{

Param(

$initialDirectory

)

}

Nun haben wir eine gültige Funktion mit einem Parameter, die allerdings noch nichts tut. Damit wir Files auswählen können, greifen wir auf einen .NET Assembly namens Windows.Forms zurück:

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

void ermöglicht es, sämtlichen Output beim Laden der Assembly zu vermeiden, sodass nicht plötzlich unerwünschte Informationen in der Konsole stehen. Es wird die System.Reflection.Assembly mit der statischen LoadWithPartialName-Methode verwendet, um die Windows.Forms Assembly zu laden.

Haben wir die Assembly geladen, müssen wir sie instanziieren:

Aktualisierung vom 16.6.2014: Haben wir die Assembly geladen, müssen wir ein Objekt vom Typ System.Windows.Forms.OpenFileDialog aus der Assembly instanziieren:

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

Nun besitzen wir ein Objekt vom Typ OpenFileDialog, das wir weiterverwenden bzw. konfigurieren können:

$OpenFileDialog.initialDirectory = $initialDirectory

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

Als Beispiel setze ich hier ein Intialdirectory, um anzugeben, wo im Filesystem der Picker beginnen soll, sowie einen File-Endungsfilter, in diesem Fall für XML. Die PDF-Version wäre:

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

 

Haben wir die ganze Konfiguration vorgenommen, können wir das Fenster aufrufen:

$OpenFileDialog.ShowDialog() | Out-Null

$OpenFileDialog.filename

Die Methode ShowDialog() wird verwendet, um ein Fenster anzuzeigen, mit dem der Benutzer interagieren kann. Die Pipeline an Out-Null wird benötigt, um unerwünschten Output verschwinden zu lassen.

Zu guter Letzt rufen wir auf der Variable den gewählten Filenamen und expliziten Pfad ab, indem wir das Property filename aufrufen. Der Rückgabewert der Funktion ist somit vom Typ System.String, überprüfbar mit Get-Member.

cWindows PowerShell FilePicker

Viel Spass beim Ausprobieren!

 

Hier noch einmal sämtliche Kommandozeilen im Überblick:

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
}

Über den Autor

Raphael Fäh

Schon während seinem Studium zum Bachelor in Wirtschaftsinformatik hat Raphael Fäh Praxisbezug gesucht und gefunden – bei diversen KMU und zuletzt bei der Corporate Software GmbH. Seitdem ist er in verschiedenen Kundenprojekten im Bereich Microsoft System Center, PowerShell und SharePoint unterwegs. Er schult mit seinem Praxiswissen als Microsoft Certified Trainer IT Professionals in aktuellen Microsoft-Technologien. Seinen Ausgleich sucht und findet er beim Bogenschiessen. Ob als Bogenschütze, Dozent oder Consultant – er trifft ins Schwarze.