Mehrere Dateien nach bestimmtem Muster umbenennen
Hallo zusammen,
kurz vorab: Ja, ich habe die Suche benutzt, verschiedene Sachen gefunden und ausprobiert. Und nein, es hat nicht geklappt, dafür kenn ich mich mit der Materie leider nicht gut genug aus.
Ich habe einen Ordner voll mit Dateien mit den Endungen .txt und .dat. Jeweils eine .txt-Datei und eine .dat-Datei gehören paarweise zusammen und haben außer der Endung den exakt gleichen Namen. Der Namensaufbau ist immer so: Protokoll_20100801-151901-203.txt bzw. Protokoll_20100801-151901-203.dat
Folgende Probleme versuche ich nun per Batch zu lösen:
1. Der Unterstrich soll durch ein Leerzeichen ersetzt werden
2. Das letzte Minus und die dreistellige Zahl dahinder sollen entfernt werden
3. Die restlichen Minus-Zeichen sollen durch Leerzeichen ersetzt werden
4. Die erste lange Zahl (im Beispiel 20100801) ist ein Datum und soll so von Minus-Zeichen unterbrochen werden, dass es 2010-08-01 heißt
5. Die zweite lange Zahl (im Beispiel 151901) ist eine Uhrzeit und soll so von Minus-Zeichen unterbrochen werden, dass es 15-19-01 heißt
Jeder Wink in die richtige Richtung ist willkommen.
Vielen Dank im Voraus für eure Hilfe und viele Grüße
Martin
kurz vorab: Ja, ich habe die Suche benutzt, verschiedene Sachen gefunden und ausprobiert. Und nein, es hat nicht geklappt, dafür kenn ich mich mit der Materie leider nicht gut genug aus.
Ich habe einen Ordner voll mit Dateien mit den Endungen .txt und .dat. Jeweils eine .txt-Datei und eine .dat-Datei gehören paarweise zusammen und haben außer der Endung den exakt gleichen Namen. Der Namensaufbau ist immer so: Protokoll_20100801-151901-203.txt bzw. Protokoll_20100801-151901-203.dat
Folgende Probleme versuche ich nun per Batch zu lösen:
1. Der Unterstrich soll durch ein Leerzeichen ersetzt werden
2. Das letzte Minus und die dreistellige Zahl dahinder sollen entfernt werden
3. Die restlichen Minus-Zeichen sollen durch Leerzeichen ersetzt werden
4. Die erste lange Zahl (im Beispiel 20100801) ist ein Datum und soll so von Minus-Zeichen unterbrochen werden, dass es 2010-08-01 heißt
5. Die zweite lange Zahl (im Beispiel 151901) ist eine Uhrzeit und soll so von Minus-Zeichen unterbrochen werden, dass es 15-19-01 heißt
Jeder Wink in die richtige Richtung ist willkommen.
Vielen Dank im Voraus für eure Hilfe und viele Grüße
Martin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148074
Url: https://administrator.de/contentid/148074
Ausgedruckt am: 24.11.2024 um 06:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo Martin,
so schwer ist das doch mit einer (oder auch zwei) for-schelifen nicht.
Von tokens und delims hast du ja bestimmt auch schon gelesen, damit das Aufsplitten von Datum/Zeit einfacher geht kommt noch eine Subroutine dazu.
Was has du denn schon an Code vorliegen ?
Gruß
LotPings
so schwer ist das doch mit einer (oder auch zwei) for-schelifen nicht.
Von tokens und delims hast du ja bestimmt auch schon gelesen, damit das Aufsplitten von Datum/Zeit einfacher geht kommt noch eine Subroutine dazu.
Was has du denn schon an Code vorliegen ?
Gruß
LotPings
Hallo martinstein!
Das könnte etwa so gehen:
Für die Testphase steht vor dem Befehl zum Umbenennen (Zeile 15) noch ein "
Da wir gerade "Code-Qualitäts-Wochen" haben , eine kurze Erläuterung des Ablaufes:
Nach dem Wechseln in den Ordner mit den vielen Dateien wird in der ersten "
Für jede der gefundenen Dateien erfolgt eine Zerlegung des Dateinamens anhand der Trennzeichen "_" und "-", wobei nur die ersten 3 Bestandteile ("
Der komplette Dateiname (%%i) und der Teil %%a werden nun als Parameter an das die eigentliche Arbeit leistende Unterprogramm ":ProcessFile" übergeben (die Variablen %Datum% und %Zeit% stehen dort auch zur Verfügung).
In besagtem Unterprogramm wird für die Umbenennung der neue Name stückweise zusammengefügt:
%%a wurde als zweiter Parameter übergeben und kommt daher als
Aus der Variable %Datum% werden einzeln Jahr (erste 4 Stellen), Monat (4 Stellen überspringen, dann 2 Stellen) und Tag (6 Stellen überspringen, dann 2 Stellen) extrahiert und, durch "-" verbunden, in den neuen Namen eingebaut.
Die Zerlegung und Neu-Zusammensetzung der Uhrzeit erfolgt auf die gleiche Weise.
Schließlich wird noch der "Original"-Datentyp (aus dem kompletten Dateinamen = Parameter 1 =
Grüße
bastla
[Edit] Fehlendes %-Zeichen ergänzt (von wegen "Code-Qualität" ) [/Edit]
Das könnte etwa so gehen:
@echo off & setlocal
set "Ordner=D:\Der wo voll mit Dateien ist"
set "Dateien=*_*-*-*.txt *_*-*-*.dat"
pushd "%Ordner%"
for /f %%i in ('dir /b /a-d %Dateien% 2^>nul') do for /f "tokens=1-3 delims=_-" %%a in ("%%i") do (
set "Datum=%%b"
set "Zeit=%%c"
call :ProcessFile "%%i" "%%a"
)
popd
goto :eof
:ProcessFile
echo ren %1 "%~2 %Datum:~,4%-%Datum:~4,2%-%Datum:~6,2% %Zeit:~,2%-%Zeit:~2,2%-%Zeit:~4,2%%~x1"
goto :eof
echo
" - damit wird nur angezeigt, was passieren würde, wenn Du das "echo
" entfernst.Da wir gerade "Code-Qualitäts-Wochen" haben , eine kurze Erläuterung des Ablaufes:
Nach dem Wechseln in den Ordner mit den vielen Dateien wird in der ersten "
for
"-Schleife nach allen zum Dateimuster (den Dateimustern) passenden Dateien gesucht.Für jede der gefundenen Dateien erfolgt eine Zerlegung des Dateinamens anhand der Trennzeichen "_" und "-", wobei nur die ersten 3 Bestandteile ("
tokens
") verwendet werden. %%a enthält den Teil vor dem "_" und kann daher unverändert bleiben, in %%b und %%c stehen Datum und Uhrzeit - damit diese in weiterer Folge zerlegt werden können, werden sie Variablen zugewiesen.Der komplette Dateiname (%%i) und der Teil %%a werden nun als Parameter an das die eigentliche Arbeit leistende Unterprogramm ":ProcessFile" übergeben (die Variablen %Datum% und %Zeit% stehen dort auch zur Verfügung).
In besagtem Unterprogramm wird für die Umbenennung der neue Name stückweise zusammengefügt:
%%a wurde als zweiter Parameter übergeben und kommt daher als
%2
an - da er bei der Übergabe vorsichtshalber (falls dieser Bestandteil Leerzeichen enthielte) unter Anführungszeichen gesetzt wurde, müssen diese nun wieder entfernt werden - Schreibweise daher: %~2
Aus der Variable %Datum% werden einzeln Jahr (erste 4 Stellen), Monat (4 Stellen überspringen, dann 2 Stellen) und Tag (6 Stellen überspringen, dann 2 Stellen) extrahiert und, durch "-" verbunden, in den neuen Namen eingebaut.
Die Zerlegung und Neu-Zusammensetzung der Uhrzeit erfolgt auf die gleiche Weise.
Schließlich wird noch der "Original"-Datentyp (aus dem kompletten Dateinamen = Parameter 1 =
%1
mit %~x1
" entnommen) hinzugefügt.Grüße
bastla
[Edit] Fehlendes %-Zeichen ergänzt (von wegen "Code-Qualität" ) [/Edit]
Zitat von @martinstein:
Hallo,
vielen, vielen Dank! bastlas Lösung macht zwar zunächst GENAU was sie soll, aber wenn's an das Anhängen der
Dateiendung geht, verpasst das Script den .txt-Dateien die Endung ~x1 (ohne Punkt) und will dann offenbar den .dat-Dateien auch
die Endung ~x1 verpassen, streikt ab da aber komplett! Sieht jemand das letzte Puzzlestück?
Das eine %-Zeichen vor ~x1 musst du nur verdoppelnHallo,
vielen, vielen Dank! bastlas Lösung macht zwar zunächst GENAU was sie soll, aber wenn's an das Anhängen der
Dateiendung geht, verpasst das Script den .txt-Dateien die Endung ~x1 (ohne Punkt) und will dann offenbar den .dat-Dateien auch
die Endung ~x1 verpassen, streikt ab da aber komplett! Sieht jemand das letzte Puzzlestück?
P.S. LotPings, ich hatte was mit tokens und delims probiert, bin aber grandios gescheitert...
Ansonsten natürlich ein vorbildlich kommentierter Batch.
Gruß
LotPings
@77559
Sorry wegen des Torpedos (den hatte ich schon auf die Reise geschickt, bevor ich Deinen Kommentar gesehen hatte), und danke für's Aushelfen ...
... wobei genau genommen das %-Zeichen nicht verdoppelt, sondern das fehlende %-Zeichen (am Ende von "%Zeit:~4,2%" oder eben für "%~x1") ergänzt werden muss (hatte ich leider beim Posten verschlimmbessert, korrigiere das aber - der Ordnung halber - auch oben noch) ...
Grüße
bastla
Sorry wegen des Torpedos (den hatte ich schon auf die Reise geschickt, bevor ich Deinen Kommentar gesehen hatte), und danke für's Aushelfen ...
... wobei genau genommen das %-Zeichen nicht verdoppelt, sondern das fehlende %-Zeichen (am Ende von "%Zeit:~4,2%" oder eben für "%~x1") ergänzt werden muss (hatte ich leider beim Posten verschlimmbessert, korrigiere das aber - der Ordnung halber - auch oben noch) ...
Grüße
bastla