martinstein
Goto Top

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

Content-Key: 148074

Url: https://administrator.de/contentid/148074

Printed on: April 25, 2024 at 10:04 o'clock

Mitglied: 77559
77559 Aug 01, 2010 at 14:17:12 (UTC)
Goto Top
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
Member: bastla
bastla Aug 01, 2010 at 14:29:17 (UTC)
Goto Top
Hallo martinstein!

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
Für die Testphase steht vor dem Befehl zum Umbenennen (Zeile 15) noch ein "echo" - damit wird nur angezeigt, was passieren würde, wenn Du das "echo" entfernst.

Da wir gerade "Code-Qualitäts-Wochen" haben face-wink, 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" face-wink) [/Edit]
Member: martinstein
martinstein Aug 01, 2010 at 14:53:54 (UTC)
Goto Top
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?

Viele Grüße

Martin

P.S. LotPings, ich hatte was mit tokens und delims probiert, bin aber grandios gescheitert...
Mitglied: 77559
77559 Aug 01, 2010 at 15:11:23 (UTC)
Goto Top
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 verdoppeln

P.S. LotPings, ich hatte was mit tokens und delims probiert, bin aber grandios gescheitert...
Nunja bastla hat dir das, was ich Kopf hatte, schon vorzeitg verraten - mein didaktischer Versuch wurde torpediert face-wink
Ansonsten natürlich ein vorbildlich kommentierter Batch.

Gruß
LotPings
Member: bastla
bastla Aug 01, 2010 at 16:58:25 (UTC)
Goto Top
@77559
Sorry wegen des Torpedos face-wink (den hatte ich schon auf die Reise geschickt, bevor ich Deinen Kommentar gesehen hatte), und danke für's Aushelfen face-smile ...

... 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 face-wink (hatte ich leider beim Posten verschlimmbessert, korrigiere das aber - der Ordnung halber - auch oben noch) ...

Grüße
bastla
Member: martinstein
martinstein Aug 01, 2010 at 20:09:34 (UTC)
Goto Top
Nochmals vielen Dank - das hat geklappt. Das mit dem for hätte ich ja VIELLEICHT noch hinbekommen, aber spätestens bei dem ren wäre dann Ende gewesen :o(
Member: Biber
Biber Aug 02, 2010 at 07:45:07 (UTC)
Goto Top
[OT]

Moin alle,

eine so klar formulierte Umbenenn-Frage und so sauber hergeleitete Lösungen habe ich schon mehrere Montage nicht vorgefunden hier.

Danke an euch alle drei.

Grüße
Biber
[/OT]