Datei-Management im Griff mit unseren Profi-Tipps
Mehr zum Thema: MicrosoftSie wünschen sich eine Liste Ihrer Musik-Dateien, möchten Speicherplatz-Verschwender auf der Festplatte finden oder regelmäßige Sicherheitskopien auf einem USB-Stick speichern? Willkommen in der Automationswelt von PowerShell und unserem Tutorial!

Wir verraten in diesem Tutorial, wie Sie mit PowerShell Dateien automatisiert organisieren lassen können. Mission 1: Dateien und Ordner finden PowerShell-Befehle (Cmdlets) sind hochspezialisierte Experten genau für eine Aufgabe. Gibt es bereits das passende Cmdlet für eine Aufgabe, dann ver...
Wir verraten in diesem Tutorial, wie Sie mit PowerShell Dateien automatisiert organisieren lassen können.
Mission 1: Dateien und Ordner finden
PowerShell-Befehle (Cmdlets) sind hochspezialisierte Experten genau für eine Aufgabe. Gibt es bereits das passende Cmdlet für eine Aufgabe, dann versorgen Sie das Cmdlet bloß mit den nötigen Informationen, und schon ist das Problem gelöst.
Das wichtigste Dateisystem-Cmdlet heißt Get- ChildItem und steht auch unter den historischen Aliasnamen dir und ls zur Verfügung: zuständig ist es für die Datei- und Ordnersuche. Um beispielsweise alle Word-Dokumente zu finden, genügt dieser Aufruf:
Get-ChildItem -Path $env:USERPROFILE -Filter*.doc? -Recurse
Den Startpunkt der Suche legt der Parameter -Path fest, dem Sie einen Pfadnamen nennen. Wichtige Systempfade finden sich praktischerweise in den Umgebungsvariablen und müssen nicht wörtlich angegeben werden. Suchen Sie nach persönlichen Daten, ist das Benutzerprofil der richtige Ausgangspunkt:
PS> $env:USERPROFILEC:\Users\Tobias
Mit Get-ChildItem -Path env: listen Sie übrigens alle weiteren Umgebungsvariablen auf, die es sonst noch gibt. Dank -Recurse erfasst Get-ChildItem auch alle untergeordneten Order. Möchten Sie versteckte Ordner und Dateien einschließen, gibt man zusätzlich -Force an.
Gesucht wird nach allen Dateien, die auf .doc plus optional einem weiteren Zeichen enden, sodass auch Dateien mit der Endung *.docx gefunden werden. "*" steht für beliebig viele Zeichen, "?" für genau eibeliebiges Zeichen. Mehr Informationen zu Platzhalterzeichenliefert PowerShell mit help wildcard ([Eingabe]): Das gilt jedenfalls dann, wenn die Hilfeheruntergeladen wurde (Kasten PowerShell-Hilfe installieren). Die Suche funktioniert überall, doch liefert sie mitunter auch rote Fehlermeldungen. Diese Zeile findet beispielsweise alle Logbuch-Dateien im Windows-Ordner:
# Logbuch-Dateien im Windows-Ordner auflistenGet-ChildItem -Path $env:windir -Recurse-Filter *.log
Die Ergebnisliste ist durchsetzt mit Fehlermeldungen, weil PowerShell nicht in alle Unterordner des Systems hineinschauen darf. Um Fehlermeldungen zu unterdrücken, unterstützt jedes Cmdlet den Parameter-ErrorAction, der bestimmt, was im Fehlerfall zu tun ist. Mit der folgenden Zeile sind Fehlermeldungen verschwunden:
# Logbuch-Dateien im Windows-Ordner auflistenGet-ChildItem -Path $env:windir -Recurse-Filter *.log -ErrorAction SilentlyContinue
Mithilfe der Platzhaltern kann man auch Dateien finden, die nicht immer genau am gleichen Ort liegen. Die folgende Zeile liefert den Pfad zu Microsoft Excel (falls installiert):
# Pfad zu Excel findenGet-ChildItem -Path ,C:\Program Files*\Microsoft Office\Office*\EXCEL.EXE'
Dank der Platzhalterzeichen ist es egal, in welcher Office-Version Microsoft Excel installiert ist und ob es sich um eine 32-Bit- oder 64-Bit-Installation handelt. Möchte man nach mehreren Dateiendungen suchen, verwendet man anstelle von -Filter den Parameter-Include. Er ist langsamer, aber vielseitiger und funktioniert im Gegensatz zu -Filter nur in Verbindung mit -Recurse. Diese Zeile findet eine Reihe von Musikformaten in Ihrem Benutzerprofil:
$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'Get-ChildItem -Path $env:userprofile -Include$Endungen -Recurse

