andichrist
Goto Top

Batch - Dateien mit Ordnernamen umbenennen

Hallo,

ich bräuchte nochmals eure Hilfe!


Ich suche eine Batch-Lösung, die sämtliche Dateien in einem Order mit dessen Namen umbenennt. Falls dadurch eine Datei doppelt vorhanden ein sollte, sollte diese aber nicht überschrieben werden, sondern einen Zusatz z. B. (1)...(n) oder _1..._n erhalten. Die Anzahl von Dateien in einem Ordner variieren.

Wie müsste so eine Batch aussehen, wenn lediglich die Dateien in den Ordnern umbenannt werden soll?

Beispiel: Im Verzeichnis c:\Temp\ gibt es mehrere Unterverzeichnisse z.B.


Verzeichnis 1
Datei AAA.jpg
Datei BBB.jpg
Datei x.png
Datei x.txt

Verzeichnis.Test.B
Noch eine Datei 123.doc
Noch eine Datei 345.doc
Noch eine Datei z.txt

Verzeichnis Test Test 3
Eine.weitere.Datei.jpg
Eine.weitere.Datei.txt

Verzeichnis.Test.Test.IV
So.viele.weitere.Datein.jpg
So.viele.weitere.Datein.txt

Als Ergebnis nach dem Batchaufruf sollte in den einzelnen Verzeichnissen unter c:\temp\ folgendes zu finden sein:

Verzeichnis 1
Verzeichnis 1.jpg
Verzeichnis 1(1).jpg
Verzeichnis 1.png
Verzeichnis 1.txt

Verzeichnis.Test.B
Verzeichnis Test B.doc <-Ideal wenn "." verschwunden wäre!
Verzeichnis Test B(1).doc <-Ideal wenn "." verschwunden wäre!
Verzeichnis Test B.txt <-Ideal wenn "." verschwunden wäre!

Verzeichnis Test Test 3
Verzeichnis Test Test 3.jpg
Verzeichnis Test Test 3.txt

Verzeichnis.Test.Test.IV
Verzeichnis Test Test IV.jpg <-Ideal wenn "." verschwunden wäre!
Verzeichnis Test Test IV.txt <-Ideal wenn "." verschwunden wäre!

...

Zusatz (falls lösbar per Batch!):
Eine Herausforderung besteht noch im Verzeichnisnamen, dort könnte der Verzeichnisnamen anstatt "Leerzeichen" zwischen den einzelnen Wörtern (Ordnernamen/ Beschreibung) jeweils ein PUNKT "." vorhanden sein, dieser sollte - wenn möglich beim umbennen der Dateien entfernt werden! (Optional!!!)

Mir wäre schon sehr geholfen, wenn die Batch-Lösung die Dateien nur umbenennt!

Ich hoffe ihr könnt mir weiter helfen!


Carpe noctem
Andichrist

[Edit Biber] Wie gewohnt habe ich den üblichen PISA-Fehler "umbennen" im Titel "umbannt" *seufz* [/Edit]

Content-Key: 78991

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

Printed on: April 16, 2024 at 18:04 o'clock

Member: miniversum
miniversum Jan 24, 2008, updated at Oct 18, 2012 at 16:35:20 (UTC)
Goto Top
Ich ändere jetzt einfach mal den Code von Letztens ab (Datei mit Ordnernamen umbenennen, aus Ordner verschieben und diesen löschen!):

@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do call:dorename "%%i" "%%~nj" "%%~xj"  
)
goto:eof


:dorename
set "dirname=%~1"  
set "filename=%~2"  
set "fileext=%~3"  

set "endname=%dirname%"  
:namecheck
set nameanders=0
if exist "%endname%" (  
set "endname=%endname% (1)"  
set nameanders=1
)
if set %nameanders% equ 1 goto:namecheck

set "endname=%endname:.= %" & REM hier werden alle "." durch " " ersetzt  
set "newdirname=%dirname:.= %" & REM hier werden alle "." durch " " ersetzt  

