1garym
Goto Top

Per Batch bzw. Skript Inhalte von Ordnern in andere Ordner mit gleichem Namen verschieben

Hallo,

ich benötige etwas Unterstützung bei der Umsetzung eines größeren Datenumzugs. Nachfolgende Aufgabe soll möglichst automatisiert ablaufen:

Ich möchte aus einem Ordner (C:\Daten\Projekte\123456_Projektname\Aufgaben\Allgemein) alle Dateien/Ordner an einen neuen Ort (D:\NEU) verschieben. Am neuen Speicherort soll unter D:\Daten der Ordner des Projekts (123456_Projektname) erstellt werden und darin soll dann alles (Ordner, Unterordner und Dateien) aus C:\Daten\Projekte\123456_Projektname\1-Aufgaben\01-Allgemein verschoben werden. Die Ordnernamen der Projekte sind immer nach dem Schema 1234_Projektname bzw. 123456_Projektname angelegt worden. Bei den Projektnamen sind auch Leerzeichen und Umlaute dabei, z.B. 123456_Schöner Wohnen usw.

Ich hab hier im Forum schon viele Beiträge gefunden, aber keine passte so richtig zu meinem Vorhaben. Wäre super, wenn mir jemand helfen könnte.

Vorab besten Dank

Gary

Content-Key: 234461

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

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

Member: Xaero1982
Xaero1982 Apr 03, 2014 at 21:14:34 (UTC)
Goto Top
Moin,

nur zum Verständnis:

Du willst Daten aus dem Ordner:
C:\Daten\Projekte\123456_Projektname\Aufgaben\Allgemein
nach

d:\Daten_der_Ordner_des_Projekts_(123456_Projektname)

verschieben oder nach:

d:\123456_Projektname

?

So richtig klar find ich das nicht.

Dann tuts doch ein simpler Copy-Befehl:

copy c:\daten\projekte\*.* d:\*.*

Gruß
Member: 1garym
1garym Apr 04, 2014 updated at 04:44:13 (UTC)
Goto Top
Hallo,

sorry, ich versuchs nochmal mit einem übersichtlicheren Beispiel face-smile

Quelle der Daten (es gibt über 300 dieser Projektordner unter C:\Daten\Projekte) z.B.:

C:\Daten\Projekte\123456_Huber\Aufgaben\Allgemein
C:\Daten\Projekte\123654_Meier\Aufgaben\Allgemein
C:\Daten\Projekte\3214_Müller\Aufgaben\Allgemein

Der gesamte Inhalt (Dateien und ggf. weitere Ordner) von "Allgemein" soll für jedes Projekt an einen anderen Ort verschoben werden. Der Pfad des Ziels ist D:\Daten\Archiv und am Ende soll es so aussehen:

D:\Daten\Archiv\123456_Huber\(hier jetzt der Inhalt von C:\Daten\Projekte\123456_Huber\Aufgaben\Allgemein)
D:\Daten\Archiv\123654_Meier\(hier jetzt der Inhalt von C:\Daten\Projekte\123654_Meier\Aufgaben\Allgemein)
D:\Daten\Archiv\3214_Müller\(hier jetzt der Inhalt von C:\Daten\Projekte\3214_Müller\Aufgaben\Allgemein)

Es muss also unter D:\Daten\Archiv der jeweilige Projektordner (z.B. "3214_Müller") neu angelegt werden und in diesen dann der Inhalt von "Allgemein" eingefügt werden.

Ich hoffe, dass es jetzt nachvollziehbar ist face-smile

Vorab besten Dank
Gary
Member: Xaero1982
Xaero1982 Apr 04, 2014 updated at 06:18:32 (UTC)
Goto Top
Evtl. geht es ja so...

@echo off
for /f "delims=\ tokens=1*" %%i in ('dir "c:\daten\projekte\" /b /ad') do md "d:\daten\archiv\%%i"  
for /f "delims=\ tokens=1*" %%i in ('dir "c:\daten\projekte\" /b /ad') do copy "c:\daten\projekte\%%i\aufgaben\allgemein\*.*" "d:\daten\archiv\%%i\*.*"  

Edit: Da du es ja verschieben willst kannst du dann mit:

rd /s /q c:\daten\projekte\
die Ordner löschen - ACHTUNG bei diesem Kommando erfolgt dann keine Nachfrage (/q)

Gruß
ps: irgendwer bekommt das sicher als Einzeiler hin face-smile
Member: SaschaRD
SaschaRD Apr 04, 2014 at 06:39:58 (UTC)
Goto Top
Sieht gut aus @xaero

