Einleitung

Powershell ist eine schöne Sache und man kann damit prima eine GUI konstruieren. Ich zeige dem geneigten Publikum im folgenden wie man  mit ein paar Zeilen Code  einen Dateiexplorer  (File-Explorer) mit vier Zeilen Code kreiert und  dann in einer Demo, wie man das in eine GUI einbaut.

Ich hatte bei der Entwicklung diese Vorlage von dieser Webseite, die eigentlich für einen Ordner-Explorer gedacht war und schaute mir dann kopfschüttelnd auf dieser Microsoftforenseite, die eher unbeholfenen Versuche mit ellenlangen Code für einen File-Explorer an:

Das geht doch auch kürzer, dachte ich mir und schrieb nach den Vorlagen und festgeschriebenen Variablen-Namen der Microsoftseite und der o. a. Seite  einen vereinfachten Code.

In English for runaways: It is easy to create a short dialog for an openfile dialog. You only have a look at this two websites and create the following openfiledialog:

Add-Type -AssemblyName System.Windows.Forms
$OpenFile = New-Object System.Windows.Forms.OpenFileDialog
[void]$OpenFile.ShowDialog()
$OpenFile.filename >>test.txt

Was machte ich? Einfach die festgeschrieben Pfade vom OpenFileDialog  verwenden und dann noch den Filenamen vom Openfile selektieren.

Powershell ist nach einem simplen System aufgebaut und man kann dann einzelne Attribute abfragen und braucht nicht den ganzen Mist und Ballast in endlosen Code-Texten mit aufschreiben.

Ich will nur den Text des Pfades, also muss ich nur die Dialogbox definieren und hinterher den Pfad abgreifen. Ich bin intuitiver Programmierer und programmiere gerade ein paar Artikel Powershell.

Diese simple Lösung scheint aber so schwer zu sein, dass man sie bis 2016 nicht im Netz fand...

Wie dem auch sei: Nach einer angtepassten Vorlage von dieser Webseite sieht dann eine Demo, mit der man den Dateiexplorer über einen Button startet und den erlangten Pfad in eine Textbox in der Gui untereinander  ausgibt, dann so aus:

English: The following Code is a demonstration script, which worked with a button to start the openfiledialog. After making a choice of a file, the complete file-Path will be written down in an outputbox:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  

$Form = New-Object System.Windows.Forms.Form    
$Form.Size = New-Object System.Drawing.Size(600,400)  

############################################## Start functions

function Openfiledialog {
Add-Type -AssemblyName System.Windows.Forms
$OpenFile = New-Object System.Windows.Forms.OpenFileDialog
[void]$OpenFile.ShowDialog()
$ergebnis=$OpenFile.filename
$outputBox.text+=$ergebnis + "`r`n"


                     } #end Openfiledialog

############################################## end functions

$outputBox = New-Object System.Windows.Forms.TextBox
$outputBox.Location = New-Object System.Drawing.Size(10,150)
$outputBox.Size = New-Object System.Drawing.Size(565,200)
$outputBox.MultiLine = $True
$outputBox.ScrollBars = "Vertical"
$Form.Controls.Add($outputBox)

############################################## end text fields

############################################## Start buttons

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(400,30)
$Button.Size = New-Object System.Drawing.Size(110,80)
$Button.Text = "Openfiledialog"
$Button.Add_Click({Openfiledialog})
$Form.Controls.Add($Button)

############################################## end buttons

$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

----

So, den rot markierten Teil kurz erklärt:

Add-Type -AssemblyName System.Windows.Forms
$OpenFile = New-Object System.Windows.Forms.OpenFileDialog
[void]$OpenFile.ShowDialog()
$ergebnis=$OpenFile.filename
$outputBox.text+=$ergebnis + "`r`n"

Das ist unser Skript eingebaut in die Vorlage auf dieser Webseite.

Ich bin ein wenig faul, daher nur der Hinweis, dass eine GUI mit Textbox und Button definiert wurde. Der Button löst ($Button.Add_Click({Openfiledialog}) ) die Funktion Openfiledialog (function Openfiledialog {.....}) aus .

Alles was zwischen den Klammern passiert, ist im roten markierten Bereich. Der Dialog öffnet sich und sie wählen eine beliebige Datei aus. Das waren die ersten drei Zeilen in einfachem deutsch übersetzt, der Rest ist die o. a. Syntax.

Die nächsten zwei Zeilen Zeilen sind dem Umstand geschuldet, dass man das Ergebnis ja in die Textbox untereinander ausgeben will.

Deshalb packe ich in der Zeile $ergebnis=$OpenFile.filename das Ergebnis in eine Variable mit beliebigen Namen, die ich in der nächsten Zeile ausdrucke: $outputBox.text+=$ergebnis + "`r`n"

Die Syntax dieser Zeile ist glaube ich die optimale verkürzte Ausgabe: Durch das Pluszeichen nach $outputBox.text wird der alte leere Inhalt durch das Ergebnis unserer Frage ergänzt. Das heißt, dass bei der zweiten Abfrage mit einem Button das Ergebnis nicht überschrieben, sondern mit dem ergebnis ergänzt wird.

Die angehängte Formel + "`r`n"  ist nichts weiter als ein Zeilenschalter. Dadurch wird die nächste Ausgabe in die nächste Zeile der Textbox gebracht. Mache ich das nicht, dann  wird ein Pfad nach dem anderen  hintereinandergeschrieben.

Sie brauchen nur den Dateinamen ohne Pfad? Halte ich nicht für sinnvoll, denn für die Weiterbearbeitung brauchen sie in der Regel den kompletten Pfad mit Datei und Dateiendung.

So halte ich das für sinnig, denn mit der Variable  $ergebnis  können sie beliebigen Unsinn betreiben, wie z. B. die Datei mit einem anderen Programm öffnen.

Fazit

Der Autor, der ein Urgestein der CMD und Batches ist, gibt es ungern zu: Powershell lässt keine Wünsche offen: Egal ob E-Mails versenden, Dateien Zippen oder unzippen, den Hashwert ermitteln oder eine passende Gui schreiben mit sämtlichen Textboxen, Listenfeldern, Buttons, Dialogen und Hyperlinks... - Powershell lässt das Herz eines intuitiven Open-Code-Programmierers höher schlagen.

Ich habe in meiner kurzen Powershell-Zeit alles o. a. angegebene bereits durchprobiert und Code entwickelt. Datenbank,  Hashwerte...alles kein Problem.

Die CMD ist wirklich tot, es lebe Powershell. Ich habe mich nach anfänglicher Skepsis noch nie so enthusiastisch für eine Programmiersprache ausgesprochen, aber die Powershell hat es verdient...