6741
Goto Top

automatisch den Inhalt von Ordner verschiebem bzw kopieren

Hallo,

ich habe einen Ordner ( Ordner1 ) mit ca. 200 Unterordnern. In jeden Unterordner befinden sich ein weitere Ordner mit ca. 50 - 200 Dateien. Jetzt möchte ich den 2. Unterordner eine Ebene höher verschoben bekommen. So das der erste Unterordner gelöscht wird und der zweite Unterordner eine Stufe höher rückt ...

hoffe mir kann einer eine nette Batch schreiben .....

schönes WE

Content-ID: 53703

Url: https://administrator.de/forum/automatisch-den-inhalt-von-ordner-verschiebem-bzw-kopieren-53703.html

Ausgedruckt am: 23.04.2025 um 02:04 Uhr

bastla
bastla 09.03.2007 um 20:36:53 Uhr
Goto Top
Hallo firewalldevil!

Wie immer bei derartigen Aktionen stellt sich eine wichtige Frage: Sind Kollisionen von Unter-Unterordnernamen zu erwarten, und wie ist damit umzugehen?

Zur Erläuterung folgende beispielhafte Struktur:
Ordner1
    Unterordner1
        Test1
        Test3
        Test4
            Datei1.txt
            Datei3.txt
    Unterordner2
        Test2
        Test4
            Datei2.txt
            Datei3.txt
Wenn nach Deinem Wunsch alle Test-Ordner zu Unterordnern von Ordner1 werden sollen, was soll mit Test4 aus Unterordner2 passieren?

Man könnte natürlich einfach alle enthaltenen Dateien in den dann schon existierenden Ordner Ordner1\Test4 (der aus Unterordner1 nach oben verschoben wurde) verschieben - nur würde sich dann die nächste Frage stellen: Was tun mit den beiden gleichnamigen Datei3.txt?

Wenn Du natürlich ausschließen kannst, dass es gleichnamige Unter-Unterordner geben kann, sind gleichnamige Dateien kein Problem ...
Noch eine andere Frage: Sind auch noch Unter-Unter-Unterordner zu berücksichtigen?

Grüße
bastla
6741
6741 09.03.2007 um 22:21:12 Uhr
Goto Top
Hi bastla,

es gibt in dem ersten Ordner immer nur einen eindeutigen ordner, alles was im nächsten unterordner ist, soll eine Stufe höcher und der 2. unterordner kann gelöscht werden. Müsste wohl Ordner für Ordner druchgehen, da ich nicht weiß ob es dateien gibt die in der letzten ebene glecie sind. Wenn es baer Ordner für Ordner abgearbeitet wird, sollte nicht passieren.

gruß
Biber
Biber 10.03.2007 um 12:53:51 Uhr
Goto Top
Hmmm, fwd,

ich bin nicht ganz sicher, ob ich die ganze Aktion richtig verstehe... ich frag lieber noch mal nach...

Ich habe eine Beispielstruktur angelegt, die ich mit zwei FOR /D-Anweisungen durchgehen könnte.
$cmd$dir /b /s Root
Z:\>
$cmd$dir /b /s root
Z:\root\einsA
Z:\root\einsb
Z:\root\einsc
Z:\root\einsd
Z:\root\einsA\zweiAA
Z:\root\einsA\zweiBB
Z:\root\einsA\zweiCC
Z:\root\einsA\zweiDD
Z:\root\einsA\blaeinsA.txt
Z:\root\einsb\zweiNN
Z:\root\einsb\zweiMM
Z:\root\einsb\zweiOO
Z:\root\einsb\blaeinsb.txt
Z:\root\einsb\zweiOO\drei333
Z:\root\einsb\zweiOO\drei334
Z:\root\einsb\zweiOO\drei335
Z:\root\einsb\zweiOO\drei335\vier444
Z:\root\einsb\zweiOO\drei335\vier445
Z:\root\einsb\zweiOO\drei335\vier446
Z:\root\einsc\blaeinsc.txt
Z:\root\einsd\zweiXX
Z:\root\einsd\zweiYY
Z:\root\einsd\zweiZZ
Z:\root\einsd\zweiFF
Z:\root\einsd\zweiGG
Z:\root\einsd\zweiHH
Z:\root\einsd\blaeinsd.txt
Die Zählvariablen nenne ich %e für die erste, %z für die zweite Ebene.
---- einmal Simulation mit "ECHO"  
$cmd$for /D %e in (\Root\*.*) do @(for /d %z in (%e\*.*) do @echo move "%z" "%~dpe") && echo rd "%e"  
move "\Root\einsA\zweiAA" "Z:\Root\"  
move "\Root\einsA\zweiBB" "Z:\Root\"  
move "\Root\einsA\zweiCC" "Z:\Root\"  
move "\Root\einsA\zweiDD" "Z:\Root\"  
rd "\Root\einsA"  
move "\Root\einsb\zweiNN" "Z:\Root\"  
move "\Root\einsb\zweiMM" "Z:\Root\"  
move "\Root\einsb\zweiOO" "Z:\Root\"  
rd "\Root\einsb"  
move "\Root\einsd\zweiXX" "Z:\Root\"  
move "\Root\einsd\zweiYY" "Z:\Root\"  
move "\Root\einsd\zweiZZ" "Z:\Root\"  
move "\Root\einsd\zweiFF" "Z:\Root\"  
move "\Root\einsd\zweiGG" "Z:\Root\"  
move "\Root\einsd\zweiHH" "Z:\Root\"  
rd "\Root\einsd"  
Jetzt etwas ernsthafter:
$cmd$for /D %e in (\Root\*.*) do @(for /d %z in (%e\*.*) do @move "%z" "%~dpe">nul) &&  rd "%e" 2>nul  
$cmd$for /D %e in (\Root\*.*) do @(for /d %z in (%e\*.*) do @move "%z" "%~dpe">nul) &&  rd "%e" 2>nul  

