Batch Dateinamen ändern

Hallo,

ich habe folgende Verzeichnisstruktur

R:_ToRename\
R:_ToRename\20110522\1\
R:_ToRename\20110523\1\
R:_ToRename\20110524\1\
usw.
In diesen Verzeichnissen befinden sich die Dateien, die ich per batch-Datei umbennen möchte.

Die Dateien haben folgendes Format:
zB 00606E909A1D_m20110523232230.jpg

Nun möchte nun den Teil nach dem „m“ behalten, da dieses das Datum mit Uhrzeit ist. Vor dem Zeitstring noch „cam1_“ davor, den Teil mit der Zeit der Lesbarkeit wegen mit Unterstrichen unterteilen, und ans Ende (vorm Suffix) „_2“ dranhängen.

Die Datei soll nach dem Umbennen wie folgt heissen:
cam1_20110523_232230_2.jpg

Die Batch-Datei befindet sich in R:\ToRename\

Folgendes habe ich erstes gemacht:

@echo off
set Quelle=„R:_ToRename“
Set DateiFilter="*.jpg"
for /r %Quelle% %%i in (%DateiFilter%) do rename %%i %%~ni_Test.jpg
pause

Das funktioniert schon mal. Nun habe ich aber Probleme, den Dateinamen auseinander zu nehmen. Versucht habe ich verschiedenes mit Variablenzuweisung der Teile des Dateinames mit Part1=%%i:~15,8 und Part2=%%i:~23,6. Danach dann NewName=cam1_%Part1%_%Part2%_2.jpg
rename %%i=%NewName%.jpg

Versuche habe ich auch mit For /f "tokens= und delims probiert, aber da blicke ich garnicht durch.

Ich hoffe, ich habe mein Anliegen verständlich erklärt, und es kann mir jemand helfen.

Besten Dank schon mal
docluma
PS: ach ja, batch läuft auf xp, nicht auf win-servern

Ich würde die Bildung der neuen Dateinamen in Excel mit Hilfe der Textfunktion TEIL() erledigen. Dann würde ich in der BATCH-Datei den alten Datennamen einlesen und gegen den mittels Excel gebildeten neuen Dateinamen renamen.

Mag eleganter gehen. Aber so kommt man auch zum Ziel.

Gutes Gelingen!
Peter

PS: bin erst wieder in der kommenden Woche erreichbar!

Hallo Peter,

danke für den Tipp. Aber Thema völlig verfehlt. Excel-VBA kann ich auch programmieren. Ich habe aber nach einer Batch-Lösung gesucht, da die Batch-Datei täglich automatisch als geplanter Task ausgeführt wird.

Wenn Sie in ein Auto-Geschäft gehen, um sich über ein bestimmtes Auto zu informieren, möchten Sie ja auch nicht wissen , was die Konkurrenz so kann.

Ich habe das extra unter der Rubrik Batch gestellt, um eine Batch-Lösung zu bekommen. Wollte ich Excel, würde ich es in Excel reinstellen. Ausserdem gibt es ja dazu noch Tools, die Datei-Umbenennen können.

Also, wenn Sie zu Batch nix wissen, dann schreiben Sie auch bitte nix.

Danke

  1. ist das Thema nicht verfehlt. Denn das Excel-ergebnis wäre in die BAT einzuarbeiten und dann haben Sie eine Batchlösung. Es steht NIRGENDS, dass es eine REINE Batchlösung sein soll.

  2. Sie haben die Anfrage DIREKT an mich gerichtet - Sie haben diese NICHT in eine BATCH-„Rubrik“ gestellt.

  3. Wenn ich daher persönlich gefragt werde, dann muss ich gemäß W-W-W Spielregeln auch antworten. Letzteres wird aber für derart unfreundliche User wie Sie nicht mehr der Fall sein.

Wie soll denn bitte schön eine Excel-VBA_lösung in eine Batch-Datei eingearbeitet werden. Die Progarmmierung und vor allem die Syntax ist doch eine völlig andere. Ausserdem ist deutlich beim Thema „batch Dateinamen ändern“ angegeben, und nicht „Excel Dateinamen ändern“. Auch habe ich in der Anfrage nur von Batch-Dateien gesprochen, und nicht nach Alternativ-Lösungen gefragt.

Natürlich habe ich Sie angeschrieben, weil WWW Sie mir als Experten für Batch-Lösungen genannt hat. Eine Antwort kann dann in dem Fall auch so aussehen, dass Sie schreiben, Sie hätten für dieses Problem keine Lösung. Dann wäre ich doch auch zufrieden.

Unfreundlich ist man gleich dann, wenn man seine objektive Meinung über falsche Lösungsansätze äussert. Wer sich bei konstruktiver Kritik auf den Schlips getreten fühlt…

Zudem habe ich in der zwischenzeit mehrere Zuschriften mit Super-Lösungen bekommen.

Danke

Hallo,

ich schau mal was sich machen lässt, könnte allerdings bis Morgen dauern da ich mich noch nicht so extrem mit dem Umbenennen von Dateien auseinander gesetzt habe :smiley:

Grüße

Danke für die Hilfe, aber ich habe schon eine Lösung.
Gruß
docluma

Hallo docluma,
danke für die gute Einleitung. Das Problem ist auf jeden Fall lösbar. Aber der Reihe nach:

Schritt 1:
Es empfiehlt sich, am Anfang vor

set Quelle

noch eine Zeile einzuschieben:

SetLocal

Deshalb kommt nach

pause

