fischkopf
Goto Top

Leerzeichen in Dateinamen in Unterstrich umbenennen via Batch

Hallo Leute,

ich habe da ein (für Euch wahrscheinlich triviales) Anliegen: Ich möchte via Batch Dateien in einem bestimmten Verzeichnis umbenennen. Die Dateien sehen so aus: XX XXXXXXXX_X.tif und sollen so aussehen: XX_XXXXXXXX_X.tif.
Ich will also nur das an der dritten Stelle vorkommende Leerzeichen durch einen Unterstrich ersetzen.

Die aufrufende Batch liegt nicht im Zielverzeichnis, aber das ist sicher das kleinste Problem face-smile

Wer kann mich da auf den richtigen Weg bringen oder hat gar direkt eine Lösung dafür parat? Tausend Dank!

fischkopf

Content-ID: 105489

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

Ausgedruckt am: 15.11.2024 um 05:11 Uhr

Biber
Biber 08.01.2009 um 14:15:07 Uhr
Goto Top
Moin fischkopf,

willkommen in Forum.
Wenn ich diese Anforderung (Dateien entsprechend einer exakten Wildcard-Spezifikation und in einem Bestimmten Verzeichnis) vorliegen hätte, würde ich es mit einem Oneliner vom CMD-Prompt aus abfackeln und nicht lange rumbätscheln.

>for /f "tokens=1,2" %i in ('dir /b "e:\work\?? *.tif"') do @echo ren "e:\work\%i %j" %i_%j  
ren "e:\work\XX XXXXXXXX_X.tif" XX_XXXXXXXX_X.tif  

Hier mal ein examplarischer proof-of-concept für derartige Dateien im Verzeichnis "e:\work".

Grüße
Biber
fischkopf
fischkopf 08.01.2009 um 14:30:15 Uhr
Goto Top
Hallo Biber,

herzlichen Dank für die schnelle Antwort! Das ganze soll leider zeitgesteuert immer wieder ausgeführt werden, deshalb muss ich das wohl in eine Batch schreiben. Muss ich dazu Anpassungen vornehmen?

Danke!

fischkopf
Biber
Biber 08.01.2009 um 15:37:17 Uhr
Goto Top
Moin fischkopf,

wenn Du diese CMD-Prompt-zeile in einer Batchdatei verwenden willst, dann müssen die jetzigen einfachen Prozentzeichen ( %i und %j) durch doppelte ersetzt werden (%%i und %%j).

Beispiele dafür und auch für das zeitgesteuerte Starten über Taskplane o.ä. findest Du sicher über die Forumssuche.

Grüße
Biber
fischkopf
fischkopf 08.01.2009 um 15:53:31 Uhr
Goto Top
Hallo Biber,

sorry - aber ich muss wohl die Anforderung nochmals genauer darstellen - mein Fehler!

Vom Leerzeichen an der dritten Stelle des Dateinamens können wir abrücken. Was ich bräuchte wäre eine Batch, die stur an die dritte Stelle des Dateinamens jeder gefundenen Datei in einem Verzeichnis (Dateimaske: *.tif) einen Unterstrich einfügt.

Also etwa so: xxxxxxxxxx_1.tif => xx_xxxxxxxx_1.tif oder yyyyyyyyyy_2.tif => yy_yyyyyyyy_2.tif

Die Dateinamen werden also alle um eine Stelle länger, und zwar um den an der dritten Stelle eingefügten Unterstrich.

Ich würde mich freuen, wenn Du mir dabei nochmal helfen könntest. Danke!
Biber
Biber 08.01.2009 um 17:13:45 Uhr
Goto Top
Na ja, fischkopf,

ist handwerklich auch kein großes Problem, aber....

--> irgendwie brauchst Du dann erstmal einen echten Plan B.
Denn wenn per Taskplaner in regelmäßigen Abständen alle *.tif-Dateien um ein "_" an der dritten Zeichenposition "verlängert" werden, dann hast Du am Ende des Jahrtausends ziemlich lange Dateinamen.

Kann ich denn die Zusatzbedingung "alle *.tif, die KEINEN Unterstrich als 3tes Zeichen im Dateinamen haben" unterstellen?

Wenn ja, dann wäre eine Batchskizze:
@echo off & setlocal
Set "myTifDir=E:\work"  
FOR %%i in ( "%myTifDir%\*.tif") do call :RenameWithUnderscore "%%~nxi"  
goto :eof

:RenameWithUnderscore Parameter 1 ist der Dateiname
Set "oldname=%~1"  
Set "OldFirst2Chars=%oldname:~0,2%"  
Set "OldChars3ToEnd=%oldname:~2%"  
IF "%oldname:~2,1%" NEQ "_" (  
ECHO Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"  
REM nach dem Testen: Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"  
)
goto :eof
[Ungetestete Skizze]

