andichrist
Goto Top

Datei mit Ordnernamen umbenennen, aus Ordner verschieben und diesen löschen!

Hallo an alle!

Bin leider eher ein Batch-Novize, ... vielleicht könnt Ihr mir hier weiter helfen!
Danke im Voraus für Eure Hilfe!

Ich habe folgende Herausforderung, die es zu lösen gilt:

in einer Ordner z.B. c:\temp habe ich mehrere Unterordner (Anzahl variiert) c:\temp\Verzeichnis 1, c:\temp\Verzeichnis B... in dem sich mehrere Dateien befinden.
- diese Dateien sollen den Namen des Ordners z.B. Verzeichnis 1.txt, Verzeichnis B.txt ... erhalten in dem sie sich befinden - bei Beibehaltung der Endung!
- anschließend in den darunter liegenden Ordner hier im Beispiel c:\temp\ verschoben werden.
- das leere Verzeichnis soll anschließend gelöscht werden (am Ende sollen alle Verzeichnisse/ Ordner gelöscht sein!).

Wie kann dies in einer Batch realisiert werden? Die Batch soll systematische alle Ordner in einem frei wählbaren Verzeichnis abarbeiten!

Aufbau-Beispiel:

Die Ordner liegen z.B. alle in c:\Temp\

Verzeichnis 1
Datei x.jpg
Datei x.txt

Verzeichnis B
Noch eine Datei z.jpg
Noch eine Datei z.txt

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

Als Ergebnis nach dem Batchaufruf sollte im Verzeichnis c:\temp\ nur noch zu finden sein:

Verzeichnis 1.jpg
Verzeichnis 1.txt
Verzeichnis B.jpg
Verzeichnis B.txt
Verzeichnis 3.jpg
Verzeichnis 3.txt

Ideal wäre es, wenn man dies in einer Batch lösen könnte, die ab nicht statisch/ starr nur in einen bestimmten Verzeichnis z. B. c:\temp\ funktioniert, sondern die nach belieben einfach in ein Verzeichnis kopiert und aufgerufen werden kann!

Ich habe keine Idee wie man das realisieren könnte. Weiß hier jemand Rat und könnte mir helfen!

Ich wäre für jede Lösung dankbar.

Viele Grüße
Andichrist

Content-Key: 78573

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: miniversum
miniversum 19.01.2008 um 10:53:08 Uhr
Goto Top
Versuchs mal so, aber erst ausprobieren!!!):
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
copy "%%i\*.*" "%%i.*"  
rd /s /q "%%i"  
)
miniversum
Mitglied: Andichrist
Andichrist 21.01.2008 um 08:38:08 Uhr
Goto Top
Versuchs mal so, aber erst ausprobieren!!!):
@echo off
> FOR /F "delims=" %%i in ('dir  
> /B /AD') do (  
> copy "%%i\*.*" "%%i.*"  
> rd /s /q "%%i"  
> )
> 
miniversum

Hallo miniversum,

danke für Deine Bemühungen und Deinen Ansatz!

Deine Routine funktioniert soweit ganz gut! Allerdings nur, wenn im Verzeichnisnamen sowie Dateinamen KEIN PUNKT "." vorhanden ist (ausgenommen ist der Punkt vor der Extension)! Der Punkt wird als "Trennmarke" angesehen.


U:\_Test\111\AAA.BBB.bat => U:\_Test\111.BBB.bat
U:\_Test\BBB.BBB\AAAA.AAAA.Hallo.Welt.bat => U:\_Test\BBB.BBB.Hallo.Welt.bat
U:\_Test\BBB.BBB\Hallo.bat => Zugriff verweigert

Also leider funktioniert diese Lösung "nur" 100% zuverlässig, wenn keine zusätzlichen PUNKTE im Ordnernamen sowie Dateinamen vorhanden sind!

Gibt es eine Möglichkeit das Problem zu umgehen, damit auch ausnahmslos alle Zeichen berücksichtigt werden?

Danke im Voraus für eure Hilfe!

Liebe Grüße
Andichrist
Mitglied: miniversum
miniversum 21.01.2008 um 14:51:47 Uhr
Goto Top
Damit sollte es gehen:
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do copy /-Y "%%i\%%j" "%%i%%~xj"  
rd /s /q "%%i"  
)
Mitglied: Andichrist
Andichrist 22.01.2008 um 20:07:29 Uhr
Goto Top
Hallo @miniversum!

Du bist mein Held des Tages...

Die Aufgabe wurde von Dir mit Bravur in kürzester Zeit gelöst und Deine "miniversum" Batch rennt wie der Teufel. face-wink


