PowerShell - Dateien umbenennen
Hallo,
ich möchte Dateien umbenennen, jedoch fehlen mir die Kenntnisse um den richtigen Ausdruck zu formulieren.
An sich weiß ich wie man mit get-child item und rename-item umgeht jedoch bekomme ich folgenden Fall nicht hin:
Habe in einem Ordner sehr viele Dateien die nach folgendem Schema umbenannt werden sollen:
—9876543210.abcdefg.pdf
—9876543211.abcdefg.pdf
Am Ende sollen der Dateiname so aussehen:
Abcdefg.—9876543210.pdf
Wie vermittele ich PowerShell, dass er die ersten 12 Zeichen hinten oder besser noch vor die file-Extension anhängt.
Danke für eure Hilfe
ich möchte Dateien umbenennen, jedoch fehlen mir die Kenntnisse um den richtigen Ausdruck zu formulieren.
An sich weiß ich wie man mit get-child item und rename-item umgeht jedoch bekomme ich folgenden Fall nicht hin:
Habe in einem Ordner sehr viele Dateien die nach folgendem Schema umbenannt werden sollen:
—9876543210.abcdefg.pdf
—9876543211.abcdefg.pdf
Am Ende sollen der Dateiname so aussehen:
Abcdefg.—9876543210.pdf
Wie vermittele ich PowerShell, dass er die ersten 12 Zeichen hinten oder besser noch vor die file-Extension anhängt.
Danke für eure Hilfe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 663159
Url: https://administrator.de/forum/powershell-dateien-umbenennen-663159.html
Ausgedruckt am: 13.05.2025 um 05:05 Uhr
29 Kommentare
Neuester Kommentar
Moin Toweliee,
da du hier keinen Code postest wie weit du bist, poste ich auch keinen Code, sondern nur den Weg zur Lösung
Den Befehl, den du braust ist Substring. schön beschrieben unter anderem Hier oder auch hier. Meine Vorgehensweise wäre dabei:
Viel Spass
Gruß
Doskias
Nachtrag: Hab es grade mal für dich gebaut und getestet: 5 Minuten, 10 Zeilen (ja ich hab es ausführlich gemacht).
da du hier keinen Code postest wie weit du bist, poste ich auch keinen Code, sondern nur den Weg zur Lösung
Den Befehl, den du braust ist Substring. schön beschrieben unter anderem Hier oder auch hier. Meine Vorgehensweise wäre dabei:
$variable=get-childitem um die Dateien (?) zu finden
$Dateiname=$variable.name
Dateiname in 3 Teile (ersten 12, Rest bist auf die Dateiendung, Dateiendung) mittels substring splitten
Die 3 Teile aus der Reihenfolge 1 - 2 -3 in die Reihenfolge 2 - 1 - 3 in eine neue Variable $neuer_Name speichern
Umbenennen Von $Dateiname in $Neuer Name
Viel Spass
Gruß
Doskias
Nachtrag: Hab es grade mal für dich gebaut und getestet: 5 Minuten, 10 Zeilen (ja ich hab es ausführlich gemacht).