Grüße
Biber
fischkopf
fischkopf 08.01.2009 um 21:24:53 Uhr
Goto Top
Hallo Biber,

da bekomme ich leider nur die lapidare Mitteilung: Syntaxfehler
Den habe ich aber leider noch nicht gefunden....

Aber die Prüfung auf Nichtvorhandensein eines Unterstriches an der dritten Stelle des Dateinamens ist auch nicht nötig, da die umbenannten Dateien weiterverarbeitet werden und danach aus dem Verzeichnis verschwinden!

Parallel dazu habe ich mich auch weiter dazu umgeschaut und frage mich, warum folgende Batch nicht richtig funktioniert:

@echo off
setlocal enabledelayedexpansion

for %%i in ("*.tif") do (
set x=%%i
ren %%i !x:~0,2!_!x:~2!
)

Wenn nur eine Datei im Verzeichnis liegt (hier im Beispiel liegt die Batch im Verzeichnis wo auch die Bilder liegen) klappt es prima. Wenn es mehrere sind macht sie aus
IMG_0075.JPG
IMG_0078.JPG

folgendes:
IM__G_0075.JPG
IM_G_0078.JPG

Sie fügt also in der ersten Datei zwei Unterstriche ein. Wieso? Keine Ahnung.

fischkopf
Biber
Biber 08.01.2009 um 21:34:59 Uhr
Goto Top
Moin fischkopf,

nur kurz zwischendurch zum Syntaxfehler (ich schreibe grad an einem anderen Kommentar)
  • oben fehlte ein schließendes Anführungszeichen
  • und es musste heißen "call :gecallterblock" statt "call: gecallterblock" (also SPACE-Doppelpunkt statt umgekehrt)
  • Fehler sind oben korrigiert

  • das zweite Beispiel habe ich jetzt nicht angesehen

Grüße
Biber
fischkopf
fischkopf 08.01.2009 um 21:53:22 Uhr
Goto Top
Hallo Biber,

Deine Batch läuft nun ohne Fehlermeldung, ein Nicht-Newbie hätte die sicher auch selbst gefunden face-smile DANKE!

Allerdings zeigt die Batch das gleiche Verhalten wie von mir oben geschildert, wenn man die die Prüfung auf schon vorhandene Unterstriche an der zweiten Stelle herausnimmt: ab zwei umzubenennenden Dateien im Verzeichnis erhält eine Datei pro Aufruf immer einen Unterstrich mehr als die andere. Beim nächsten Aufruf die andere.
Den Grund dafür habe ich noch nicht finden können, möchte es aber gern kapieren. Wenn du mal Lust und Zeit hast kannst du das ja mal antesten. Bin echt gespannt, wo der Hase im Pfeffer liegt face-smile
Biber
Biber 08.01.2009 um 22:19:17 Uhr
Goto Top
Moin fischkopf,

dann kann es eigentlich nur so sein, dass ich durch das Umbenennen die dynamische Liste des
FOR %%i in ("verzeichnis\*.tif) ...
...durcheinanderbringe.

Dieses Verhalten habe ich zwar noch nicht beobachtet, aber umgehen können wir es bestimmt, wenn wir die "FOR %%i"-Anweisung durch eine Anweisung der Art...
FOR /F "delims=" %%i in ('dir /b "verzeichnis\*.tif"') do ....
ersetzen.

Probier Du es ruhig, wenn Du noch wach bist.... ich mach sonst morgen weiter...

Grüße
Biber
fischkopf
fischkopf 09.01.2009 um 11:19:55 Uhr
Goto Top
Hallo Biber,

habe die Batch mit Deinern letzten Änderungen angepasst und getestet. Funktioniert prima!
Für Interessiert und die Nachwelt: So sieht sie aktuell aus:
:: ========================
@echo off & setlocal 
Set "myTifDir=c:\test11"   
FOR /F "delims=" %%i in ('dir "%myTifDir%\*.tif" /B') do call :RenameWithUnderscore "%%~nxi"   
goto :eof 

:RenameWithUnderscore
Set "oldname=%~1"   
Set "OldFirst2Chars=%oldname:~0,2%"   
Set "OldChars3ToEnd=%oldname:~2%"   
Ren "%mytifDir%\%oldname%" "%OldFirst2Chars%_%OldChars3ToEnd%"   

goto :eof
:: ========================
Danke nochmals!


[Edit Biber] Gern geschehen. Habe noch den Code in -Tags gesetzt. [/Edit]