Anmerkung:
Meine favorisierte Lösung tendierte eher zum "move" - Befehl! Der "Copy"-Befehl benötigt eine erhöhten Zeitaufwand, vor allen Dingen bei eine großen Mengen an Dateien die "umgeschaufelt" werden müssen!

Aber ein großer Pluspunkt spricht für die hier genannte Lösung! >>Sicherheit<<
Denn erst wenn die Datei ordnungsgemäß kopiert wurde wird gelöscht! Wenn beim "move"-Befehl z. B. das Volume voll ist, hat man Pech gehabt.

Wer möchte kann die "COPY" Anweisung durch den MOVE"-Befehl ersetzen! Das geht um einiges schneller! face-smile

WICHTIG:
Achtung bei gleichen Datei-Endungen gewinnt die letzte Datei mit dieser Endung!!!
Vorherige Datei mit gleicher Endung wird kommentarlos überschrieben!!!

Vielen Dank
Andichrist
Mitglied: Karlooser
Karlooser 13.02.2008 um 08:40:31 Uhr
Goto Top
Hallo @Universum,

habe durch googeln den Beitrag gefunden und war ganz begeistert, da ich gerade eine verhunzte nero-Sicherung reparire. So mit umbenennen .nco in .zip. Beim entpacken wird dann je datei ein Verzeichnis angelegt, das so heißt, wie die ursprüngliche Date.

Habe mich gleich angemeldet und bitt gleich um Hilfe.

Habe dann also so was:

Unterverzeichnis\dateiname.jpg\dateiname.jpg

Dabei ist das erste "dateiname.jpg" natürlich der Verzeicnisname und danach die Datei "dateiname.jpg".

Die batch macht mir daraus

dateiname.jpg.jpg

Alle meine Versuch waren erfolglos. Zuerst habe ich mal rumprobiert, einfach um rauszukriegen was die batch macht. Zunächst habe ich die Datei umbenannt und die Erweiterung jpg weggelassen. Dann werde ich gefragt, ob ich überschreiben möchte, worauf aber nichts passiert.

Das Gleiche passier, wenn ich in der batch das %%~xj weglasse.

Das funktioniert dann, wenn ich den Dateinamen verändere, indem ich in der batch z.B. eine 0 vor den Dateinamen mache 0"%%i%%~xj". Dann klebt halt immer eine 0 davor, aber die batch funktioniert., ich nehme an, weil der Dateiname und der Veruzeichnisname nicht mehr identisch sind.

Ich hoffe, es ist rübergekommen, was ich meine und probiert habe. Da ich ein Laie bin und nur rudimentäre Kenntnisse aus alten dos-Zeten habe, komme ich nicht wieter.

Danke und Gruß

Karlooser
Mitglied: miniversum
miniversum 13.02.2008 um 11:52:12 Uhr
Goto Top
So ganz verstehe ich es nciht. Kanst du mal beispiele machen was du jetzt hast und was du haben willst?
Jetzt:
Unterverzeichnis\dateiname.jpg\dateiname.jpg
Gewünscht:
Unterverzeichnis\dateiname.jpg
oder wie?
Mitglied: Karlooser
Karlooser 13.02.2008 um 16:07:28 Uhr
Goto Top
Hallo miniversum,

ja genau so. Ich hab' ncoch ein bisschen rumprobiert und krieg mit der Version

FOR /F "delims=" %%i in ('dir /B /AD') do (
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do copy /-Y "%%i\%%j" ..\"%%~ni%%~xj"
rd /s "%%i"

ein Ergebnis. Dadurch dass ich für's Testen die Datei eine Verzeichnis- Ebene weiter kopiert habe, wurde die Datei richtig gespeichert und auch das Verzeichnis gelöscht, aber komischerweise hat es das Verzeichnis selbst nicht gelöscht (?).

Nochmal meine Struktur:

c:\Testordner\Testunterorder\testdatei.doc\Testdatei.doc (den Dateinamen habe ich absichtlich groß geschrieben, dadurch konnte ich erkennen, das die Datei mit dem Verzeichnisname "testdatei.doc" kopiert wurde).

Die Datei wurde mit obiger batch dann nach c:\Testordner kopiert. im Test-Unterordner steht dann noch die batch selbst und der Ordner testdatei.doc ist leer, aber noch da.

Gerne hätte ich die Datei aber im Verzeichnis Test-Unterordner und natürlich das Verzeichnis testdatei.doc gelöscht.

Danke für Deine Hilfe.

Karlooser
Mitglied: miniversum
miniversum 13.02.2008 um 16:52:13 Uhr
Goto Top
Wenn deine Batch im Ordner c:\Testordner\ liegt dann soltle es os gehen:
FOR /F "delims=" %%i in ('dir /B /AD') do (
FOR /F "delims=" %%j in ('dir "%%j" /B /AD') do (
FOR /F "delims=" %%k in ('dir "%%k" /B /A-D') do copy /-Y "%%i\%%j\%%k" "%%k"
)
rd /s "%%i"
)

Die Variabelnverteilung wäre dann so:
c:\Testordner\Testunterorder\testdatei.doc\Testdatei.doc
%%i %%j %%k

miniversum
Mitglied: Karlooser
Karlooser 13.02.2008 um 20:39:28 Uhr
Goto Top
hmmm, leider funktioniert das so gar nicht (kann datei nicht finden und es ist zu sehen, dass %%i noch gelesen wird, dann ist schluss.

hinter dem copy /-y wird noch angezeigt "Testunterordner\%j\%k" "%k" )
)
Datei nicht gefunden
Möchten sie "Testunterordner"löschen (J/N)?