Oder man arbeitet mit Replace oder alternativ auch mit Split
oder macht vorher nen Check mit -match und nutzt die Regex Submatches
ls 'd:\ordner' -File -Filter *.pdf | %{rename-item $_.Fullname -NewName {$_.Name -replace '^(.{12})\.([^\.]+)(.*)','$2.$1$3'} -verbose -force}
ls 'd:\ordner' -File -Filter *.pdf | ?{$_.Basename -match '^(.{12})\.(.*)'} | %{rename-item $_.FullName -NewName {"$($matches[2]).$($matches[1])$($_.Extension)"} -verbose -force}
Ausführlich und Schritt für Schritt anstand in einer Zeile:
Die Datei —9876543210.abcdefg.pdf befindet sich im Ordner C:\temp\test
Gruß
Doskias
Die Datei —9876543210.abcdefg.pdf befindet sich im Ordner C:\temp\test
$Ordner="c:\temp\test"
$aktuelle_Datei=Get-ChildItem $Ordner
$Dateiname=$aktuelle_Datei.Name
$Dateilaenge=$Dateiname.Length
$Teil1=$Dateiname.Substring(0,12)
$Teil2=$Dateiname.Substring(12,$Dateilaenge-15)
$Teil3=$Dateiname.Substring($Dateilaenge-3)
$neuer_name=$Teil2+$Teil1+$Teil3
Rename-Item $Ordner\$aktuelle_Datei $neuer_name
Gruß
Doskias
Keine Ahnung :D
Prüfe mal den Dateinamen. Was macht Zeile 6?
Es nimmt den Substring und beginnt am 12ten Zeichen und zeigt dann Dateilänge (Zeile 4) minus 15 Zeichen an. Wieso minus 15 zeichen:
12 Sind im ersten Teil, 3 sind die Dateiendung. Wenn dein Dateiname zu kurz ist, dann ist Dateilaenge-15 kein gültiger wert mehr. Der Dateiname muss also mindestens 17 Zeichen lang sein.
Substring(a,b) beginnt an Position a und zeigt b Zeichen an
Substring (a) beginnt an Position a und zeigt alle folgenden Zeichen bis zum Ende an.
Gruß
Doskias
Prüfe mal den Dateinamen. Was macht Zeile 6?
Es nimmt den Substring und beginnt am 12ten Zeichen und zeigt dann Dateilänge (Zeile 4) minus 15 Zeichen an. Wieso minus 15 zeichen:
12 Sind im ersten Teil, 3 sind die Dateiendung. Wenn dein Dateiname zu kurz ist, dann ist Dateilaenge-15 kein gültiger wert mehr. Der Dateiname muss also mindestens 17 Zeichen lang sein.
Substring(a,b) beginnt an Position a und zeigt b Zeichen an
Substring (a) beginnt an Position a und zeigt alle folgenden Zeichen bis zum Ende an.
Gruß
Doskias
Ja dann klappt das so nicht mit dem Skript. ich war von exakt der Bezeichnung ausgegangen.
da hilft dir dann *split*
Splittet dabei den Dateinamen nach jedem Punkt. Du erhälst dann ein Array, welches du mit
aufrufen kannst. 0 für den ersten Eintrag, 1 für den zweiten ...
Bei —9876543210.abcdefg.pdf hättest du entsprechend 3 Werte im Array, bei —9876543210_7035_02_010_98_ay.pdf nur 2.
da hilft dir dann *split*
$Splitten=($Dateiname).split(".")
$splitten
Bei —9876543210.abcdefg.pdf hättest du entsprechend 3 Werte im Array, bei —9876543210_7035_02_010_98_ay.pdf nur 2.
Könnte man nicht auch eine Variante nehmen wie SchmitzKatz verwenden?
Klar. Die macht das gleiche, aber halt nur in einem Einzeiler. Ich bin nur ein Freund von Mehrzeilern, da Neulinge da eher verstehen wie Powershell funktioniert und arbeitet.Wie schon gesagt, die ersten 12 Zeichen sollen vor die file-Extension.
Das ist mit meinem Skript möglich. Wenn du das verstanden hast musst du nur in Zeile 6 und 7 eine Kleinigkeit verändern, damit es geht ;)
Moin,
mal ein ganz anderer Vorschlag: Nimm regex. Das ist flexibler und sicherer:
Ungetestet. Das überlasse ich Dir.
hth
Erik
mal ein ganz anderer Vorschlag: Nimm regex. Das ist flexibler und sicherer:
PARAM(
$folder
)
$files = Get-ChildItem -Path $folder\*.pdf
foreach($file in $files) {
$file.basename -match "(.*)\.(.*)"
$newbasename = $Matches[2] + "." + $Matches[1]
Rename-Item -path $file.fullname -NewName "$$(file.directory)\$($newbasename)$($file.extension)"
}
Ungetestet. Das überlasse ich Dir.
hth
Erik
Wie ich dir gestern ja schon geschrieben habe musst du nur zwei Zeilen bei mir oben ändern:
Sollte eigentlich zuverlässig klappen, sofern du (a) immer mehr als 12 Zeichen im Dateinamen hast, zzgl. der Dateiendung, also 16 Zeichen gesamt und (b) immer nur Dateiendungen mit 3 Zeichen im entsprechenden Ordner hast.
Du kannst das ganze Skript natürlich noch verfeinern, indem du zum Beispiel mit