Mission 2: Versteckte Informationen anzeigen
PowerShell zeigt freiwillig nur einen Bruchteil der Informationen an. Möchte man alle Informationen sehen, greift man zu Select-Object. Normalerweise kann man damit die Ergebnisse beschränken. Diese Zeile würde nur die Spalten LastWriteTime, Length und Name ausgeben:
$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'Get-ChildItem -Path $env:userprofile -Include$Endungen -Recurse | Select-Object -PropertyLastWriteTime, Length, Name
Interessanter wird es, wenn man Select-Object gar keine Spaltennamen übergibt, sondern Platzhalterzeichen. Jetzt zeigt die PowerShell auch zuvor unbekannte Informationen (Properties) an. Diese Zeile zeigt, welche Informationen in einem Datei-Objekt vorhanden sind:
PS> Get-ChildItem -Path ,C:\Program Files*\Microsoft Office\Office*\EXCEL.EXE' | Select-Object -Property *
Das Ergebnis zeigt sich: In FullName steht beispielsweise der volle Pfadname, und in Extension die Dateiextension. Wer also gern eine reine Pfadliste seiner Musikdateien wünscht, kommt so ans Ziel:
$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'Get-ChildItem -Path $env:userprofile -Include$Endungen -Recurse | Select-Object -ExpandProperty Fullname
Die folgende Zeile würde hingegen den vollen Pfadnamen von Microsoft Excel anzeigen:
# Pfad zu Excel findenGet-ChildItem -Path ,C:\Program Files*\Microsoft Office\Office*\EXCEL.EXE' |Select-Object -Property FullName
Wer hingegen nur den Inhalt einer einzigen Spalte ausgegeben möchte, packt den Inhalt der Spalte mithilfe von -ExpandProperty einfach aus:
# Pfad zu Excel findenGet-ChildItem -Path ,C:\Program Files*\Microsoft Office\Office*\EXCEL.EXE' |Select-Object -ExpandProperty FullName
Grundsätzlich alle Informationen - auch die versteckten - können von nachgeschalteten Cmdlets weiter ausgewertet werden. So lassen sich Fragestellungen klären, für die das ursprüngliche Cmdlet gar nicht konzipiert war. So ist es dann mithilfe von Group-Object auch möglich, die Ergebnisse beispielsweise zu gruppieren - wie der folgenden Aufruf zeigt:
PS> Get-ChildItem -Path $env:USERPROFILE-Filter *.doc? -Recurse | Group-Object-Property Extension
Mit dem Punkt greift man direkt auf eine der vorhandenen Informationsspalten zu. So können Sie das Erstelldatum einer Datei also auch auf die folgende Weise finden:
# zuerst Beispiel-Datei auf Desktop anlegen:$Pfad = "$env:userprofile\Desktop\meinedatei.txt""DateiInhalt" | Out-File -FilePath $Pfad# Auf Datei zugreifen und Information abrufen:$datei = Get-Item -Path $Pfad$datei.CreationTime
Einige Informationen lassen sich sogar nachträglich ändern. Die folgenden Zeilen versetzen die zuvor erstellte Beispieldatei dann direkt ins Mittelalter:
$datei.CreationTime = ,1633-12-10 19:33:22'$datei.LastWriteTime = ,1635-07-09 06:12:01'
Ein Rechtsklick auf die Datei auf Ihrem Desktop und Eigenschaften zeigt, dass die Datumsänderungen tatsächlich durchgeführt wurden.