$cmd$dir /s /b root
Z:\root\einsA
Z:\root\einsb
Z:\root\einsc
Z:\root\einsd
Z:\root\zweiHH
Z:\root\zweiAA
Z:\root\zweiBB
Z:\root\zweiCC
Z:\root\zweiDD
Z:\root\zweiNN
Z:\root\zweiMM
Z:\root\zweiXX
Z:\root\zweiYY
Z:\root\zweiZZ
Z:\root\zweiFF
Z:\root\zweiGG
Z:\root\drei333
Z:\root\drei334
Z:\root\vier444
Z:\root\vier445
Z:\root\vier446
Z:\root\einsA\blaeinsA.txt
Z:\root\einsb\blaeinsb.txt
Z:\root\einsc\blaeinsc.txt
Z:\root\einsd\blaeinsd.txt

Ergebnis:
- die Ordner der Unterebenen sind in die neue Ebene "Root" verschoben worden.
- aber die Verzeichnisse einsA, einsB, einsC und einsD konnten nicht gelöscht werden, da dort noch Dateien liegen (blaeinsA.txt etc).

Was sollte denn mit solchen Dateien passieren, falls vorhanden? Wo gehören die denn hin?

Gruss
Biber
6741
6741 10.03.2007 um 13:38:47 Uhr
Goto Top
Hi Biber ...

danke das du dich der Aufgabe stellst .... ;>)

\\daten\ordner1\ordner2\*.txt
.
.
. bis ca. 200 x
.
.
\\daten\ordner1\ordner2\*.txt

Ordner2 soll auf die Höhe von Ordner1 verschoben werden , dann kann Ordner1 ( alt ) gelöscht werden.

die Ordner 1 u. 2 haben keine Ordnung bzw sind mit Buchstaben, Zahlen und erlaubt Sonderzeichen verstehen. Es gibt keine erkennbar Struktur in der Benennung.

Können also hießen z.b. [asdee]_001 oder auch asdd-zzu09, das glaube ich ist das Problem ...

gruß in WE
Biber
Biber 10.03.2007 um 13:50:42 Uhr
Goto Top
Moin fwd,

dann sollte das doppelte FOR/D-Schleifchen oben ja passen.
Du musst nur statt ...(\Root\*.*)... in meinem Beispiel bei dir schreiben: ....(\\daten\ordner?)...

Probier es doch mal vom CMD-Prompt mit der Simulations-Variante (die mit den "Echo"s).
for /D %e in (\\Daten\Ordner*.*) do @(for /d %z in (%e\*.*) do @echo move "%z" "%~dpe") && echo rd "%e"
Wie sieht denn dann das Ergebnis aus?

Gruss
Biber
6741
6741 15.03.2007 um 17:52:59 Uhr
Goto Top
hi biber ...

es tut sich nichts ... mmhhh ...

der Ordner heißt jetzt ...

d:\daten1\daten2\ordner1\ordner2\

also von ordner2 nach ordner 1 soll gehen ...
Biber
Biber 15.03.2007 um 19:02:44 Uhr
Goto Top
Moin, fwd,

dann reden wir noch ein ganz klein bissi aneinander vorbei.

Meine Zeile tut folgendes:
(=18:56:10  F:\=)
><b>dir d:\daten1 /b /s</b>
d:\daten1\daten2
d:\daten1\daten2\ordner1
d:\daten1\daten2\ordner1\ordner2
(=18:56:20  F:\=)
><b>for /D %e in (d:\Daten1\*) do @(for /d %z in (%e\*.*) do @move "%z" "%~dpe") && rd "%e"</b>  