Wenn die nicht klappt, dann solltest du uns vielleicht noch mal einige Informationen zu deinen genauen Anforderungen und dem Aufbau der Dateien geben.
Gruß
Doskias
$Ordner="c:\temp\test"
$aktuelle_Datei=Get-ChildItem $Ordner
$Dateiname=$aktuelle_Datei.Name
$Dateilaenge=$Dateiname.Length
$Teil1=$Dateiname.Substring(0,12)
$Teil2=$Dateiname.Substring(12,$Dateilaenge-16)
$Teil3=$Dateiname.Substring($Dateilaenge-4)
$neuer_name=$Teil2+$Teil1+$Teil3
Rename-Item $Ordner\$aktuelle_Datei $neuer_name
Du kannst das ganze Skript natürlich noch verfeinern, indem du zum Beispiel mit
if ($Dateilaenge -gt 17)
Zeile 6 auf gültigkeit prüfst oder das ganzen Skript mit einer foreach-Schleife über den ganzen Ordner laufen lässt, anstatt einer Datei. Aber von deiner Aussage her, die da lautete, dass du *.pdf* hast, wo die ersten 12 Zeichen direkt vor die Dateiendung sollen und der Rest nach vorne rückt, sehe ich kein Problem mit meiner Lösung Wenn die nicht klappt, dann solltest du uns vielleicht noch mal einige Informationen zu deinen genauen Anforderungen und dem Aufbau der Dateien geben.
Gruß
Doskias
Zitat von @Toweliee:
Hallo Doskias,
habe es glaube ich fast. Es kommt noch die Fehlermeldung: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
Hallo Doskias,
habe es glaube ich fast. Es kommt noch die Fehlermeldung: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
Ob eine Datei vorhanden ist, lässt sich prüfen:
Test-Path $fileToCheck
Dafür gibt es ja foreach
Habe es mit folgenden Dateien erfolgreich getestet
Bei jedem Durchgang werden die ersten 12 Zeichen direkt vor die PDF-Endung geschrieben.
$Ordner="c:\temp\test\"
$Dateien=Get-ChildItem $Ordner
foreach ($aktuelle_Datei in $Dateien)
{
$Dateiname=$aktuelle_Datei.Name
$Dateilaenge=$Dateiname.Length
$Dateilaenge-3
$Teil1=$Dateiname.Substring(0,12)
$Teil2=$Dateiname.Substring(12,$Dateilaenge-16)
$Teil3=$Dateiname.Substring($Dateilaenge-4)
$neuer_name=$Teil2+$Teil1+$Teil3
Rename-Item $Ordner\$aktuelle_Datei $neuer_name
}

Hallo!
Ich suche eine Möglichkeit, dass mehrere PDFs in einem Ordner unter Unterordner umbenannt werden
Hauptpfad wäre zB \\Server\Rechnungen\
Der Aufbau sieht so aus
\\Server\Rechnungen\01234\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\8966544\ (hier sind drei PFDs drinnen)
\\Server\Rechnungen\46844444\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\98981\ (hier sind zwei PDFs drinnen)
usw
Der soll dann in einer for-schleife alle Unterordner lt. Hauptpfad durchgehen und zuerst prüfen, ob im Unterordner eine PDF-Datei vorliegt mit Dateiname ER.pdf. Wenn nicht, dann soll das Script jene Datei ermitteln, die als erstes erstellt wurde (ältestes Erstelldatum) und diese in ER.pdf umbenennen. Weitere PDFs in diesem Unterordner soll er überspringen.
Wäre das Möglich?
LG Roland
Ich suche eine Möglichkeit, dass mehrere PDFs in einem Ordner unter Unterordner umbenannt werden
Hauptpfad wäre zB \\Server\Rechnungen\
Der Aufbau sieht so aus
\\Server\Rechnungen\01234\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\8966544\ (hier sind drei PFDs drinnen)
\\Server\Rechnungen\46844444\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\98981\ (hier sind zwei PDFs drinnen)
usw
Der soll dann in einer for-schleife alle Unterordner lt. Hauptpfad durchgehen und zuerst prüfen, ob im Unterordner eine PDF-Datei vorliegt mit Dateiname ER.pdf. Wenn nicht, dann soll das Script jene Datei ermitteln, die als erstes erstellt wurde (ältestes Erstelldatum) und diese in ER.pdf umbenennen. Weitere PDFs in diesem Unterordner soll er überspringen.
Wäre das Möglich?
LG Roland

