cargotrans
Goto Top

Batch-Datei mit FOR-Schleife zum Umbenennen von Dateien

Hallo Zusammen,

ich habe in einem Verzeichnis mehrere TIF-Dateien an die ich an den Dateinamen eine Zeichenfolge voran setzen muss.

Dazu habe ich mir eine Batchdatei geschrieben, die soweit auch funktioniert, allerdings bekomme ich immer bei einer Datei die Zeichenfolge doppelt voraus gesetzt.

Beispiel:
Dateinamen lauten: 12345678_0001.tif
Vorne an den Dateinamen sollen die Zeichen "9999-" voran gestellt werden,
also nach "9999-12345678_0001.tif" geändert werden.

die Batchdatei:
@echo off
for %%i in (*.tif) do ren %%i 9999-%%i
endlocal
)

Es werden mir alle Dateien korrekt umbenannt, lediglich eine Datei hat dann das 9999- doppelt vorne dran, also "9999-9999-12345678_0001.tif"

Könnten mir jemand bitte auf die Sprünge helfen, wo ich noch einen Fehler im Skript habe.

Besten Dank

Content-ID: 378959

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

Xerebus
Lösung Xerebus 03.07.2018 um 15:22:56 Uhr
Goto Top
Fehlt nach dem "do" keine Klammer?
cargotrans
cargotrans 03.07.2018 um 15:53:15 Uhr
Goto Top
Du meinst so:

@echo off
for %%i in (*.tif) do ( ren %%i 9999-%%i
endlocal
)

Ich habe die Klammer eingefügt, hat aber keine Auswirkung.

Eine Datei bekommt immer den doppelten Suffix.
Und bei mehr ca. mehr als 300 Dateien spinnt die Schleife komplett, dann läuft das endlos und hängt immer wieder das "9999-" mit vorne an den Dateinamen. Wenn im Verzeichnis weniger als ca. 300 Dateien liegen geht das problemlos.

Danke.
rubberman
rubberman 03.07.2018 um 18:49:01 Uhr
Goto Top
Für was das ENDLOCAL in der Schleife steht, erschließt sich mir nicht.

Dein Problem liegt in der Implementierung der (einfachen) FOR Schleife. Das kannst du grundsätzlich nicht beeinflussen. Die einzige Möglichkeit zu verhindern dass Dateien erneut gefunden und umbenannt werden, ist die Pufferung der Dateinamen. Ein DIR in einer FOR /F Schleife sollte Abhilfe schaffen.

for /f "delims=" %%i in ('dir /a-d /b *.tif') do ren "%%~i" "9999-%%~i"

Steffen
cargotrans
cargotrans 04.07.2018 um 08:30:53 Uhr
Goto Top
Hallo Steffen,

super, vielen Dank, so funktioniert es einwandfrei.
paulmx
paulmx 06.08.2022 um 14:16:39 Uhr
Goto Top
Hallo,

darf in an Eure Lösung mal anschließen? Ich hab ein ähnliches Problem und komme mit meinen Kenntnissen leider alleine nicht weiter.
Ich will jeweils eine einzelne oder mehrere selektierte Datei(en) verschiedener Formate mit vorangestelltem Datum umbenennen. Die o.g. Schleife benennt mir jedoch alles um, inkl der Batch-Datei.

Mit meinen laienhaftem Wissen habe ich mir

@echo off
ren %* "%date:~-4% %date:~-7,2% %date:~-10,2%_"

zusammengebastelt, funktioniert auch mit einer auf die Batch gezogenen Datei, jedoch wird dann der ursprüngliche Dateinamen und das Dateiformat (.pdf, .jpg, usw) gekillt.
Daraufhin habe ich versucht mit

@echo off
ren %* "%date:~-4% %date:~-7,2% %date:~-10,2%_%%~nxI"

zu arbeiten. Allerdings wird %%~nxI als reiner Text zum Dateinamen hinzugefügt. Scheinbar ist die Variable nicht definiert.
Arbeitet man hier mit "set" weiter?
Oder gibt es eine ganz andere Lösung?

Wäre echt klasse, wenn mir bitte jemand helfen könnte!

Viele Grüße,
Paulmx
rubberman
rubberman 06.08.2022 um 16:16:25 Uhr
Goto Top
Weiß zwar nicht was das mit dem alten Topic hier zu tun hat, aber egal.
for %%i in (%*) do ren %%i "%date:~-4% %date:~-7,2% %date:~-10,2%_%%~nxi"  
Dran denken dass bei per drag/drop auf das Script gezogenen Dateien für jede einzelne Datei der komplette Pfad in %* steht. Kommandozeilen haben aber ein Längenlimit von 8191 Zeichen. Je nachdem wie lang die Pfade sind kann es sein dass bei wenigen Dateien zusammen drauf gezogen auch schon Schluss ist.

Steffen
paulmx
paulmx 06.08.2022 um 16:31:34 Uhr
Goto Top
@rubberman
Vielen Dank - da wäre ich im Leben nicht von alleine drauf gekommen!

Für meine Lernkurve:
(%*) ist dann die einzelne Datei, die ich auf die Batch ziehe? und

auch für so eine "Einzelaufgabe" legt man eine Schleife an, weil %%i in (%*) erstmal den Bezug zum originalen Dateinamen festlegt - Hab ich richtig gedacht?

Nochmals,
TausendDank!
rubberman
rubberman 06.08.2022 um 16:48:49 Uhr
Goto Top
Ein echo %* zeigt dir den Inhalt und call /? die offizielle Erklärung.
%* ist die (leerzeichengetrennte) Liste aller Argumente die an das Script übergeben wurden. Leerzeichen in Argumenten die in Anführungszeichen gesetzt sind werden nicht als Trennzeichen angenommen.
Die for Schleife weist jeweils eines dieser Argumente der Schleifenvariable %%i zu. Die Modifikatoren ~nx expandieren die Schleifenvariable zu Name und Erweiterung. Ein for /? erklärt alle Modifikatoren.

Steffen