ren "%dirname%\%filename%%fileext%" "%newdirname%%endname%%fileext%"  
goto:eof

Ist ungetestet. Also erstmal an Dummydaten ausprobieren!

miniversum
Member: Andichrist
Andichrist Jan 24, 2008 at 12:23:44 (UTC)
Goto Top
Hallo @miniversum,

danke für Deine rasche Antwort!

Beim Aufruf Deiner Batch erscheint die Fehlermeldung "[26] Klammern nicht ausgewogen"

Ich denke die Fehlermeldung rührt daher, dass in der 1. Zeile deiner Batch die Klammer "(" geöffnet wurde aber nirgends wieder geschlossen wurde!

FOR /F "delims=" %%i in ('dir /B /AD') do (

Leider bin ich überfragt, wo die End-Klammmer ")" gesetzt werden muss!

Aber Du weißt, da sicherlich mehr! face-wink

Danke schon mal für die bisherige Arbeit - sie sieht IMHO sehr vielversprechend aus! face-smile

Viele Grüße
Andichrist
Member: miniversum
miniversum Jan 24, 2008 at 12:38:13 (UTC)
Goto Top
Ups die ist mir beim Editieren der "alten" Funktion woll verloren gegangen. Ich werds oben korrigieren. Die kommt nach dem zweiten FOR.
Member: Andichrist
Andichrist Jan 24, 2008 at 13:26:28 (UTC)
Goto Top
Hallo,

ich denke wir nähern uns immer mehr der Zielgeraden! face-smile

Beim Aufruf der Batch erscheint jetzt unter WinXP HomePro in der CMD-Shell nur dieser Einzeiler:
OUTPUT:
"1" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Sonst keine Änderungen, Dateien wurden nicht umbenannt! face-sad


Gruß
Andichrist
Member: Biber
Biber Jan 24, 2008 at 13:50:44 (UTC)
Goto Top
Moin andichrist

STREICHE: if set %nameanders% equ 1 goto:namecheck
SETZE: if "%nameanders%" equ "1" goto:namecheck

Grüße
Biber
Member: Andichrist
Andichrist Jan 24, 2008 at 14:17:38 (UTC)
Goto Top
Hi @Biber,

Deine Änderungen habe ich übernommen!

Versuchs-Aufbau:

Im Verzeichnis c:\Temp\ gibt es folgende Unterverzeichnisse:


Verzeichnis 2
AAAAA.AAAAA.bat
AAAAA.AAAAA.txt
xxxxxxx.txt
xxxxxxx.xxx.txt

Verzeichnis 3
Hallo Welt.bat
Hallo Welt.txt
VVVVVVVVVVVVVV.bat
VVVVVVVVVVVVVV.123.bat
VVVVVVVVVVVVVV.345.bat

OUTPUT:
CMD-Shell
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.


Ergebnis:
Verzeichnis 2
Verzeichnis 2Verzeichnis 2 (1).bat
Verzeichnis 2Verzeichnis 2 (1).txt
xxxxxxx.txt
xxxxxxx.xxx.txt

Verzeichnis 3
Verzeichnis 3Verzeichnis 3 (1).bat
Verzeichnis 3Verzeichnis 3 (1).txt
VVVVVVVVVVVVVV.bat
VVVVVVVVVVVVVV.123.bat
VVVVVVVVVVVVVV.345.bat


Noch eine Idee?

Viele Grüße
Andichrist
Member: Biber
Biber Jan 24, 2008 at 15:14:58 (UTC)
Goto Top
Na ja, wenn nur maximal eine Dateinamenskollision je Verzeichnis erwartet wird...*gg

STREICHE:
..
if exist "%endname%" (  
set "endname=%endname% (1)"  
set nameanders=1
)

SETZE:
if exist "%dirname%%fileext%" (  
For /L %%a in (100,-1,1) do If not exist "%dirname% (%%a)%fileext%" set "endname=%dirname% (%%a)"  
set nameanders=1
)

Grüße
Biber
[Edit] Tippfehler berichtigt. [/Edit]
Member: Andichrist
Andichrist Jan 25, 2008 at 00:11:27 (UTC)
Goto Top
Hallo Biber,

danke für Deine Verbesserungen! Ich habe alle Ergänzungen berücksichtigt und das Script entsprechend angepasst!

Leider ohne Erfolg! face-sad

Aufruf der Batch bei gleichen Dateien in den Verzeichnis wie oben.


OUTPUT:
CMD-Shell
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.
Dateiname existiert bereits, oder die Datei
konnte nicht gefunden werden.


Ergebnis:
Verzeichnis 2
Verzeichnis 2Verzeichnis 2 (1).bat
Verzeichnis 2Verzeichnis 2 (1).txt
xxxxxxx.txt
xxxxxxx.xxx.txt

Verzeichnis 3
Verzeichnis 3Verzeichnis 3 (1).bat
Verzeichnis 3Verzeichnis 3 (1).txt
VVVVVVVVVVVVVV.bat
VVVVVVVVVVVVVV.123.bat
VVVVVVVVVVVVVV.345.bat

Viele Grüße
Andichrist
Member: Biber
Biber Jan 25, 2008 at 10:45:39 (UTC)
Goto Top
Moin Andichrist,

na gut, da bleibt uns wohl nicht anderes übrig, als mal ein paar ECHOs zum Testen reinzuschmeißen.
Vorzugsweise Du, weil ich den Schnipsel nicht gegen so eine Verzeichnisstruktur testen kann.

Nicht zu fliegen scheinen ja die Kollisionsbehandlungen (sowohl miniversums wie meine).
Also
- Lass den Schnipsel die Befehle ausgeben, die er ausführt
- dazu entweder oben das "echo off" auskommentieren
- und/oder speziell die "if Exist "%dirname%.." -Zeilen zusätzlich mit vorangestelltem ECHO-Befehl anzeigen lassen.

Grüße
Biber
Member: miniversum
miniversum Jan 25, 2008 at 11:31:22 (UTC)
Goto Top
So habs jetzt. Waren noich mehrere Fehler drin. So gehts bei mir jetzt.
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do call:dorename "%%i" "%%~nj" "%%~xj"  
)
goto:eof


