
Ich habe über 1 Million (kleine) Dateien (<500 kB jpg) in einer Struktur wie dieser:
H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folder
Jeder Unterunterunterordner enthält 10–15 Dateien, Unterunterordner könnte ein Datums-/Zeitstempel sein, Unterordner ist ein Maschinenname und Ordner ist eine weitere erhöhte Nummer.
Ich brauche eine Kopie des Hauptordners mit derselben Struktur, muss aber überprüfen, ob meine Kopie zu 100 % mit der Quelle übereinstimmt. Der Windows Explorer blockiert nach ca. 1000 Kopien und zeigt nicht einmal die Eigenschaften an (Größe, Größe auf der Festplatte, Inhalt).
Ich brauche einen Stapel, der H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA
alle 14 Dateiattribute liest, kopiert und einfügt. Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA
Öffnen Sie die Datei log.txt und schreiben Sie:
„file1.jpg 490 kB erfolgreich von H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA nach Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA kopiert …“
Und
„file15.jpg 470kB erfolgreich von H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA nach Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA kopiert“
usw
Markieren Sie das Ende des Protokolls (eine Zeile ====== oder so etwas) und fahren Sie erst dann mit dem nächsten Vorgang fort (Kopieren von Inhalt und Ordnerstruktur von sub_sub_sub_folderB). Wenn der Kopiervorgang nicht erfolgreich beendet wurde, stoppen Sie, erstellen Sie ein neues Protokoll error_sub_sub_sub_folderB.txt (das nächste Protokoll wird error_sub_sub_sub_folderZ.txt) und wechseln Sie erst nach der Erstellung des Protokolls zum nächsten sub_sub_sub_folder
Kurz gesagt: Ein schrittweises Protokollieren von Kopiervorgängen, das weder das System noch die Hardwareressourcen des Rechners beeinträchtigt.
Antwort1
Sowohl xcopy als auch robocopy erledigen die Aufgabe, aber die Ausgabe von robocopy kommt Ihrer Beschreibung näher.
xcopy src dst /i /e /f /v /c > log.txt
/F gibt die vollständigen Quell- und Zielpfade aus.
/V überprüft angeblich die Dateigrößen, druckt sie aber nicht in der Ausgabe aus.
Abgesehen davon, dass die Dateigrößen nicht protokolliert werden, wird damit größtenteils das erreicht, was Sie beschrieben haben. Es gibt andere Schalter, die steuern können, ob ACLs und Attribute kopiert werden. Da es sich um eine native EXE handelt, ist dies schneller als eine Skriptschleife. Sie erhalten jedoch kein separates Fehlerprotokoll und können einen Unterordner nicht abbrechen und bei einem Fehler mit dem nächsten Unterordner fortfahren (/C setzt alle Dateien bei einem Fehler fort).
Beispielausgabe:
C:\Users\Celery\test>xcopy src dst /i /e /f /v /c
C:\Users\Celery\test\src\a\blah.txt -> C:\Users\Celery\test\dst\a\blah.txt
C:\Users\Celery\test\src\a\blah2.txt -> C:\Users\Celery\test\dst\a\blah2.txt
C:\Users\Celery\test\src\b\blah.txt -> C:\Users\Celery\test\dst\b\blah.txt
C:\Users\Celery\test\src\b\blah2.txt -> C:\Users\Celery\test\dst\b\blah2.txt
4 File(s)
Robocopy erstellt ein ziemlich detailliertes Protokoll, einschließlich der Dateigrößen. Versuchen Sie:
robocopy src dst /e /np /log:log.txt [/tee]
Beispielausgabe:
C:\Users\Celery\test>robocopy src dst /e
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Thursday, 22 January 2015 10:58:55 PM
Source : C:\Users\Celery\test\src\
Dest : C:\Users\Celery\test\dst\
Files : *.*
Options : *.* /S /E /DCOPY:DA /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
New Dir 0 C:\Users\Celery\test\src\
New Dir 2 C:\Users\Celery\test\src\a\
New File 17 blah.txt
New File 17 blah2.txt
New Dir 2 C:\Users\Celery\test\src\b\
New File 17 blah.txt
New File 17 blah2.txt
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 3 3 0 0 0 0
Files : 4 4 0 0 0 0
Bytes : 68 68 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Speed : 2193 Bytes/sec.
Speed : 0.125 MegaBytes/min.
Ended : Thursday, 22 January 2015 10:58:55 PM
Andernfalls bräuchten Sie, um die Iteration selbst zu skripten, vier verschachtelte Schleifen, etwa:
for /d %%a in (main_folder\*) do (
for /d %%b in (%%a\*) do (
for /d %%c in (%%b\*) do (
for /d %%d in (%%c\*) do (
:: code to copy files and write logs goes here
)
echo ================= end of %%d =============== >> log.txt
)
)
)
Dadurch werden nur Dateien in den Unter-Unter-Unterordnern kopiert: Alle Dateien in Ordnern höherer Ebene werden ignoriert, da for /d
nur über Verzeichnisse iteriert wird.