Rename-Item: Dateien umbenennen in 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 Eingabe­auf­for­derung, 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 ver­tau­schen, 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.

    3 Kommentare

    Bild von Robert Szcz.
    Robert Szcz. sagt:
    10. Januar 2014 - 4:36

    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.

    Bild von Fronzel Neekburm
    Fronzel Neekburm sagt:
    23. November 2016 - 18:45

    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 einem Get-ChildItem *.txt | Rename-Item -NewName {$_.Name.Replace(".txt", ".patch")} ersetzen will.

    Bild von Wolfgang Sommergut
    23. November 2016 - 21:29

    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.