Mission 3: Dateireports erstellen
Alle Ergebnisse landen in der PowerShell-Konsole, bis Sie ein anderes Ziel angeben. Dafür sind die Cmdlets zuständig, in deren Namen sich das Verb Out findet. Der folgende Aufruf bringt diese Cmdlets direkt auf den Bildschirm:
PS> Get-Command -Verb Out
Wollen Sie die Ausgabe nun direkt zum Standarddrucker schicken, müssen Sie also lediglich das Cmdlet Out-Printer hinten anhängen:
$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'Get-ChildItem -Path $env:userprofi le -Include$Endungen -Recurse | Out-Printer
Klicken Sie im ISE-Editor auf Out-Printer und drücken dann ([F1]), erfahren Sie aus der Hilfe, dass Out-Printer optional den Parameter -Name kennt, mit dem Sie auch einen anderen installierten Druckernamen angeben können.
Wer Out-GridView einsetzt, kann damit ein Mini-Excel öffnen, das dann die Befehlsergebnisse in einem Extrafenster darstellt. Dieses kann zudem per Klick auf die Spaltenüberschriften sortieren und in der obersten Textzeile nach Stichworten ltern. Aber auch HTML-Reports sind mithilfe der Power-Shell schnell und leicht möglich, wobei dann alle Design-Möglichkeiten von HTML zur Verfügung stehen. Das folgende Beispiel demonstriert diese Möglichkeiten:
$style = ,<style>body { font-family:Consolas; font-size:8pt }h1 { text-align:center; font-size:18pt }th { text-align:left; font-size:12pt }</style>,# diesen Ordner durchsuchen:$Path = "$env:userprofi le\Documents"# HTML-Report hier schreiben:$OutputPath = "$env:temp\report.html"# Dateiextensionen:$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'Get-ChildItem -Path $Path -Include $Endungen-Recurse |Select-Object -Property Name, Length,FullName |Sort-Object -Property Name |ConvertTo-Html -Head $style -Title ,MeineMusik' -PreContent "<h1>Musik in $Path</h1>" |Out-File -FilePath $OutputPathInvoke-Item -Path $OutputPath
Dieser Musik-Report öffnet sich dann anschließend direkt im Browser und kann von hier aus gedruckt werden. Er ist sortiert nach der Spalte Name. Ein Blick in den Code zeigt, wieso das so ist: Sort-Object wird mit -Property einfach die Spalte übergeben, nach dersortiert werden soll. Sollen Musikdateien nach Größe in absteigender Reihenfolge erscheinen, teilt man Sort-Object bloß seine Wünsche mit. Das kann dann zum Beispiel auf diese Art geschehen:
Sort-Object -Property Length -Descending |
Auch Excel-Reports lassen sich mit wenigen Befehlen erstellen und werden direkt in Excel geöffnet, jedenfalls dann, wenn es installiert ist:
$Zeitstempel = Get-Date -Format ,yyyyMMddHHmmss'$Path = "$env:temp\Musikreport$Zeitstempel.csv"$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'Get-ChildItem -Path $env:userprofi le -Include$Endungen -Recurse |Select-Object -Property Name, *Time*, Length,FullName |
Export-CSV -Path $Path -NoTypeInformation-Encoding UTF8 -UseCulture Invoke-Item -Path $Path

Mission 4: Ordnergrößen kalkulieren
Häufig will man wissen, wie groß ein Ordner ist oder welche Datenmengen ein Benutzer in seinem Profilordner speichert. Das Cmdlet Measure-Object kann dazu den Inhalt einer Ergebnisspalte aufsummieren.
Möchten Sie wissen, welche Datenmenge Ihre Musik umfasst, gibt Ihnen dieser Aufruf die Antwort:
$Endungen = ,*.wav','*.mp3', ,*.m4a', ,*.m4b'$summe = Get-ChildItem -Path $env:userprofi le-Include $Endungen -Recurse |Measure-Object -Property Length -Sum |Select-Object -ExpandProperty Sum$summe"Gesamtgröße: $summe",Gesamtgröße: {0:#,##0.0} MB' -f ($summe/1MB)
Die kalkulierte Summe wird dann in drei verschiedenen Varianten ausgegeben:
3201201775Gesamtgröße: 3201201775Gesamtgröße: 3.052,9 MB
Den meisten Anwendern wird dabei die letzte Variante angenehmer formatiert erscheinen, da die Werte in MByte und nicht mehr in Byte angezeigt werden. Das macht der Operator -f möglich, der auf seiner linken Seite eine Textschablone erwartet und auf der rechten die Informationen, die in die Schablone einzusetzen sind. Der Screenshot auf Seite 104 untenzeigt einige mögliche Aufrufe mithilfe dieses Operators und ihre Ergebnisse.

Mission 5: Die fünf größten Dateien finden
Die PowerShell-Cmdlets eignen sich aber auch zum Aufräumen übervoller Festplatten. Der folgende Code liefert die fünf größten Dateien in Ihrem Benutzerpro l und nutzt dieselben Bausteine, die schon in unseren bisheriger Beispielen im Einsatz waren:
Get-ChildItem -Path $env:USERPROFILE -Recurse-ErrorAction SilentlyContinue |Sort-Object -Property Length -Descending |Select-Object -First 5 -Property Length,FullName |Format-Table -AutoSize
Neu ist dabei nur Format-Table, mit dem man am Ende einer Befehlskette für eine besonders platzsparend optimierte Ausgabe sorgen kann.