Der Klassiker. Man importiert Dateien (z.B. von der Kamera), aber die Namen sind nicht so, wie man sich das vorstellt. Unter Mac OS hatte ich für die Massenumbenennung von Dateien immer den wirklich genialen NameMangler, aber unter Windows war es damit dann zu Ende; eine andere Lösung musste her. Die Prämisse war allerdings, dass ich nichts installieren wollte. Ein paar Suchen auf Google später fand ich dann zwar Stück für Stück, was ich suchte, aber eben nicht auf einem Haufen. Ich behaupte also nicht, dass die folgende Lösung auf meinem Mist gewachsen ist, aber das Zusammenfügen, Kommentieren und Testen ist tatsächlich von mir.

Alles was man für die Lösung braucht ist die seit Windows 7 (oder sogar Vista?) direkt mitinstallierte PowerShell. Die etwas älteren PC-Nutzer kennen vermutlich noch die Kommandozeile aus MS-DOS, allerdings sind mittlerweile „einige“ Funktionen hinzugekommen. Die PowerShell kennt Variablen und Objekte und akzeptiert ganze Scripte.

Nach dem Start der PowerShell sollte folgendes Fenster erscheinen:

PowerShell nach dem Start

Nun navigieren wir zunächst zu dem Ordner, in dem wir Dateien umbenennen wollen. Das klappt ganz einfach mit folgendem Befehl:

cd c:\Users\%username%\Pictures\Urlaub 2014\

Statt %username% kommt natürlich der eigene Nutzername hin und aufgepasst bei den Eigenen Dateien, es werden die englischen Namen für die Ordner verwendet. Glück im Unglück, wenn man Tab drückt, bekommt man automatisch Vorschläge gemacht und muss nicht alles genau abtippen.

Jetzt da wir im Ordner sind, geht es los. Zunächst sagen wir der PowerShell, welche Nummer wir zuerst wollen.

$i=1

Als nächstes kommt die eigentliche Befehlskette. Tipp: Den Code hier kopieren und per Rechtsklick in die PowerShell einfügen.

Get-ChildItem -Filter *.jpg
 | ForEach-Object {
 $ext =$_.Extension.ToLower();
 $newName = 'Bild{0:d3}{1}' -f $i,$ext;
 $i++;
 Rename-Item $_.FullName -NewName $newName
 }

Aber was passiert hier eigentlich? Zunächst einmal holt sich die PS per Get-ChildItem alle Elemente in unserem Ordner. Da wir ja nur die Bilder wollen, setzen wir noch einen Filter auf alle Dateien, die mit .jpg enden.

Darauf folgt das | Zeichen. Dieses „Pipe“ bedeutet nichts anderes als: Nimm jedes Element, das du gefunden hast, und reiche es an den Befehl rechts weiter. ForEach-Object beginnt dann mit einer Schleife, also „für jedes Objekt, mach das, was in der geschweiften Klammer steht“. Das weitergegebene Objekt wird immer in der Variable $_ gespeichert. Zuerst wird die Variable $ext gesetzt, welche die Dateiendung speichert. Damit funktioniert das Script nach einer Anpassung des Filters auch zum Beispiel mit .nef oder .png.

Als nächstes wird die Variable $newName mit dem neuen Dateinamen befüllt, nämlich „Bild“ und dann zwei Platzhaltern in geschweiften Klammern. Für die Befüllung der Platzhalter ist dann die Option -f zuständig, der wir die Werte der Variablen $i und $ext übergeben. In Worten bekommt die Variable $newName dann folgenden Wert: Das Wort „Bild“, dann den Wert der Variable $i, aber als dreistellige Dezimale (beginnend bei 001) und zum Schluss die vorher gespeicherte Endung.

Danach wird nur noch die Variable $i um eins erhöht und mit Hilfe von Rename-Item die Datei umbenannt. Der volle Name des übergebenen Objekts wird mit Hilfe der Option -NewName mit dem Inhalt der Variable $newName überschrieben.

Natürlich könnte man statt Bild auf Video oder Text oder sonstwas verwenden und statt 3 Stellen könnte man auch 4 oder 5 nehmen.

Wichtig sind mir zum Abschluss noch folgende Hinweise:

  • Vor dem ersten Versuch ein Backup machen. Ich will nicht für verlorene Daten verantwortlich sein.
  • Wenn man die Prozedur für mehrere Sammlungen verwendet, immer pro Ordner die Variable $i zurücksetzen ($i = 1), denn sonst geht die Zählung da weiter, wo im alten Ordner aufgehört wurde.
  • Falls es Probleme mit dem Zugriff gibt, die PowerShell als Administrator ausführen.