Zitat von @EleRoli:
Hallo!
Ich suche eine Möglichkeit, dass mehrere PDFs in einem Ordner unter Unterordner umbenannt werden
Hauptpfad wäre zB \\Server\Rechnungen\
Der Aufbau sieht so aus
\\Server\Rechnungen\01234\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\8966544\ (hier sind drei PFDs drinnen)
\\Server\Rechnungen\46844444\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\98981\ (hier sind zwei PDFs drinnen)
usw
Der soll dann in einer for-schleife alle Unterordner lt. Hauptpfad durchgehen und zuerst prüfen, ob im Unterordner eine PDF-Datei vorliegt mit Dateiname ER.pdf. Wenn nicht, dann soll das Script jene Datei ermitteln, die als erstes erstellt wurde (ältestes Erstelldatum) und diese in ER.pdf umbenennen. Weitere PDFs in diesem Unterordner soll er überspringen.
Wäre das Möglich?
LG Roland
Hallo!
Ich suche eine Möglichkeit, dass mehrere PDFs in einem Ordner unter Unterordner umbenannt werden
Hauptpfad wäre zB \\Server\Rechnungen\
Der Aufbau sieht so aus
\\Server\Rechnungen\01234\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\8966544\ (hier sind drei PFDs drinnen)
\\Server\Rechnungen\46844444\ (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\98981\ (hier sind zwei PDFs drinnen)
usw
Der soll dann in einer for-schleife alle Unterordner lt. Hauptpfad durchgehen und zuerst prüfen, ob im Unterordner eine PDF-Datei vorliegt mit Dateiname ER.pdf. Wenn nicht, dann soll das Script jene Datei ermitteln, die als erstes erstellt wurde (ältestes Erstelldatum) und diese in ER.pdf umbenennen. Weitere PDFs in diesem Unterordner soll er überspringen.
Wäre das Möglich?
LG Roland
$rootfolder = "\\Server\Rechnungen"
foreach($dir in Get-ChildItem $rootfolder -Directory | ?{!$_.GetFiles("ER.pdf")}){
Get-ChildItem $dir.Fullname -File -Filter *.pdf | sort CreationTime | select -First 1 | rename-item -NewName "ER.pdf" -verbose
}
ps. fürs nächste mal bitte beachten:
Diskussionsrichtlinien - die Regeln zu unseren Inhalten
Keine Takeovers. Versuche nicht, Beiträge anderer Autoren mit Ihren Fragen zu anderen Themen zu übernehmen. Eröffne lieber einen neuen eigenen Beitrag.

Zitat von @EleRoli:
Das funktioniert bei mir nicht. Wenn ich die ps1-Datei ausführe, dann öffnet sich die Datei. Woran könnte das liegen?
Da fehlen bei Dir wohl vollkommen die Powershell Grundlagen ... > Rechtsklick "Mit Powershell ausführen"Das funktioniert bei mir nicht. Wenn ich die ps1-Datei ausführe, dann öffnet sich die Datei. Woran könnte das liegen?
Kapitel 1: Erste Schritte mit PowerShell
Und vorher bitte die Execution-Policy in einer elevated Shell anpassen falls nötig!
Set-ExecutionPolicy RemoteSigned
Und doch, das Skript läuft hier einwandfrei im Test! Ergo => Grundlagen rein pfeifen, dann wieder kommen.
Hallo Siddius,
besten Dank. Es ist gegangen.
Zum Testen habe ich nur die Ordnerstruktur lt. Beispiel genannt. Tatsächlich habe ich noch weitere Dimension an Unterordner.
Eigentlich sieht es so aus
\\Server\Rechnungen\01234\Unterordner 1\(hier sind drei PFDs drinnen)
\\Server\Rechnungen\01234\Unterordner 2\(hier ist nur ein PDF drinnen)
\\Server\Rechnungen\8966544\Mehrere Unterordner... (hier sind drei PFDs drinnen)
\\Server\Rechnungen\46844444\Mehrere Unterordner... (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\98981\Mehrere Unterordner... (hier sind zwei PDFs drinnen)
Auf jeden Fall passt der zu untersuchende Startpfad \\Server\Rechnungen
LG Roland
besten Dank. Es ist gegangen.
Zum Testen habe ich nur die Ordnerstruktur lt. Beispiel genannt. Tatsächlich habe ich noch weitere Dimension an Unterordner.
Eigentlich sieht es so aus
\\Server\Rechnungen\01234\Unterordner 1\(hier sind drei PFDs drinnen)
\\Server\Rechnungen\01234\Unterordner 2\(hier ist nur ein PDF drinnen)
\\Server\Rechnungen\8966544\Mehrere Unterordner... (hier sind drei PFDs drinnen)
\\Server\Rechnungen\46844444\Mehrere Unterordner... (hier ist nur ein PDF drinnen)
\\Server\Rechnungen\98981\Mehrere Unterordner... (hier sind zwei PDFs drinnen)
Auf jeden Fall passt der zu untersuchende Startpfad \\Server\Rechnungen
LG Roland
Hallo,
ich habe den Code bissl umgeschrieben aber es geht nicht. Ziel ist, dass die in allen Unterordner die älteste Datei (Dateiname egal) herausgefiltert und eine Kopie mit Dateinamen er.pdf erstellt. Die älteste Datei soll bestehen bleiben.
Kann mir da bitte jemand weiterhelfen
LG Roland
ich habe den Code bissl umgeschrieben aber es geht nicht. Ziel ist, dass die in allen Unterordner die älteste Datei (Dateiname egal) herausgefiltert und eine Kopie mit Dateinamen er.pdf erstellt. Die älteste Datei soll bestehen bleiben.
$rootfolder = "\\Server\Rechnungen"
Get-ChildItem $rootfolder -Directory -Recurse | ?{!$_.GetFiles("er.pdf")} | %{Get-ChildItem $_.Fullname -File -Filter *.pdf | sort CreationTime | select -First 1 | Copy-Item -Destination $_.FullName\"er.pdf"}
Kann mir da bitte jemand weiterhelfen
LG Roland