:dorename
set "dirname=%~1"  
set "filename=%~2"  
set "fileext=%~3"  

set "endname=%dirname%"  
:namecheck
set nameanders=0
if exist "%dirname%\%endname%%fileext%" (  
For /L %%a in (100,-1,1) do If not exist "%dirname%\%endname% (%%a)%fileext%" set "endname=%dirname% (%%a)"  
set nameanders=1
)
if "%nameanders%" equ "1" goto:namecheck  

set "endname=%endname:.= %" & REM hier werden alle "." durch " " ersetzt  

ren "%dirname%\%filename%%fileext%" "%endname%%fileext%"  
goto:eof
miniversum
Member: bastla
bastla Jan 25, 2008 at 12:18:38 (UTC)
Goto Top
Hallo Andichrist, Biber und minversum!

Auch von mir noch eine kleine Variation des Themas (hatte den Batch schon fast fertig, bin dann aber länger nicht zum Posten gekommen):
@echo off & setlocal
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do (  
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D 2^>nul') do call:dorename "%%i" "%%~nj" "%%~xj"  
)
goto:eof

:dorename
set "dirname=%~1"  
set "filename=%~2"  
set "fileext=%~3"  

set "endname=%dirname:.= %"  
set /a Ind=0

:namecheck
if not exist "%dirname%\%endname%%fileext%" goto :doit  
set /a Ind+=1
set "endname=%dirname:.= %(%Ind%)"  
goto:namecheck

:doit
ren "%dirname%\%filename%%fileext%" "%endname%%fileext%"  
goto:eof

Grüße
bastla
Member: Biber
Biber Jan 25, 2008 at 12:31:54 (UTC)
Goto Top
Moin Andichrist, bastla und miniversum,