Kleiner Zusatz: falls jemand mit Variablen arbeiten möchte s.u.
set quelle="c:\daten\projekte"  
set ziel="d:\daten\archiv"  

for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /ad') do md %ziel%\%%i  
for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /ad') do copy %quelle%\%%i\aufgaben\allgemein\*.* %ziel%\%%i\*.*  
Gruß, Sascha
Member: Xaero1982
Xaero1982 Apr 04, 2014 at 06:47:55 (UTC)
Goto Top
Danke face-smile

Deins sieht schöner aus face-smile

Gruß
Member: 1garym
1garym Apr 04, 2014 at 07:00:27 (UTC)
Goto Top
Hallo,

super! Wir sind genau auf dem richtigen Wegface-smile Beide Varianten funktionieren gleich gut face-smile

Folgendes gäbe es noch umzusetzen:

Die Unterordner von z.B. "C:\Daten\Projekte\123456_Huber\Aufgaben\Allgemein" werden nicht mit kopiert, nur die Dateien. Sicher nur eine Kleinigkeit.

Nächste Aufgabe wäre dann noch das Löschen der Quelle, also jeweils der Ordner "Allgemein". Perfekt wäre es, wenn vorher geprüft wird, ob am neuen Ziel auch alles angekommen ist face-smile

Vorab besten Dank face-smile
Gary
Member: SaschaRD
SaschaRD Apr 04, 2014 updated at 07:16:12 (UTC)
Goto Top
Morgen Gary,
set quelle="c:\daten\projekte"  
set ziel="d:\daten\archiv"  

for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /ad') do md %ziel%\%%i  
for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /ad') do xcopy /S /E %quelle%\%%i\aufgaben\allgemein\*.* %ziel%\%%i\*.*  

Dann muss xcopy verwendet werden.
Dazu öffnest Du am besten die Windows CLI und machst xcopy /? Dann erhälst Du die Befehlsmöglichkeiten.

/S = Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind.
/E = Kopiert alle Unterverzeichnisse (leer oder nicht leer).

Gruß, Sascha
Member: Xaero1982
Xaero1982 Apr 04, 2014 updated at 07:26:13 (UTC)
Goto Top
Er wird so ein Problem bekommen wenn Ordner ein Leerzeichen haben: (Man achte auf die "")

set quelle="c:\daten\projekte"  
set ziel="d:\daten\archiv"  

for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /ad') do md %ziel%\"%%i"  
for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /ad') do xcopy %quelle%\"%%i\aufgaben\allgemein\*.*" %ziel%\"%%i"\ /E /Y /H  

/H kopiert noch versteckte Dateien oder Systemdateien.
ob /E oder /S musst du entscheiden. /E kopiert auch leere Ordner

Den Vergleich überlass ich jemand anderes face-smile

Gruß
Member: 1garym
1garym Apr 04, 2014 at 07:27:22 (UTC)
Goto Top
Perfekt! Funktioniert wunderbar face-smile Jetzt noch die Daten der Quelle löschen, also jeweils der Ordner "Allgemein". Perfekt wäre es, wenn vorher geprüft wird, ob am neuen Ziel auch alles angekommen ist

Vielen vielen Dank !
Gary
Member: SaschaRD
SaschaRD Apr 04, 2014 at 09:24:52 (UTC)
Goto Top
Hallo Gary,

das mit der Prüfung wird komplexer. Heißt ein Dateivergleich oder gleich zu Robocopy wechseln =)
Hier ein Link in dem Robocopy erklärt ist.

Ein weiterer Link aus dem Forum Administrator.de

Gruß, Sascha
Member: Xaero1982
Xaero1982 Apr 04, 2014 updated at 13:28:12 (UTC)
Goto Top
EDIT: Korrektur um 15:25 Getestet auf Server 2008
So,

nicht schön, aber selten:

@echo off
set quelle="c:\daten\projekte"  
set ziel="d:\daten\archiv"  
set tmpfile=%temp%\test.txt

for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /a /ad') do md %ziel%\"%%i"   
if exist %tmpfile% (del %tmpfile%)
for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /a /ad') do echo %%i >>%tmpfile%  
for /f "delims=\ tokens=1*" %%i in ('dir %quelle% /b /a /ad') do xcopy %quelle%\"%%  

i\aufgaben\allgemein\*.*" %ziel%\"%%i"\ /E /Y /H  

