1 votes

Fichier batch pour copier la structure des fichiers et des dossiers un par un, vérifier le résultat et enregistrer le rapport au format txt.

J'ai plus d'un million de fichiers (de petite taille) (<500kB jpg) dans une structure comme celle-ci :

H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folder

Chaque sous_sous_sous_dossier contient 10 à 15 fichiers, le sous_sous_dossier peut être un horodateur, le sous_dossier est un nom de machine et le dossier est un autre nombre incrémenté.

J'ai besoin d'une copie de main_folder avec la même structure mais je dois vérifier que ma copie est 100% identique à la source. L'explorateur Windows se bloque après ~1000 copies, n'affiche même pas les propriétés (taille, taille sur disque, contient).

J'ai besoin d'un lot qui ira à H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA lire et copier tous les attributs des 14 fichiers et les coller dans Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA Ouvrez un fichier log.txt, écrivez :

"file1.jpg 490kB copié depuis H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA à Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA avec succès ..."

y

"file15.jpg 470kB copié de H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA à Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA avec succès"

e.t.c.

marquer la fin du journal (une ligne de ====== ou autre) et ensuite seulement passer à l'opération suivante (copier le contenu et la structure du dossier de sous_sous_sous_dossierB). Si l'opération de copie ne se termine pas avec succès, arrêtez, créez un nouveau journal error_sub_sub_sub_folderB.txt (le prochain journal sera error_sub_sub_sub_folderZ.txt) et seulement après la création du journal, passez au sous-sous-sous-dossier suivant.

En quelques mots : un lot de copies de logging étape par étape qui ne tue pas le système ou les ressources matérielles de la machine.

1voto

Celery Man Points 136

Xcopy et robocopy font tous deux le travail, mais le résultat de robocopy est plus proche de ce que vous avez décrit.

xcopy src dst /i /e /f /v /c > log.txt

/F affichera les chemins d'accès complets de la source et de la destination.

/V est censé vérifier la taille des fichiers, mais ne l'affiche pas dans la sortie.

Hormis le fait que la taille des fichiers n'est pas enregistrée, cette méthode permet d'obtenir ce que vous avez décrit. Il existe d'autres commutateurs qui permettent de contrôler si les ACL et les attributs sont copiés. Comme il s'agit d'un programme exe natif, il sera plus rapide qu'une boucle script. Mais vous n'obtiendrez pas de journal d'erreurs séparé, et vous ne pourrez pas abandonner un sous-dossier et continuer avec le sous-dossier suivant en cas d'erreur (/C continue tous les fichiers en cas d'erreur).

Exemple de sortie :

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 produit un journal assez détaillé, y compris la taille des fichiers. Essayez :

robocopy src dst /e /np /log:log.txt [/tee]

Exemple de sortie :

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

Sinon, pour script l'itération vous-même, vous auriez besoin de quatre boucles imbriquées, comme :

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
    )
  )
)

Cela ne copiera que les fichiers des sous_sous_sous_dossiers : tous les fichiers des dossiers de niveau supérieur seront ignorés, parce que for /d n'itère que sur les répertoires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X