Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch - Dateien mit Ordnernamen umbenennen

Frage Entwicklung Batch & Shell

Mitglied: Andichrist

Andichrist (Level 1) - Jetzt verbinden

24.01.2008, aktualisiert 18.10.2012, 11370 Aufrufe, 22 Kommentare

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]
Mitglied: miniversum
24.01.2008, aktualisiert 18.10.2012
Ich ändere jetzt einfach mal den Code von Letztens ab (http://www.administrator.de/forum/datei-mit-ordnernamen-umbenennen%2c-a ...):

01.
@echo off 
02.
FOR /F "delims=" %%i in ('dir /B /AD') do ( 
03.
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do call:dorename "%%i" "%%~nj" "%%~xj" 
04.
05.
goto:eof 
06.
 
07.
 
08.
:dorename 
09.
set "dirname=%~1" 
10.
set "filename=%~2" 
11.
set "fileext=%~3" 
12.
 
13.
set "endname=%dirname%" 
14.
:namecheck 
15.
set nameanders=0 
16.
if exist "%endname%" ( 
17.
set "endname=%endname% (1)" 
18.
set nameanders=1 
19.
20.
if set %nameanders% equ 1 goto:namecheck 
21.
 
22.
set "endname=%endname:.= %" & REM hier werden alle "." durch " " ersetzt 
23.
set "newdirname=%dirname:.= %" & REM hier werden alle "." durch " " ersetzt 
24.
 
25.
ren "%dirname%\%filename%%fileext%" "%newdirname%%endname%%fileext%" 
26.
goto:eof
Ist ungetestet. Also erstmal an Dummydaten ausprobieren!

miniversum
Bitte warten ..
Mitglied: Andichrist
24.01.2008 um 13:23 Uhr
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!

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

Viele Grüße
Andichrist
Bitte warten ..
Mitglied: miniversum
24.01.2008 um 13:38 Uhr
Ups die ist mir beim Editieren der "alten" Funktion woll verloren gegangen. Ich werds oben korrigieren. Die kommt nach dem zweiten FOR.
Bitte warten ..
Mitglied: Andichrist
24.01.2008 um 14:26 Uhr
Hallo,

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

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!


Gruß
Andichrist
Bitte warten ..
Mitglied: Biber
24.01.2008 um 14:50 Uhr
Moin andichrist

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

Grüße
Biber
Bitte warten ..
Mitglied: Andichrist
24.01.2008 um 15:17 Uhr
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
Bitte warten ..
Mitglied: Biber
24.01.2008 um 16:14 Uhr
Na ja, wenn nur maximal eine Dateinamenskollision je Verzeichnis erwartet wird...*gg

STREICHE:
01.
.. 
02.
if exist "%endname%" ( 
03.
set "endname=%endname% (1)" 
04.
set nameanders=1 
05.
)
SETZE:
01.
if exist "%dirname%%fileext%" ( 
02.
For /L %%a in (100,-1,1) do If not exist "%dirname% (%%a)%fileext%" set "endname=%dirname% (%%a)" 
03.
set nameanders=1 
04.
)
Grüße
Biber
[Edit] Tippfehler berichtigt. [/Edit]
Bitte warten ..
Mitglied: Andichrist
25.01.2008 um 01:11 Uhr
Hallo Biber,

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

Leider ohne Erfolg!

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
Bitte warten ..
Mitglied: Biber
25.01.2008 um 11:45 Uhr
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
Bitte warten ..
Mitglied: miniversum
25.01.2008 um 12:31 Uhr
So habs jetzt. Waren noich mehrere Fehler drin. So gehts bei mir jetzt.
01.
@echo off 
02.
FOR /F "delims=" %%i in ('dir /B /AD') do ( 
03.
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do call:dorename "%%i" "%%~nj" "%%~xj" 
04.
05.
goto:eof 
06.
 
07.
 
08.
:dorename 
09.
set "dirname=%~1" 
10.
set "filename=%~2" 
11.
set "fileext=%~3" 
12.
 
13.
set "endname=%dirname%" 
14.
:namecheck 
15.
set nameanders=0 
16.
if exist "%dirname%\%endname%%fileext%" ( 
17.
For /L %%a in (100,-1,1) do If not exist "%dirname%\%endname% (%%a)%fileext%" set "endname=%dirname% (%%a)" 
18.
set nameanders=1 
19.
20.
if "%nameanders%" equ "1" goto:namecheck 
21.
 
22.
set "endname=%endname:.= %" & REM hier werden alle "." durch " " ersetzt 
23.
 
24.
ren "%dirname%\%filename%%fileext%" "%endname%%fileext%" 
25.
goto:eof
miniversum
Bitte warten ..
Mitglied: bastla
25.01.2008 um 13:18 Uhr
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):
01.
@echo off & setlocal 
02.
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do ( 
03.
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D 2^>nul') do call:dorename "%%i" "%%~nj" "%%~xj" 
04.
05.
goto:eof 
06.
 
07.
:dorename 
08.
set "dirname=%~1" 
09.
set "filename=%~2" 
10.
set "fileext=%~3" 
11.
 
12.
set "endname=%dirname:.= %" 
13.
set /a Ind=0 
14.
 
15.
:namecheck 
16.
if not exist "%dirname%\%endname%%fileext%" goto :doit 
17.
set /a Ind+=1 
18.
set "endname=%dirname:.= %(%Ind%)" 
19.
goto:namecheck 
20.
 
21.
:doit 
22.
ren "%dirname%\%filename%%fileext%" "%endname%%fileext%" 
23.
goto:eof
Grüße
bastla
Bitte warten ..
Mitglied: Biber
25.01.2008 um 13:31 Uhr
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
Bitte warten ..
Mitglied: Andichrist
25.01.2008 um 16:50 Uhr
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! *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! *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! ) funktionieren einwandfrei!

Ich wünsche Euch allen ein erholsames Wochenende!

Andichrist
Bitte warten ..
Mitglied: blumenkasten
21.02.2008 um 23:43 Uhr
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.

01.
@echo off 
02.
set /a counter=10000 
03.
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do ( 
04.
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D 2^>nul') do call:dorename "%%i" "%%~nj" "%%~xj" 
05.
06.
set /a counter-=10000	 
07.
goto:eof 
08.
 
09.
:dorename 
10.
set "dirname=%~1" 
11.
set "filename=%~2" 
12.
set "fileext=%~3" 
13.
 
14.
set "endname=%dirname:.= %" 
15.
set /a Ind=0 
16.
 
17.
:namecheck 
18.
if not exist "%dirname%\%endname%%fileext%" goto :doit 
19.
set /a Ind+=1 
20.
set "endname=%dirname:.= %(%Ind%)" 
21.
goto:namecheck 
22.
 
23.
:doit 
24.
set /a counter+=1 
25.
ren "%dirname%\%filename%%fileext%" "%endname%%counter:~1%%fileext%" 
26.
goto:eof
Bitte warten ..
Mitglied: bastla
22.02.2008 um 07:45 Uhr
Hallo blumenkasten und willkommen im Forum!

Da die erste "FOR"-Schleife für die Verzeichnisse "zuständig" ist, sollte das Hauptprogramm eher so aussehen:
01.
@echo off & setlocal 
02.
FOR /F "delims=" %%i in ('dir /B /AD 2^>nul') do ( 
03.
	set /a counter=10000 
04.
	FOR /F "delims=" %%j in ('dir "%%i" /B /A-D 2^>nul') do call:dorename "%%i" "%%~nj" "%%~xj" 
05.
06.
goto:eof
Grüße
bastla
Bitte warten ..
Mitglied: miniversum
12.03.2008 um 10:03 Uhr
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")
Bitte warten ..
Mitglied: miniversum
12.03.2008 um 14:31 Uhr
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"
)
Bitte warten ..
Mitglied: Hugo007
17.10.2014 um 16:49 Uhr
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
Bitte warten ..
Mitglied: bastla
17.10.2014, aktualisiert um 18:32 Uhr
Hallo Hugo007 und willkommen im Forum!

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

Grüße
bastla
Bitte warten ..
Mitglied: Biber
19.10.2014 um 20:10 Uhr
[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]
Bitte warten ..
Mitglied: Hugo007
21.10.2014 um 14:20 Uhr
@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?
Bitte warten ..
Mitglied: bastla
21.10.2014 um 14:44 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Per Batch Dateien in einen Ordner - ext. Festplatte übertragen (2)

Frage von tocksick zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateiname entsprechend einem um x-Ebenen übergeordeten Ordnernamen umbenennen (3)

Frage von Booster07 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...