unabhängig davon, welche Variante jetzt das gewünschte Ergebnis bringt- das eigentlich Lehrreiche dieses Thread sollte wohl sein:

Bei Verzicht auf jegliche Kommentierung in einem Skript lassen sich Fehler nur durch Probieren lösen.

Oder deutlicher gesagt: So skriptet man/frau nicht! Auch nicht, wenn es "nur" ein Batch ist.

Schuldbewusst und wieder mal voller guter Vorsätze
Biber
Member: Andichrist
Andichrist Jan 25, 2008 at 15:50:47 (UTC)
Goto Top
Hallo @all,

@miniversum - für Deine Geduld und Ausdauer eine Lösung zu finden.

@bastla - der schon eine Lösung in der Schublade hat und nur auf den günstigsten Moment gewartet hat seine Lösung zu präsentieren! face-wink *grins*

Und lust but not least
@Biber - der immer noch weitere Vorschläge/ Verbesserungen in petto hat! Sei nicht so streng mit den Mitstreitern und auch nicht zu Dir selbst! Es hat alles wunderbar geklappt! Ich habe sogar (jetzt) zwei funktionierende Lösungen. Und darum ging es mir in erster Linie, um eine LÖSUNG und nicht um ein Howto; ich finde die fehlende Kommentierung nicht so tragisch - ich habe doch euch! face-wink *grins*

Vielen Dank Euch allen für die tatkräftige Unterstützung! Beide Scripte ( Taufe1.cmd und Taufe2.cmd <-das ist doch ein cooler Name! face-wink) funktionieren einwandfrei! face-smile

Ich wünsche Euch allen ein erholsames Wochenende!

Andichrist
Member: blumenkasten
blumenkasten Feb 21, 2008 at 22:43:44 (UTC)
Goto Top
Ich habe diese Batch-Datei auch in gebrauch, allerdings stört mich die Nummerierung von Windows, es entstehen ja Dateien nach dem Schema "Name(Nummer).ext".
Darum wollte ich einen Counter mitlaufen lassen und den Dateinamen so basteln:
"ren " %dirname%\%filename%%fileext%" "%endname%%counter:~1%%fileext%" ".
Allerdings zählt der Counter durchgängig hoch. Ich hätte aber gerne, dass für jedes Verzeichnis der Counter wieder auf Null zurückgesetzt wird. Könnt ihr mir helfen?
Danke.

@echo off
set /a counter=10000
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do (  
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D 2^>nul') do call:dorename "%%i" "%%~nj" "%%~xj"  
	)
set /a counter-=10000	
goto:eof

:dorename
set "dirname=%~1"  
set "filename=%~2"  
set "fileext=%~3"  

set "endname=%dirname:.= %"  
set /a Ind=0

:namecheck
if not exist "%dirname%\%endname%%fileext%" goto :doit  
set /a Ind+=1
set "endname=%dirname:.= %(%Ind%)"  
goto:namecheck

:doit
set /a counter+=1
ren "%dirname%\%filename%%fileext%" "%endname%%counter:~1%%fileext%"  
goto:eof
Member: bastla
bastla Feb 22, 2008 at 06:45:56 (UTC)
Goto Top
Hallo blumenkasten und willkommen im Forum!

Da die erste "FOR"-Schleife für die Verzeichnisse "zuständig" ist, sollte das Hauptprogramm eher so aussehen:
@echo off & setlocal
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do (  
	set /a counter=10000
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D 2^>nul') do call:dorename "%%i" "%%~nj" "%%~xj"  
)
goto:eof

Grüße
bastla
Member: miniversum
miniversum Mar 12, 2008 at 09:03:47 (UTC)
Goto Top
Zu 1.)
Schau mal hier gibts mehrere Postings wie man mit Winzip (oder einem anderen Packporgramm) per comandozeile Dateien entpacken kann. Das solte jedenfalls kein Problem darstehhen.

