Tags: Datei-Management, PowerShell
Beim Wechsel von cmd.exe auf PowerShell erfordern oft einfache Aufgaben eine Umstellung, so auch das Umbenennen von Dateien. Das dafür zuständige Cmdlet Rename-Item ist keineswegs nur das Äquivalent zum ren-Befehl - seine Verwendung ist zwar ähnlich, bloß dass es weniger kann als das alte Kommando.
Dass PowerShell nicht immer bessere Mittel bietet als die alte Eingabeaufforderung, zeigt sich etwa schon beim Kopieren und Verschieben von Dateien. Beim Umbenennen sieht es ähnlich aus, weil Rename-Item keine Wildcards akzeptiert. Möchte man eine Aktion auf mehrere Dateien anwenden, so kann man dieses Defizit jedoch durch andere Fähigkeiten von PowerShell mehr als kompensieren.
Umbenennen einzelner Dateien
In der einfachsten Form ruft man Rename-Item mit den Parametern -Path und -NewName auf, die dem Cmdlet den alten und neuen Namen einer einzelnen Datei übergeben. Wenn man dabei Tipparbeit sparen möchte, lässt man die Namen der Parameter weg und verwendet das Alias ren:
ren en_windows_8_x86_dvd_915417.iso en_windows8_x86.iso
Auf diese Weise hat man den von cmd.exe gewohnten Befehl zurückgewonnen, nur ohne Unterstützung für Wildcards. Gleich ist auch die Eigenart, dass man den Pfad nur beim alten Dateinamen angeben muss, wenn man eine Datei in einem anderen Verzeichnis umbenennen möchte:
ren ..\Windows_8-1_Licensing_Guide.pdf Windows_81_Licensing.pdf
In diesem Beispiel bleibt die .pdf-Datei unter ihrem neuen Namen im übergeordneten Verzeichnis.
Mehrere Dateien umbenennen mit Regex
Wenn man mehrere Dateien umbenennen möchte, muss man ein Cmdlet zu Hilfe nehmen, das in Lage ist, Wildcards auszuwerten und die Liste der zutreffenden Dateinamen zurückgibt. Darüber hinaus benötigt man einen Mechanismus, der bestimmte Muster in den Dateinamen durch eine gewünschte Zeichenkette ersetzt:
Get-ChildItem *.pdf | Rename-Item -NewName {$_.Name -replace '20\d{2}','2013'}
Get-ChildItem ist das Cmdlet, das die Liste der Dateinamen liefert, und der Operator -replace erlaubt ein Suchen und Ersetzen mit Hilfe von regulären Ausdrücken. Im obigen Beispiel werden alle PDF-Dateien im aktuellen Verzeichnis umbenannt, wenn ihr Name die Zeichenkette "20" plus 2 unmittelbar darauf folgende Ziffern enthält. Dann wird "2010" oder "2011" durch "2013" ersetzt.
Angenommen, man hat mehrere Dokumente nach dem Muster "Rechnung"-<Monat>-<Jahr>".xls" benannt und möchte nun im Namen Monat und Jahr vertauschen, dann könnte man das mit diesem Befehl bewerkstelligen:
gci *.xls | Rename-Item -NewName {$_.Name -replace "Rechnung-(\d{2})-(\d{4})",'Rechnung-$2-$1.xls'}
Verwendung von String-Funktionen
Bei der Umbenennung von Dateien stehen nicht nur reguläre Ausdrücke zur Verfügung, vielmehr kann man sich dabei auch der verschiedenen String-Funktionen bedienen. Zum Beispiel könnte man mit Substring() einen Teil des Namens extrahieren, in diesem Fall würde man den ersten Buchstaben wegschneiden:
Get-ChildItem *.pdf | Rename-Item -NewName {$_.Name.Substring(1)}
Alternativ wäre es möglich, mit ToLower() den Dateinamen in Kleinbuchstaben oder mit ToUpper() in Großbuchstaben zu konvertieren.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links
7 Kommentare
Hallo,
das ist echt cool, ich hab erst überlegt Rename mit Java, C und co, aber das geht leichter und schneller.
Ich verwende es für meine Game Screenshots:
gci *.png | Rename-Item -NewName {$_.Name -replace "ffxiv_(\d{2})(\d{2})(\d{4})_(\d{2})(\d{2})(\d{2})",'ffxvi_$3-$2-$1_$4-$5-$6'}
Macht aus ffxiv_31122014_235959.png -> ffxiv_2014-12-31_23-59-59.png
Dabei musste ich am ende .png weglassen sonst doppelt.
Vielen Dank.
Wow, das war gerade mein erster erfolgreich ausgeführter Powershell-Befehl. Vielen Dank für diesen Beitrag.
Schon bei meinem ersten "Benenne alle .txt-Dateien in .patch" um kann ich erahnen welche Macht hinter der Powershell steckt. Allerdings frage ich mich auch wie man die cmd.exe mit ihrem superschnellen
ren *.txt *.patch
ernsthaft mit einemGet-ChildItem *.txt | Rename-Item -NewName {$_.Name.Replace(".txt", ".patch")}
ersetzen will.Wenn man nur die Namenserweiterung ändern will, dann braucht man keine regulären Ausdrücke. Dafür reicht auch
gci *.txt | ren -NewName {$_.BaseName + ".patch"}
Das Beispiel sollte demonstrieren, dass mit regex ein fast beliebiges Umbenennen möglich ist.
Guten Tag,
vielen Dank für Ihre Erklärungen. Nun habe ich eine Frage. Ich möchte bei einigen Dateien, die keine Dateiendung haben, .jpg am Ende anfügen. (Früher in der Eingabeaufforderung einfach "ren *.* *.jpg".) Ich hatte dann einfach versucht in Ihrem Beispiel, patch durch jpg und .txt durch ein Leerzeichen bzw. durch ein .* zu ersetzen. Leider hat beides nicht geklappt. Können Sie mir weiterhelfen? Vielen Dank im Voraus.
MfG
Elke Herbst
Es sind ja im Endeffekt zwei Fragen:
Eine Datei hat die Eigenschaft .Extension.
Wir können uns also alle Dateien merken für welche die Extension leer ist:
$noExtension = gci | where {$_.Extension -eq ''}
Das Umbenennen wäre, wie gewohnt, recht einfach:
$noExtension | ren -NewName {$_.BaseName + ".jpg"}
Fronzel Neekburm, vielen Dank für die schnelle Antwort. Damit funktioniert es einwandfrei!
Viele Grüße
Elke Herbst
Hallo Fronzel Neekburm, deine Anleitung ist absolut Spitze, hat mein Anliegen in Sekunden erledigt. Vielen Dank! Liebe Grüße Jürgen