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]
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]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 78991
Url: https://administrator.de/contentid/78991
Ausgedruckt am: 25.11.2024 um 01:11 Uhr
23 Kommentare
Neuester Kommentar
Ich ändere jetzt einfach mal den Code von Letztens ab (Datei mit Ordnernamen umbenennen, aus Ordner verschieben und diesen löschen!):
Ist ungetestet. Also erstmal an Dummydaten ausprobieren!
miniversum
@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
Na ja, wenn nur maximal eine Dateinamenskollision je Verzeichnis erwartet wird...*gg
STREICHE:
SETZE:
Grüße
Biber
[Edit] Tippfehler berichtigt. [/Edit]
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]
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
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
So habs jetzt. Waren noich mehrere Fehler drin. So gehts bei mir jetzt.
miniversum
@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
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):
Grüße
bastla
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
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
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
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.
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
Hallo blumenkasten und willkommen im Forum!
Da die erste "FOR"-Schleife für die Verzeichnisse "zuständig" ist, sollte das Hauptprogramm eher so aussehen:
Grüße
bastla
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
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
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")
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:
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!):
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
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"
)
pdftk %%i\*.pdf gesamt.pdf cat output gesamt.pdf
del "%%i\*.pdf"
)
Hallo Hugo007 und willkommen im Forum!
Völlig ungetestet etwa so:
Rest wie oben ...
Grüße
bastla
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
Grüße
bastla
[OT]
Set /a Rgc+=2
#893
[/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?
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]
@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?
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?
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.
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.