(=18:56:32  F:\=)
><b>dir d:\daten1 /b /s</b>
d:\daten1\ordner1
d:\daten1\ordner1\ordner2

Bitte mal mal das auf, was bei Dir bei dem "dir d:\daten1 /b /s" herauskommen soll.

Offensichtlich habe ich die Unter/Verschiebe-Ebenen anders verstanden als Du gemeint hattest.

Gruss
Biber
6741
6741 15.03.2007 um 19:31:36 Uhr
Goto Top
wie du es postetes siehts gut aus, aber ich möchte ordner2 auf die Höhe von Ordner 1 verschoben haben. Daten1 und Daten2 sind eindeutige Namen.

gruß
Biber
Biber 15.03.2007 um 19:53:39 Uhr
Goto Top
Na dann ist doch noch viel weniger Aufwand...
>md d:\daten1\daten2\ordner1\ordner2
>for /D %e in (d:\Daten1\daten2\*) do @(for /d %z in (%e\*.) do @move "%z" "%~dpe")  

(=19:52:04  F:\=)
>dir d:\daten1 /b /s
d:\daten1\daten2
d:\daten1\daten2\ordner1
d:\daten1\daten2\ordner2

Gruss
Biber
6741
6741 16.03.2007 um 18:37:58 Uhr
Goto Top
hi biber,

die dos box sagt, system kann die angegebene datei nicht finden ...

also ordner1 kann 100 unterschiedliche namen haben und ordner 2 auch .. es gibt keinen zusammenhang ..

gruß ins we
Biber
Biber 16.03.2007 um 18:48:43 Uhr
Goto Top
Na fwd,

das muss ich auch erstmal überschlafen - oder mal andere ranlassen.
Ich mach jetzt auch erstmal Wochenende,

Gruss
Biber
bastla
bastla 16.03.2007 um 23:58:56 Uhr
Goto Top
Hallo firewalldevil!

Nur so eine Frage: Sagt die "DOS-Box" vielleicht auch, dass die Ordner trotz der irritierenden Meldungen verschoben wurden?

Wie auch immer, versuch es vielleicht damit:
@echo off
for /f "delims=" %%e in ('dir "%~1" /b /ad') do (  
	for /f "delims=" %%z in ('dir /b /ad "%~1\%%e"') do move "%~1\%%e\%%z" "%~1"   
	rd "%~1\%%e" 2>nul  
)
Aufruf (wenn als "C:\Scripts\LiftFolders.bat") gespeichert:
C:\Scripts\LiftFolders.bat "D:\Daten1\Daten2"  
@Biber
Nach meinen Versuchen mit dem Schalter "/D" scheint es so, als würden die nach oben verschobenen Ordner ein weiteres Mal behandelt (seltsam genug), wobei dies, wenn der Name dieser Ordner Leerzeichen enthält, für jeden Namensbestandteil einzeln versucht wird - also Verschieben klappt, aber danach die ganzen Fehlermeldungen "Das System kann die angegebene Datei nicht finden." ...

Schönes WE
bastla
6741
6741 18.03.2007 um 20:01:13 Uhr
Goto Top
hi bastla ...

das Script liegt auf c:\scritps und die Ordner auf d:\daten ...

ich erkenne nicht den Zusammenhang das das Script d:\ ansteuert ... kannst du mir bitte das Script erklären ...

Gruß und Danke
bastla
bastla 18.03.2007 um 20:13:10 Uhr
Goto Top
Hallo firewalldevil!

Das Script ist etwas allgemeiner gehalten und erwartet den zu bearbeitenden Ordner als Argument beim Aufruf - also musst Du es, wie oben beschrieben, starten mit:
C:\Scripts\LiftFolders.bat <b>"D:\Daten1\Daten2"</b>  
Um es gegen einen Aufruf ohne Argument abzusichern, könntest Du noch folgende Zeile nach "@echo off" einfügen:
if [%1]== echo Bitte Startordner beim Aufruf angeben! & goto :eof

Grüße
bastla
bastla
bastla 18.03.2007 um 20:53:13 Uhr
Goto Top
Hallo firewalldevil!

Vielleicht ist es Dir so sympathischer:
@echo off
set "Ordner=D:\Daten1\Daten2"  
for /f "delims=" %%e in ('dir "%Ordner%" /b /ad') do (  
    for /f "delims=" %%z in ('dir /b /ad "%Ordner%\%%e"') do move "%Ordner%\%%e\%%z" "%Ordner%"   
    rd "%Ordner%\%%e" 2>nul  
)
Jetzt kannst Du wieder durch einfachen Aufruf der Batch-Datei starten.

Grüße
bastla