Zu 2.)
Du könntest nach dem Skript die folgende Zeile einfügen
FOR /F "delims=" %%i in ('dir /B /AD') do (move "%%i\*.*" "%~dp0")
Member: miniversum
miniversum Mar 12, 2008 at 13:31:06 (UTC)
Goto Top
Wenn Du was nach dem Skript einbauen willst must du es vor dem ERSTEN goto:eof tun.
Alternativ kannst du auch das ERSTE (und nur das erste) goto:eof durch ein goto:ende ersetzen und dann weiter unten eine Marke :ende einfügen nachder du weiter schreibst.

Geschickter wäre es denke ich wenn Du den befehl so einbaust:
pdftk *.pdf cat output gesamt.pdf_gesamt
del *.pdf
ren gesamt.pdf_gesamt gesamt.pdf


Oder noch besser eigentlich das ganze Script anders machen.
Entpacke die Dateien in einzelne Ordner, so wie du es hast.
Danach einfach dieses hier (ungetestet!):
FOR /F "delims=" %%i in ('dir /B /AD') do (
pdftk %%i\*.pdf gesamt.pdf cat output gesamt.pdf
del "%%i\*.pdf"
)
Member: Hugo007
Hugo007 Oct 17, 2014 at 14:49:59 (UTC)
Goto Top
Kann mir jemand helfen, wie ich bei dem code vom bastla die Umbennung von *.jpg" oder andere fileextensions (die man im code bennen kann), ausschließen kann?

Thx
Member: bastla
bastla Oct 17, 2014 updated at 16:32:28 (UTC)
Goto Top
Hallo Hugo007 und willkommen im Forum!

Völlig ungetestet etwa so:
@echo off & setlocal
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do (  
	set /a counter=10000
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D  2^>nul^|findstr /ive "\.jpg \.gif"') do call:dorename "%%i" "%%~nj" "%%~xj"  
)
goto:eof
Rest wie oben ...

Grüße
bastla
Member: Biber
Biber Oct 19, 2014 at 18:10:07 (UTC)
Goto Top
[OT]
Zitat von @Hugo007:

Kann mir jemand helfen, wie ich bei dem code vom bastla die Umbennung von *.jpg" oder andere fileextensions (die man im code
bennen kann), ausschließen kann?

Set /a Rgc+=2
#893

[/OT]
Member: Hugo007
Hugo007 Oct 21, 2014 at 12:20:37 (UTC)
Goto Top
@bastla,

thx für die schnelle Antwort. Ich bin zwar kein batch Experte, aber würde der code nicht dazu führen, dass sobald eine datei jpg und gif gefunden wird die funktion "dorename", also das Umbenennen starten würden?
Member: bastla
bastla Oct 21, 2014 at 12:44:12 (UTC)
Goto Top
Hallo Hugo007!
würde der code nicht dazu führen, dass sobald eine datei jpg und gif gefunden wird die funktion "dorename", also das Umbenennen starten würden?
Nein.

Worauf beruht Deine Annahme (ein Test war's vermutlich nicht)?

Ein
findstr /?
könnte vielleicht helfen ...

Grüße
bastla
Member: ChrisK78
ChrisK78 Jan 04, 2019 at 09:42:08 (UTC)
Goto Top
Hallo bastla,

ein Danke vorab für deinen Code. Der hat auch mir sehr geholfen.
Allerdings habe ich noch ein kleines Problem.

In jedem Unterverz. befindet sich eine Excel-Datei. Diese soll er zuvor kopieren und die kopierte Datei umbenennen. Die alte aber nicht umbenennen. Irgendwie bekomm ich's nicht hin. Bin auch anfängerlevel in sachen Batch. Er benennt jedesmal entweder alle xlsx dateien um oder gar keine.

Hättest du vielleicht einen vorschlag wie ich das mit in dem Code unterbringen kann?

Auch wenn der letzte Eintrag von 2014 ist hoffe ich doch hier noch Hilfe erhalten zu können.

Grüße
Chris.