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.
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.
Mit der folgenden, einfachen Funktion wollen wir Abhilfe schaffen und dem User eine einfache und gewohnte Oberfläche bieten.
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.
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
}