set /A qdateien=0
set /A qordner=0
for /f %%d in (%tmpfile%) do (
for /F %%i in ('dir %quelle%\%%d\aufgaben\allgemein /s /a /B /A-d') do set /A qdateien=qdateien+1  
for /F %%i in ('dir %quelle%\%%d\aufgaben\allgemein /s /a /B /Ad') do set /A qordner=qordner+1  
)
echo Im Ordner %quelle% befinden sich: %qdateien% Dateien und %qordner% Ordner

set /A zdateien=0
set /A zordner=0
for /f %%d in (%tmpfile%) do (
for /F "delims=\ tokens=1*" %%i in ('dir %ziel%\%%d /s /a /B /A-d') do set /A zdateien=zdateien+1  
for /F "delims=\ tokens=1*" %%i in ('dir %ziel%\%%d /s /a /B /Ad') do set /A zordner=zordner+1  
)
echo Im Ordner %ziel% befinden sich: %zdateien% Dateien und %zordner% Ordner

IF %qdateien% == %zdateien% (echo Dateianzahl stimmt! ) ELSE (GOTO FError)
if %qordner% == %zordner% (echo Ordnerzahl stimmt! Goto kopieren) ELSE (GOTO OError)

:kopieren
for /f %%d in (test.txt) do ( echo /s /q %quelle%\"%%d\aufgaben\allgemein" )  
GOTO EOF

:FError
echo ACHTUNG: Dateianzahl stimmt nicht ueberein!
GOTO EOF

:OError
echo ACHTUNG: Ordneranzahl stimmt nicht ueberein!
GOTO EOF

:EOF
del %tmpfile%

Es gibt hier ein paar Fallstricke.

1. Er überprüft natürlich keine Dateigrößen/Fehlerfreiheit der Dateien
2. Du musst aus dem echo in (Zeile 33)
for /f %%d in (test.txt) do ( echo /s /q %quelle%\%%d\aufgaben\allgemein )
ein rd machen, damit die Dateien gelöscht werden inkl. des Ordners allgemein.
3. Du brauchst Schreibrechte an dem Ort an dem die Batch liegt, weil dort eine temporäre Datei erstellt wird. Edit: Dank des Einwands von Bastla obsolet - Tempdatei wird im Ordner %temp% temporär angelegt.

Gruß
PS: Verwendung auf eigene Gefahr face-smile
Member: 1garym
1garym Apr 04, 2014 at 11:30:11 (UTC)
Goto Top
Super, ich werde es vorab ausgiebig testen, damit da nix verloren geht face-smile Herzlichen Dank an Euch alle und ein schönes Wochende face-smile

Gary
Member: Xaero1982
Xaero1982 Apr 04, 2014 at 11:31:14 (UTC)
Goto Top
Korrektur siehe oben!
Member: bastla
bastla Apr 04, 2014 at 13:22:24 (UTC)
Goto Top
@ Xaero1982
Du brauchst Schreibrechte an dem Ort an dem die Batch liegt, weil dort eine temporäre Datei erstellt wird.
Im %TEMP%-Ordner hat der User eigentlich immer Schreibrechte ...

Grüße
bastla
Member: Xaero1982
Xaero1982 Apr 04, 2014 at 13:23:14 (UTC)
Goto Top
Stimmt ... kann ich noch anpassen - guter Einwand face-smile

Gruß
Member: mayho33
mayho33 Apr 14, 2014 at 14:35:07 (UTC)
Goto Top
Hi!

Warum verwendest du nicht USMT?

Vorteil: Wiederverwendbarkeit, unendlich viele Möglichkeiten was wie und wann gesichert wird, unscharfe suche mit Patterns, Verschieben beim Wiederherstellen in andere Ordner, usw.

eventueller Nachteil: Man muss sich in das Thema einarbeiten

lg

mayho
Member: Xaero1982
Xaero1982 Apr 14, 2014 at 16:15:07 (UTC)
Goto Top
Zitat von @mayho33:

Hi!

Warum verwendest du nicht USMT?

Vorteil: Wiederverwendbarkeit, unendlich viele Möglichkeiten was wie und wann gesichert wird, unscharfe suche mit Patterns,
Verschieben beim Wiederherstellen in andere Ordner, usw.

eventueller Nachteil: Man muss sich in das Thema einarbeiten

lg

mayho

Was genau hat USMT damit zu tun?
https://www.google.com/search?client=opera&q=USMT&sourceid=opera ...

Sagt mir es wird für die Nutzermigration benutzt. Darum geht es hier aber nicht.

Gruß