eine weitere Zeile hinzu:

EndLocal

Dadurch werden die Umgebungsvariable nur lokal verwendet und nach dem Ausführen der Batchdatei wieder gelöscht.

Schritt 2:
Bei der Entwicklung von Batchdateien hat es sich bei mir bewährt, auf die erste Zeile

@echo off

ganz zu verzichten. Stattdessen setze ich vor jede Zeile @ gefolgt von vier Leerzeichen.
Das bewirkt, dass ich sehr schnell auswählen kann, welche Zeile mir beim Ablaufen angezeigt werden soll.
Durch die vier Leerzeichen kann ich einzelne Zeilen kurzfristig deaktivieren. Das könnte dann so aussehen:

@ Set Quelle="R:\_ToRename"
@Rem Set DateiFilter="\*.jpg"

usw.

Schritt 3:
Durch das Verwenden einer for Schleife ist es notwendig, die dadurch gewonnenen Ergebnisse weiterverarbeiten zu können. Für die Aufgabe ist das jedoch mit einem einzigen Befehl nicht möglich. Deshalb rufen wir die Batchdatei ein zweites Mal auf.
Ich nenne die Batchdatei in meinem Beispiel „BRen.bat“. Somit verändert sich die Zeile so:

@ for /r %Quelle% %%I in (%DateiFilter%) do BRen %%i %%~ni\_Test.jpg

Um eine Endlosschleife zu vermeiden, muss nun die Batchdatei erkennen, ob sie von der for Schleife aufgerufen wurde.
Da beim Aufruf zwei Parameter übergeben wurde, kann das als Unterscheidungsmerkmal verwendet werden.
Dazu kommt nach der Zeile

SetLocal

eine neue Zeile:

@ If "%1" neq "" Goto R

Wenn also die Batchdatei mit einem Parameter aufgerufen wird, dann springt die Programmausführung zum Label R.
Also müssen wir noch ein paar Label / Sprungmarken einfügen:
Vor die Zeile

@ EndLocal

fügen wir eine zwei neue Zeilen ein:

> R  
> End

Die Zeile

pause

ersetzen wir durch

Goto End

.

Nun wäre das Ganze schon lauffähig, aber man sieht noch nichts.
Deswegen füge wir nach der Zeile

:R

noch drei weitere Zeilen ein:

@ Echo.
@ Echo P1 : %1
@ Echo P2 : %2

Damit ist das Problem zwar immer noch nicht gelöst, aber die Beschränkungen der for Schleife haben wir erfolgreich überwunden.

Schritt 4:
Um zu verhindern, dass beim Ausführen des Programms der erneute Aufruf angezeigt wird, setzen wir in der Zeile mit for vor BRen noch ein @:

@ for /r %Quelle% %%i in (%DateiFilter%) do @BRen %%i %%~ni\_Test.jpg

Zur besseren Lesbarkeit habe ich noch ein paar Leerzeilen eingefügt.
Das Ganze könnt dann so aussehen:

@ SetLocal

@ If "%1" neq "" Goto R

@ set Quelle=".\_ToRename"
@ set DateiFilter="\*.jpg"
@ for /r %Quelle% %%i in (%DateiFilter%) do @BRen %%i %%~ni\_Test.jpg
@ Goto End



> R

@ Echo.
@ Echo P1 : %1
@ Echo P2 : %2



> End

@ EndLocal

Die nächsten Schritte folgen.
Erst mal ausprobieren, ob soweit alles funktioniert!

Fortsetzung zur Antwort mit den Schritten 1 - 3!

Schritt 4:
Im Programmteil R fügen wir nach dem Programmteil

@ Echo.
@ Echo P1 : %1
@ Echo P2 : %2

noch folgende Zeilen ein, damit der Dateiname umbenannt werden kann:

@ Set P2=%2
@ Set P2=%P2:\*m=%
@ Set P2=cam1\_%P2:~0,8%\_%P2:~8,6%\_2.jpg
 Rem Ren %1 %P2%

Ein Testlauf zeigt, dass es noch nicht ganz passt!

Schritt 5:
Der Dateifilter *.jpg findet Dateien mit altem und neuem Dateinamen. Das führt jedoch zu Problemen in der for Schleife.
Deshalb wird der Dateifilter so angepasst, dass nur noch Dateien mit altem Dateinamen gefunden werden:

@ Set DateiFilter="????????????\_m\*.jpg"

Ein Testlauf zeigt, dass es nun funktionieren würde und man kann die Batchdatei scharf schalten, indem die Zeile mit dem Rename-Befehl geändert wird:

@ Ren %1 %P2%

Die Batchdatei funktioniert nur unter folgenden Voraussetzungen:

  • die Befehlserweiterung muss aktiviert sein
  • im Pfad darf kein Leerzeichen enthalten sein
  • es gibt nur ein m im Dateinamen
  • der Dateinamen ist immer aufgebaut, wie in der Frage beschrieben

Die fertige Batchdatei könnte dann so aussehen:

@ SetLocal

@ If "%1" neq "" Goto R

@ set Quelle=".\_ToRename"
@ set DateiFilter="????????????\_m\*.jpg"
@ for /r %Quelle% %%i in (%DateiFilter%) do @BRen %%i %%~ni\_Test.jpg
@ Goto End



> R

@ Set P2=%2
@ Set P2=%P2:\*m=%
@ Set P2=cam1\_%P2:~0,8%\_%P2:~8,6%\_2.jpg
@ Ren %1 %P2%



> End

@ EndLocal