Einleitung

Dieser Artikel wurde komplett umgestaltet, da ich nun eine Komplettlösung für eine funktionsfähige Software anbieten kann, die Dateilisten erstellt.
Dabei beschränke ich mich auf eine rudimentäre Gui mit Inputfeld mit Label, Ordnerexplorer und Textbox zur Ausgabe der Dateilisten.
Da ich nun schon zwei Monate mich mit Powershell beschäftige, also eine anspruchsvolle Variante.

Ich fange gleich mit einem harten Einstieg an und gebe den Quellcode vor, den man im Skript dann verwenden kann:

[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 {
$wks=$InputBox.text;
Add-Type -AssemblyName System.Windows.Forms
$FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
[void]$FolderBrowser.ShowDialog()
$FolderBrowser.SelectedPath
$result=$FolderBrowser.SelectedPath
$pfad=$result + "\*." + $wks   
$array =gci $pfad -Include *.$wks -Recurse

for ($i=0; $i -lt $array.length; $i++){
$someFilePath =  $array[$i]
$md5 = New-Object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))
$ergebnis =  "$someFilePath + $hash" 
$outputBox.text+=$ergebnis +  "`r`n"
}




                     } #end Openfiledialog

############################################## end functions
$InputBox = New-Object System.Windows.Forms.TextBox
$InputBox.Location = New-Object System.Drawing.Size(20,50)
$InputBox.Size = New-Object System.Drawing.Size(150,20)
$Form.Controls.Add($InputBox)

$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
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(350,35)
$label.Text = "Bitte nur Dateiendung wie z. B. txt, mp3,pdf ohne Punkt eingeben:"
$form.Controls.Add($label)

############################################## 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()


O. K., dann erkläre ich mal anhand der roten Abschnitte das ganze mit einfachen Worten: Beim öffnen wird die Gui geöffnet, die aus einem Button mit zugehörigen Label (Bitte nur Dateiendung wie z. B. txt, mp3,pdf ohne Punkt eingeben:) geöffnet wird.

Der User gibt also nun txt, pdf, mp3 oder mp4...., eben die Dateiendung ein. Danach drückt er den Button ($Button.Add_Click({Openfiledialog}) ), der den Ordnerexplorer ($FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog) in der Funktion Openfiledialog (function Openfiledialog {...}) auslöst.

In der ersten Zeile definiere ich lediglich die Auswahl des Users von der Dateiendung ($wks=$InputBox.text;).

Nachdem ich die Ordnerauswahl ($FolderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog)  vom Dateiexplorer ($FolderBrowser.SelectedPath) in  einer Variable ($result=$FolderBrowser.SelectedPath) verstaute,  setzte ich den kompletten Pfad zusammen  in eine neue Variable ($pfad=$result + "\*." + $wks ) ,

die aus  dem Pfad ($result ) des Dateiexplorers, einem Schrästrich mit Stern und der Dateiendung besteht. Nehmen wir einmal an, dass wir für PDF-Dokumente  die Hashwerte im Pfad von dem Ordner Test selektieren, dann steht da  z. B. c:\Test\*.pdf

Danach sage ich, dass ich aus der Variable Pfad($array =gci $pfad -Include *.$wks -Recurse) mal eben  ausschließlich alle Namen der PDF-Dokumente haben will, dass hört sich ein wenig doppelt gemoppelt an,  dass ich einmal den Pfad mit allen PDF-Dokumenten (Variable $pfad) mit allen *.pdf (*.$wks) haben will, ist aber so korrekt und der Syntax geschuldet.

Für die gesammelten  PDF Dokumentenpfade, die nun in einem Array unsortiert vorliegen, starte ich nun eine Schleife:

 for ($i=0; $i -lt $array.length; $i++){
$someFilePath =  $array[$i]
$md5 = New-Object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))
$ergebnis =  "$someFilePath + $hash" 
$outputBox.text+=$ergebnis +  "`r`n"
}

Ich hole mir vom PDF im Beispiel vom nullten bis zum letzten PDF jeweils bei einem Durchgang einen Pfad ab.

Z. B.
c:\Test\test1.pdf [0] - im ersten Durchgang
c:\Test\test2.pdf [1] - im zweiten Durchgang

Beim ersten Durchgang wird also der erste Hashwert ermittelt ($md5 = New-Object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider). Sie können statt SHA 256 auch gerne SHA 512 oder MD5 verwenden. Einfach an dieser Stelle austauschen.

Das Ergebnis des Hashwertes wird in der gleichnamigen Variable ausgegeben ($hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath))) ).

Als Ergebnis schreibe ich den Pfad und den Hashwert hin ($ergebnis =  "$someFilePath + $hash"  )

Das Ergebnis wird in die Outbox geschrieben ($outputBox.text+=$ergebnis +  "`r`n") und dank dem Zeilenschalter (+  "`r`n") Zeilenweise angefügt.

Die Schleife geht dann so lange durch, bis auch das letzte PDF-Dokument erfasst ist - das war es auch schon. Ziemlich einfach,  wenn man das leicht erklärt und der Rest ist Syntax -:)

Damit wurde das Problem hinreichend gelöst, wie man mit einem Fileexplorer das macht, hatte ich hier erklärt.