Also werden j und k nicht gelesen. Nach meinem Verständnis (wenn ich in der "alten" batch schau) müsste es auch lauten:


FOR /F "delims=" %%i in ('dir /B /AD') do (
FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (
FOR /F "delims=" %%k in ('dir "%%j" /B /A-D') do copy /-Y "%%i\%%j\%%k" "%%k"
)
rd /s "%%i"
)

dann bin ich zumindest einen Schritt weiter:

hinter dem copy /-y wird noch angezeigt "Testunterordner\testdatei.jpg\%k" "%k" )
)
Datei nicht gefunden
Möchten sie "Testunterordner"löschen (J/N)?

Irgendwie fehlt noch die Datei "Testdatei.jpg" selbst. Die müsste doch an k übergeben werden.


Ich hab's!
FOR /F "delims=" %%i in ('dir /B /AD') do (
FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (
FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do copy /-Y "%%i\%%j\%%k" "%%j"

So wird einwandfrei kopiert!

Nur funktioniert rd /s "%%i/%%j" nicht, wenn nur das Verzeichnis testdatei.jpg gelöscht werden soll.


Gruß Karlooser
Mitglied: miniversum
miniversum 13.02.2008 um 21:00:21 Uhr
Goto Top
Ja hast natürlich recht. das war ein Fehler von mir.
Hab den Fehler noch gefunden.
So sollte es gehen:
FOR /F "delims=" %%i in ('dir /B /AD') do (
FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (
FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do copy /-Y "%%i\%%j\%%k" "%%k"
)
rd "%%i"
)

miniversum
Mitglied: Karlooser
Karlooser 13.02.2008 um 21:53:06 Uhr
Goto Top
ich bin auch ganz schön stolz, habe so ohne Ahnung und mit dos /? -Hilfe die Befehle und Parameter angeguckt und nachvollzogen, was Du so gemacht hat.

eine Kleinigkeit ist noch am Ende der kopiererei muss es auch do copy /-Y "%%i\%%j\%%k" "%%j" sein, weil ich ja den Verzeichnisnamen als neuen Dateinamen haben will.

Noch 'ne Kleinigkeit:

wir überrede ich das rd /s dazu nicht den Testunterordner und alles drunter zu löschen, sondern das Testverzeichnis.

rd /s "%%i" löscht das Testverzeichnis

habe schon rd /s "%%i\%%j" probiert, dakommt aber wollen Sie... Testverzeichnis\%j löschen ? raus.

Hast Du da eine Idee?

Danke und Gruß Karlooser
Mitglied: miniversum
miniversum 14.02.2008 um 11:05:41 Uhr
Goto Top
ich bin auch ganz schön stolz, habe so ohne Ahnung und mit dos /? -Hilfe die Befehle und Parameter angeguckt und nachvollzogen, was Du so gemacht hat.
Ja so lernt man es am besten denke ich.

eine Kleinigkeit ist noch am Ende der kopiererei muss es auch do copy /-Y "%%i\%%j\%%k" "%%j" sein, weil ich ja den Verzeichnisnamen als neuen Dateinamen haben will.
Achso. Ich dachte die dateien haben schon den richtigen namen. Ja klar dann stimmt es so wie du es hast. Aber sollte das nicht fast egal sein? Ich dachte die Verzeichnissnamen und die Dateinamen wären gleich?: Unterverzeichnis\dateiname.jpg\dateiname.jpg

Noch 'ne Kleinigkeit:

wir überrede ich das rd /s dazu nicht den Testunterordner und alles drunter zu löschen, sondern das Testverzeichnis.

Versuchs mal so:
FOR /F "delims=" %%i in ('dir /B /AD') do (  
  FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (  
    FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do copy /-Y "%%i\%%j\%%k" "%%j"  
    rd /s "%%j"  
  )
)

miniversum
Mitglied: Karlooser
Karlooser 14.02.2008 um 22:32:23 Uhr
Goto Top
Hallo miniversum,

Verzeichnislöschen funktioniert bei mir nicht. Es kommt die Frage, Verzeichnis löschen...? und es ist auch der richtige Verzeichnisname. Nur gelöscht wird nichts.

Lösche jetzt von hand. Sonst läuft die batch prima und ich hebe schon das Meiste meines kaputten nero-backups versorgt.
Ich probier nochmal, nur habe dieses WE keine Zeit.

Danke nochmals für Deine Hilfe.

Gruß Karlooser
Mitglied: miniversum
miniversum 15.02.2008 um 08:02:16 Uhr
Goto Top
Dann versuchs mal noch mit dem Parameter /Q
Also
rd /s /q "%%j"

miniversum
Mitglied: xercxes
xercxes 23.10.2008 um 11:17:06 Uhr
Goto Top
Hallo. Habe diesen Beitrag per google gefunden und find es klasse. Auch wenn ich keinen plan von programmieren habe, hoffe ich das ich vielleicht eine lösung bekomme.

Ich hab folgendes Problem:

Momentan habe ich, aufgrund eines Lehrgangs, sehr viel zu scannen. Ich mache das mit einem Canon-Scanner und Patchseiten. Dadurch wird immer wieder ein neuer Ordner erstellt sobald eine dieser Seiten kommt. Und mir fehlt einfach die nötige Zeit meine Dateien ordentlich umzubenennen.

Habe mir mal diesen Thread durchgelesen und denke das die o. g. Batch-Datei für mich teilweise in Frage kommt. Habe es auch ausprobiert, aber es sind 2 Dinge die anders sein müssten.
Ist es möglich 2 kleine Veränderungen daran vorzunehmen?


Beispiel:
Laufwerk: C:
Ordner: XYZ
Unterordner: AAA bis ZZZ (Anzahl variiert)
Datei im Unterordner: xxxxx####.jpg (Anzahl variiert)

Die neue Datei im Unterordner sollte nach der Umbenennung wie folgt aussehen: AAA####.jpg (Name des Unterordners+Nr.)

In jedem Ordner sollen die *.jpg Dateien im wieder ab 0001 durchnummeriert werden.

Und die umgenannten Dateien sollen auch nicht in ein anderes Verzeichnis kopiert werden, sonder da bleiben wo sie sind.


Vielen Dank schon mal im Voraus.

Gruß xercxes
Mitglied: frankie1971
frankie1971 26.04.2009 um 11:38:57 Uhr
Goto Top
Tag zusammen.

Mit dem Batch
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (
FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do move /-Y "%%i\%%j" "%%i%%~xj"
rd /s /q "%%i"
)
komme ich schon mal gut zurecht. Vielen Dank dafür.

Könnte man da eventuell noch eine Erweiterung einbauen?

Nehmen wir an, der Hauptordner heisst "Italien 2008" und in diesem Ordner sind beispielsweise zwei Unterordner namens "Woche 1" und "Woche 2" mit je einer Videodatei.

Ist: c:\Italien 2008\Woche 1\video1.wmv und c:\Italien 2008\Woche 2\video2.wmv
Soll: c:\Italien 2008.Woche1.video1.wmv und c:\Italien 2008.Woche2.video2.wmv

Geht das irgendwie?

Vielen Dank schon mal im voraus.
Mitglied: miniversum
miniversum 26.04.2009 um 12:04:44 Uhr
Goto Top
Ungetestet versuchs mal so:
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
  FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do move /-Y "%%i\%%j" "%%i%%~xj"  
  rd /s /q "%%i"  
  FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (  
    FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do move /-Y "%%i\%%j\%%k" "%%i.%%j.%%~xk"  
    rd /s /q "%%i\%%j"  
  )
)
Mitglied: frankie1971
frankie1971 26.04.2009 um 12:44:28 Uhr
Goto Top
Geht leider nicht. Haupt- und Unterordner (samt Dateien) verschwinden einfach. Dateien, die indes im Hauptordner liegen, werden - wie im Deinem vorherigen Batch - berücksichtigt.
Mitglied: miniversum
miniversum 26.04.2009 um 13:28:49 Uhr
Goto Top
Versuchs mal damit:
@echo off
FOR /F "delims=" %%i in ('dir /B /AD') do (  
  dir "%%i" /B /A-D >NUL 2>NUL && FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do move /-Y "%%i\%%j" "%%i%%~xj"  
  FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (  
    FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do move /-Y "%%i\%%j\%%k" "%%i.%%j%%~xk"  
  )
  rd /s /q "%%i"  
)
Das problem war dass das Vezeichniss gelöscht wurde bevor es ausgelesen werden konnte.
Teste es damit mal. Das sollte besser gehen.
Mitglied: frankie1971
frankie1971 26.04.2009 um 13:37:45 Uhr
Goto Top
Supi. Das klappt wunderbar. Du bist der Beste face-smile

Was müsste man noch hinzufügen, wenn man die Batch-Datei in einen Oberorder - sagen wir mal - "Urlaube" positionieren würde? Denn ich hätte da mehrere Hauptordner (Italien 2008 etc.) und müsste dann nicht in jeden Hauptordner die Batch-Datei kopieren und einzeln ausführen.

Vielen Dank erstmal dafür und noch einen schönen Restsonntag.
Mitglied: miniversum
miniversum 26.04.2009 um 16:22:15 Uhr
Goto Top
Willst du das diese Unterordner dann auch ALLE verarbeitet werden?
oder nur ein einzelner jeweils?
Fall1: Alle Unterordner verarbeiten:
@echo off
FOR /F "delims=" %%a in ('dir /B /AD') do (  
pushd "%%i"  
call:verarbeite
popd
)
goto:eof

:verarbeite
FOR /F "delims=" %%i in ('dir /B /AD') do (  
  dir "%%i" /B /A-D >NUL 2>NUL && FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do move /-Y "%%i\%%j" "%%i%%~xj"  
  FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (  
    FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do move /-Y "%%i\%%j\%%k" "%%i.%%j%%~xk"  
  )
  rd /s /q "%%i"  
)
goto:eof
Fall2: Der ordner der mit der Maus auf die Batch gezogen wird wird verarbeitet:
@echo off
pushd "%~1"  
call:verarbeite
popd
goto:eof

:verarbeite
FOR /F "delims=" %%i in ('dir /B /AD') do (  
  dir "%%i" /B /A-D >NUL 2>NUL && FOR /F "delims=" %%j in ('dir "%%i" /B /A-D') do move /-Y "%%i\%%j" "%%i%%~xj"  
  FOR /F "delims=" %%j in ('dir "%%i" /B /AD') do (  
    FOR /F "delims=" %%k in ('dir "%%i\%%j" /B /A-D') do move /-Y "%%i\%%j\%%k" "%%i.%%j%%~xk"  
  )
  rd /s /q "%%i"  
)
goto:eof
Bei der ersten Möglichkeit wird davon ausgegangen das die Batch eine Ordnerebene höher liegt. Soll die Batch auch wo ganz anders liegen können kannst du die zweite Zeile so abändern:
FOR /F "delims=" %%a in ('dir /B /AD C:\urlaube') do (
Bei der Zweiten Batchdatei ist es egal wo die Batch und der zu verarbeitende Ordner liegt.
Mitglied: frankie1971
frankie1971 27.04.2009 um 07:42:17 Uhr
Goto Top
Supi. Fall1 ist genau richtig... face-smile

Nochmals vielen lieben Dank an Dich...
Mitglied: Marcel2001
Marcel2001 24.10.2009 um 12:22:03 Uhr
Goto Top
Zitat von @Andichrist:

Aufbau-Beispiel:

Die Ordner liegen z.B. alle in c:\Temp\

Verzeichnis 1
Datei x.jpg
Datei x.txt

Verzeichnis B
Noch eine Datei z.jpg
Noch eine Datei z.txt

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

Als Ergebnis nach dem Batchaufruf sollte im Verzeichnis c:\temp\
nur noch zu finden sein:

Verzeichnis 1.jpg
Verzeichnis 1.txt
Verzeichnis B.jpg
Verzeichnis B.txt
Verzeichnis 3.jpg
Verzeichnis 3.txt

Ideal wäre es, wenn man dies in einer Batch lösen


Hallo Zusammen,
nach langem suchen bin ich auf eure Seite gestoßen.

Ich such fast genau so ein Batch (der super funktioniert) , allerdings möchte ich die Ordnerstruktur behalten nach dem umbenennen.
D.h. die Dateien im Unterordner sollen nur nach dem Ordner umbennant werden.
Ist das machbar???

Vielen Dank

Gruß
Marcel2001