Commandes Robocopy : Migration de données, synchronisation de dossiers, et plus

Robocopy est l’un des utilitaires en ligne de commande les plus utilisés pour copier de grandes quantités de données sous Windows. C’est un outil très puissant, mais aussi complexe. Dans ce guide, nous allons vous expliquer en détail cette complexité et vous fournir un tutoriel complet sur l’utilisation de cet outil utile.

Robocopy est un utilitaire en ligne de commande pour Windows qui existe depuis Windows NT. Il remplace l’utilitaire moins polyvalent xcopy. Il vous permet de spécifier un chemin de lecteur ou un chemin de serveur pour copier/déplacer des fichiers à l’invite de commande.

La version actuelle de Robocopy au moment de la rédaction est la version 10.0.18. C’est sur cette version que j’ai effectué mes tests.

Robocopy offre de nombreuses fonctionnalités que vous pouvez exploiter pour effectuer des copies et des déplacements de fichiers efficaces et rapides. Il peut :

  • Copier des fichiers sur un réseau avec des capacités de reprise
  • Ignorer les points de jonction NTFS qui peuvent entraîner des boucles infinies
  • Copier les attributs des fichiers et des répertoires en préservant les horodatages
  • Copier les autorisations NTFS, les propriétaires et les informations d’audit
  • Copier les horodatages des répertoires
  • Copier les fichiers en mode « sauvegarde » pour s’assurer que les fichiers sont copiés même si les droits ont été refusés à l’administrateur
  • Réessayer automatiquement
  • Synchroniser deux dossiers
  • Être suffisamment intelligent pour ignorer les fichiers déjà copiés
  • Copier des chemins d’accès dépassant la limite de 256 caractères
  • Effectuer des copies asynchrones grâce à sa capacité de multitâche.
  • Retourne des codes de sortie normalisés à utiliser dans les scripts.

Comme vous pouvez le voir, il y a beaucoup à copier. Je voulais couvrir tout ce que vous devez savoir sur cet outil pratique.

Référence de syntaxe commune pour Robocopy

Pourquoi un si long article de blog sur un seul utilitaire ? Jetez un œil aux tableaux ci-dessous. Vous avez beaucoup d’options pour copier ou déplacer des fichiers avec robocopy ! Vous trouverez plus d’options dans les sections individuelles.

Ces tableaux ont été construits à partir de la syntaxe d’aide renvoyée par robocopy /?. Ils ont été subdivisés en sections plus significatives, enrichis au fil du temps et nettoyés pour fournir des informations plus utiles.

Options de source

Switch Explanation Default Behavior Equivalent Switch Notes
/S Copy subfolders
/E Copy subfolders including empty subfolders
/COPY:[DATSOU] Copy options /COPY:DAT D=Data, A=Attributes, T=Timestamps S=Security=NTFS ACLs, O=Owner info, U=aUditing info. File Data (D) always includes file Timestamps (T)
/SEC Copy files with SECurity /COPY:DATS
/DCOPY:T Copy directory timestamps
/COPYALL Copy ALL file info /COPY:DATSOU This will prevent dehydrating offline files and will instead copy the file’s tag (on emc VNX/Unity systems at least). This is not officially documented! If dehydration is what you need (reason i found this issue), you can’t copy the ACLs along your files. CREDIT: Monsieurx (Reddit)
/NOCOPY Copy NO file info useful with /PURGE
/A Copy only files with the Archive attribute set
/M like /A, but remove Archive attribute from source files
/LEV:n Only copy the top n LEVels of the source tree
/MAXAGE:n MAXimum file AGE – exclude files older than n days/date
/MINAGE:n MINimum file AGE – exclude files newer than n days/date If n < 1900 then n = no of days, else n = YYYYMMDD date
/FFT Assume FAT File Times 2-second date/time granularity. This replaces NTFS timestamps. Seems to be more reliable when transferring over a network.
/256 Turn off very long path (> 256 characters) support

Options de destination

Switch Explanation Default Behavior Equivalent Switch Notes
/A+:[RASHCNET] Set file attribute(s) on destination files + add
/A-:[RASHCNET] Remove file attribute(s) on destination files
/FAT Create destination files using 8.3 FAT file names only
/CREATE Create directory tree structure + zero-length files only
/DST Compensate for one-hour DST time differences

Options de copie

Switch Explanation Default Behavior Equivalent Switch Notes
/L List files only Don’t copy, timestamp or delete any files
/MOV Move files Delete from source after copying
/MOVE Move files and directories Delete from source after copying
/sl Copy file symbolic links instead of the target
/Z Copy files in restartable mode Survive a network glitch
/B Copy files in backup mode
/J Copy using unbuffered I/O Recommended for large files
/NOOFFLOAD Copy files without using the Windows copy offload mechanism https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831628(v=ws.11)
/EFSRAW Copy any encrypted files using EFS RAW mode
/TIMFIX Fix file times on all files, even skipped files
/XO Exclude older if destination file exists and is the same date or newer than the source – don’t bother to overwrite it.
/XC Exclude changed files
/XN Exclude newer files
/XX Exclude files present in destination but not source /XX
/XF file [file]… Exclude files matching given names/paths/wildcards
/XD dirs [dirs]… Exclude directories matching given names/paths. /XF and /XD can be used in combination e.g. ROBOCOPY c:\source d:\dest /XF *.doc *.xls /XD c:\unwanted /S
/IA:[RASHCNETO] Include files with any of the given attributes
/XA:[RASHCNETO] Exclude files with any of the given attributes
/IM Overwrite modified files. This includes the same files with different times.
/IS Overwrite files even if they are already the same
/IT Include tweaked files
/XJ Exclude junction points from source /XJ
/XJD Exclude junction points from source directories
/XJF Exclude junction points from source files
/MAX:n Exclude files bigger than n bytes
/MIN:n Exclude files smaller than n bytes
/MAXLAD:n Exclude files unused since n
/MINLAD:n Exclude files used since n If n < 1900 then n = n days, else n = YYYYMMDD date
/MIR Mirror a directory tree /PURGE /E
/PURGE Delete dest files/folders that no longer exist in source
/XL Exclude files present in source but not destination
/SECFIX Robocopy /secfix fixes file security on all files, even skipped files. Specify the type of security information you want to copy by also using one of these options: /COPYALL /COPY:O /COPY:S /COPY:U /SEC
/ZB Use restartable mode; if access denied use Backup mode

Options de surveillance

Switch Explanation Default Behavior Equivalent Switch Notes
/R:n Number of retries on failed copies /R:1000000 Always try to set this option. I recommend setting this to 10-20 to not waste time retrying.
/W:n Wait time between retries /W:30 Always try to set this option to a lower number to retry more quickly. I suggest 5-10.
/REG Save /R:n and /W:n in the Windows registry as default settings
/RH:hhmm-hhmm times when new copies can be started
/TBD Wait for sharenames to be defined retry error 67
/PF Check run hours on a per file (not per pass) basis
/MON:n Run again when more than n changes seen
/MOT:m Run again in m minutes, if changed

Compréhension du comportement de Robocopy

I’ve now completely blew your mind with all of the potential syntax options available to you. Let’s now see all of the different combinations of how we can use this syntax.

I could provide you an enormously long list of robocopy commands with an ever-growing number of switches. But I think it’s better to teach you how to fish. Let’s go over how to put sense out of all of these options.

Robocopy ne copie que des répertoires entiers

Chaque exécution de robocopy aura un répertoire source et un répertoire de destination. Robocopy copie et déplace des fichiers par répertoire entier. Il n’est pas possible de copier explicitement un seul fichier avec robocopy. Utilisez copy ou Copy-Item de PowerShell pour cela.

Cependant, vous pouvez copier un seul fichier avec le bon filtrage que vous apprendrez ci-dessous. Pour copier un seul fichier avec robocopy, spécifiez immédiatement le répertoire source et le répertoire de destination, suivi du nom du fichier dans la source.

> robocopy c:\src d:\dst copythisfile.txt

La syntaxe dépend de l’environnement

De plus, les options que vous fournissez à robocopy dépendront de l’environnement. Vous devrez répondre à quelques questions pour savoir quelles options utiliser.

  • Allez-vous toujours copier vers un répertoire vide ?
  • Est-il possible que des fichiers existent déjà dans le répertoire de destination ?
  • Allez-vous copier des téraoctets de données ou seulement quelques mégaoctets ?
  • Allez-vous copier des fichiers via un réseau ou localement ?
  • … et plus encore.

Si aucun fichier n’existe dans le répertoire de destination, vous ne devriez pas vous soucier des options qui écrasent les fichiers. Si vous ne copiez pas de fichiers via le réseau, ne vous préoccupez pas de ces options. Définissez explicitement les circonstances actuelles et potentielles dans lesquelles votre environnement se trouvera.

Reconnaître les options par défaut

Robocopy utilise de nombreuses options par défaut. Vous pouvez les repérer en consultant les tableaux ci-dessus. Il fournit également une sortie pratique à chaque fois que vous exécutez l’utilitaire.

Vous pouvez voir ci-dessous que lorsque j’ai exécuté robocopy avec ses options les plus basiques (le dossier source et le dossier de destination), il a automatiquement utilisé certaines options. Comprendre le comportement par défaut est important.

Référez-vous aux options que vous voyez dans la sortie avec les explications des options ci-dessus et vous comprendrez exactement ce que robocopy fait en interne.

Default robocopy options

Comprendre ce que les commandes Robocopy peuvent faire

Si vous avez utilisé la commande copy ou les cmdlets Copy-Item de PowerShell, vous avez probablement spécifié une source et une destination et vous avez continué votre journée. Il n’y a pas beaucoup d’options que vous pouvez configurer là-bas. Ces commandes robocopy ont un comportement par défaut.

Mais robocopy, en revanche, comprend beaucoup plus et vous offre la possibilité de personnaliser le comportement autant que vous le souhaitez.

Il est important de savoir que robocopy ne se limite pas uniquement au concept de fichier ou de répertoire. Il prend en charge bien plus que cela et prend en charge pratiquement tout.

A file sitting on a filesystem isn’t just a dumb object with a single purpose. There are many different attributes and things that go with the concept of a file. For example, a file has attributes such as:

  • a timestamp (written, modified and accessed)
  • ACL NTFS
  • un propriétaire
  • informations d’audit NTFS
  • drapeau caché
  • drapeau archivé

Lorsque vous copiez ou déplacez un fichier, vous avez la possibilité de transférer toutes ces informations avec lui, si vous le souhaitez.

Comprenez que lorsque vous exécutez robocopy, vous ne copiez pas seulement un fichier, vous copiez également potentiellement toutes les autres informations avec lui. Il est important de le réaliser et de prendre cela en compte dans les options que vous fournissez à robocopy.

Les bases : réalisation de scénarios WhatIf

Si vous disposez d’un serveur de fichiers volumineux que vous souhaitez migrer et que vous ne souhaitez pas encore prendre de mesures, vous pouvez utiliser robocopy pour afficher ce qu’il aurait fait.

En utilisant l’option /L, vous pouvez indiquer à robocopy d’énumérer tous les fichiers et/ou dossiers que vous spécifiez et de renvoyer une liste des fichiers qu’il aurait copiés/déplacés.

Vous pouvez utiliser l’option /L avec n’importe quelle autre option. C’est un excellent moyen de renvoyer toutes les options que robocopy aurait utilisées (par défaut ou non). Cela vous donnera une vue d’ensemble de ce que robocopy fera en fonction des options que vous lui avez fournies.

Using /L

Les bases : copie de fichiers

L’utilisation la plus basique de robocopy consiste à spécifier un répertoire source et un répertoire de destination sans options.

> robocopy C:\src C:\dst

Cette option copiera tous les fichiers (à l’exclusion des sous-dossiers) de C:\src vers C:\dst.

Vous pouvez également copier tout, y compris les sous-dossiers (vides ou non) et les permissions NTFS. C’est, d’après ce que je peux voir, la méthode pour copier littéralement tout ce qui concerne un répertoire de fichiers vers un autre répertoire.

Ci-dessous, je copie tous les ACL NTFS, les propriétaires de fichiers, les sous-dossiers (y compris les vides) et tous les attributs de fichier. Tout cela est rendu possible grâce à l’option /E pour inclure tous les sous-dossiers vides et /COPYALL pour le reste.

> robocopy C:\src C:\dst /E /COPYALL

Les bases : déplacement de fichiers

Déplacer des fichiers transfère les fichiers d’un répertoire vers un autre, tout comme la copie. La seule différence avec une opération de déplacement est que les fichiers sources sont supprimés après la copie.

Pour supprimer les fichiers/répertoires de la source après la copie, utilisez l’option /MOV. Cela supprimera tous les fichiers du répertoire spécifié (pas les sous-dossiers).

> robocopy C:\src C:\dst /MOV

Vous pouvez également utiliser /MOVE pour déplacer tous les fichiers et sous-dossiers.

> robocopy C:\src C:\dst /MOVE

Les bases : synchronisation de fichiers

Robocopy vous permet de synchroniser deux répertoires. Cela signifie soit s’assurer que tous les fichiers du répertoire de destination sont présents dans le répertoire source et pas plus. /MIR répliquera les données en copiant tous les fichiers du répertoire source qui ne se trouvent pas dans le répertoire de destinationet supprimera les fichiers du répertoire de destination qui ne se trouvent pas dans le répertoire source. Attention !

> robocopy C:\src C:\dst /MIR

Copier des fichiers sur un réseau

Si vous copiez des fichiers via un réseau, il existe quelques options que vous devriez prendre en compte.

Robocopy vous permet de copier des fichiers en mode « redémarrable » en utilisant l’option /Z. Cela signifie que si une copie de fichier commence et échoue en cours de route, la copie peut recommencer au lieu de ne pas aboutir du tout. L’option /Z est utile lorsque le flux est interrompu sur un réseau.

Avertissement : Certains ont signalé que l’utilisation de /Z réduit les performances de 1/4. Faites-moi part de vos conclusions.

Vous pouvez également utiliser l’option /FFT. Cette commande est connue pour préserver plus précisément les horodatages des fichiers lors d’un transfert sur un réseau. Cette option utilise les horodatages du système de fichiers FAT au lieu de NTFS.

robocopy C:\src \\SRV1\share /Z /FFT

Utilisation de /IPG pour contrôler l’écart inter-paquets

Lors de la copie de fichiers sur un réseau, vous pouvez utiliser l’option /IPG. C’est également connu sous le nom d’option de l’écart inter-paquets. Cette option définit (en millisecondes) la fréquence à laquelle robocopy attendra entre l’envoi de nouveaux paquets.

Toujours utiliser des chemins UNC plutôt que des lettres de lecteur

A reader on Reddit discovered the hard way to not use mapped drives as a destination directory. Instead, always use always use a UNC path. You might run into issues with the 256-character limit if you do. Check out this Microsoft doc for more information.

Mode de sauvegarde Robocopy (Robocopy /Z)

Robocopy dispose d’une option (/B) ou d’un mode de sauvegarde en mode redémarrable (/ZB) qui copie les fichiers en mode de sauvegarde. Qu’est-ce que le « mode de sauvegarde » de toute façon ?

Lorsque vous copiez normalement un fichier sous Windows et que vous rencontrez un fichier qui nécessite des privilèges administratifs pour y accéder, vous recevez une erreur indiquant que vous n’avez pas la permission. Même si vous exécutez en tant qu’administrateur local, Windows ne vous permettra pas d’y accéder.

AVERTISSEMENT : Des rapports ont signalé des volumes de serveur corrompus lors de la copie de données vers un serveur Windows Server 2016 avec la déduplication activée. Lorsque vous utilisez l’option /ZB, le résultat est un magasin de fragments dédupliqués endommagé dans le dossier System Volume Information. Les fichiers copiés ne seront pas lisibles et généreront des erreurs lors de leur manipulation. Lien vers Serverfault avec plus d’informations.

Le mode de sauvegarde est une façon d’accéder aux fichiers sans se soucier des autorisations.

Robocopy utilise le mode de sauvegarde pour utiliser le privilège SeBackupPrivilege pour lire les fichiers et le droit d’utilisateur SeRestorePrivilege pour accéder aux fichiers nécessaires. Cela ignore toutes les ACEs qui empêcheraient normalement d’accéder à ces fichiers.

Les droits d’utilisateur SeBackupPrivilege et SeRestorePrivilege sont normalement attribués aux utilisateurs des groupes Opérateurs de sauvegarde et Administrateurs, mais parfois ils peuvent être supprimés. Le module de sauvegarde élimine ce risque et accorde temporairement à l’utilisateur exécutant robocopy ces droits.

Si vous souhaitez vérifier si votre compte utilisateur dispose de ces droits, vous pouvez exécuter la commande whoami /priv et les deux droits devraient s’afficher.

Filtrer les fichiers et les dossiers

La grande majorité des options disponibles vous permettent d’exclure des fichiers et des répertoires de différentes manières. J’ai répertorié toutes les façons dont vous pouvez filtrer ou exclure des fichiers et des répertoires en fonction de différents critères.

Par nom de fichier ou extension de fichier

La filtration des fichiers à copier/déplacer dans un appel robocopy se fait à l’aide de caractères génériques. Vous pouvez utiliser un caractère générique pour filtrer les fichiers correspondant à une chaîne de caractères ou une extension de fichier spécifique.

Par exemple, pour copier uniquement les fichiers TXT, vous pouvez spécifier *.txt.

> robocopy C:\src C:\dst *.txt

Si vous souhaitez limiter aux seuls fichiers commençant par a, vous pouvez utiliser a*.

> robocopy C:\src C:\dst a*

Vous pouvez également fournir plusieurs ensembles de correspondances de noms de fichiers en les séparant par un espace, comme indiqué ci-dessous.

> robocopy C:\src C:\dst a* b*

Lorsque vous filtrez par nom de fichier, robocopy vous affiche le filtre dans la sortie.

FIltering files output

Par nom de répertoire

Robocopy vous permet de filtrer les éléments non seulement par fichier mais aussi par nom de répertoire. En utilisant la commande robocopy /xd, vous pouvez exclure certains répertoires correspondant à un nom spécifique.

Lors de la copie de plusieurs dossiers, utilisez l’option /XD pour exclure des dossiers de l’exécution.

> robocopy C:\src C:\dst /XD "c:\src\exclude"

Par horodatage de fichier/répertoire

Vous trouverez ci-dessous toutes les options robocopy qui excluront les fichiers et les dossiers en fonction de divers attributs d’horodatage.

Switch Explanation
/DCOPY:T Copy directory timestamps
/MAXAGE:n Exclude files older than n days/date
/MINAGE:n Exclude files newer than n days/date
/XO If destination file exists and is the same date or newer than the source, don’t overwrite
/XN If destination file exists and is the same date or older than the source, don’t overwrite

Il existe deux options populaires à choisir lors du filtrage des horodatages ; /XO et /MAXAGE.

/XO vous permet d’exclure les fichiers de la copie uniquement s’ils sont plus récents que la source. En utilisant l’option /XO, vous pouvez robocopy uniquement les nouveaux fichiers par date d’accès.

> robocopy C:\src C:\dsc /XO

Si vous connaissez l’âge maximum des fichiers, vous pouvez également utiliser l’option /MAXAGE. Cela vous permet de spécifier au format AAAAMMJJ la date la plus ancienne qu’un fichier peut avoir avant d’être copié.

> robocopy c:\src c:\dst /S /MAXAGE:20191001

Robocopy Jobs

Vous avez vu que des dizaines d’options sont disponibles. Il est facile que ces options deviennent rapidement ingérables. Heureusement, vous avez une meilleure option que de mémoriser et de vérifier toutes ces options à chaque fois.

Les fichiers de tâche Robocopy sont des fichiers texte contenant une option par ligne. Vous utiliserez généralement robocopy pour créer ces fichiers de tâche. Une fois créés, vous pouvez ensuite les modifier soit avec robocopy, soit avec un éditeur de texte simple.

Vous avez diverses commandes robocopy qui fonctionnent avec les tâches.

Switch Explanation Default Behavior Equivalent Switch Notes
/JOB:jobname Take parameters from the named job file
/SAVE:jobname Save parameters to the named job file
/QUIT Quit after processing command line Useful for viewing parameters
/NOSD No source directory is specified
/NODD No destination directory is specified
/IF Include the following files

A typical job file created with robocopy has an RCJ extension and looks like the below snippet. This job file was created by running robocopy C:\src D:\dst /save:myjob. You can see that you can provide comments in the job file using :: which is most of what this file has.

Sans commentaires, le fichier ne contiendrait qu’une option par ligne.

::
:: Robocopy Job C:\MYJOB.RCJ
::
:: Created by Administrator on Sunday, August 18, XXXX at 8:53:24 AM
::

::
:: Source Directory :
::
        /SD:C:\SRC\     :: Source Directory.

::
:: Destination Directory :
::
        /DD:C:\SRC\     :: Destination Directory.

::
:: Include These Files :
::
        /IF             :: Include Files matching these names
::              *.*     :: Include all names (currently - Command Line may override)

::
:: Exclude These Directories :
::
        /XD             :: eXclude Directories matching these names
::                      :: eXclude no names (currently - Command Line may override)

::
:: Exclude These Files :
::
        /XF             :: eXclude Files matching these names
::                      :: eXclude no names (currently - Command Line may override)
::
:: Copy options :
::
        /DCOPY:DA       :: what to COPY for directories (default is /DCOPY:DA).
        /COPY:DAT       :: what to COPY for files (default is /COPY:DAT).
::
:: Retry Options :
::
        /R:1000000      :: number of Retries on failed copies: default 1 million.
        /W:30           :: Wait time between retries: default is 30 seconds.
::
:: Logging Options :
::

Enregistrement des fichiers de tâche

L’enregistrement d’un fichier de tâche est aussi simple que d’ajouter l’option /SAVE:<nom_de_la_tâche> à la fin de votre syntaxe. Remplacez <nom_de_la_tâche> par le nom de la tâche. L’option /SAVE créera un fichier appelé <nom_de_la_tâche>.rcj dans le répertoire où vous avez exécuté robocopy.

> robocopy C:\src C:\dst /SAVE:myjob

Vous devez spécifier /SAVE comme dernière option. Toute option spécifiée après /SAVE ne sera pas ajoutée au fichier de tâche. Notez également que même si un fichier de tâche existant existe déjà, robocopy l’écrasera toujours. Sauvegardez ou versionnez vos fichiers de tâche !

Note : Si vous essayez d’utiliser l’option /MT lors de l’enregistrement dans un fichier de tâche, elle ne sera pas incluse dans le fichier de tâche. Faites-moi savoir si vous avez réussi à l’inclure.

Utilisation des fichiers de tâches

Une fois qu’une tâche est enregistrée dans un fichier de tâche, vous pouvez ensuite utiliser l’option /JOB:<nom de la tâche> pour spécifier le fichier de tâche à lire. Robocopy lit tous les paramètres à l’intérieur du fichier de tâche. Il s’exécute alors comme si vous aviez fourni les options directement en ligne de commande.

> robocopy /JOB:myjob

Création d’un fichier de tâche sans exécuter une tâche en utilisant /QUIT

Le but de l’option /QUIT n’est pas évident. À première vue, vous pourriez penser que /QUIT force l’arrêt d’une tâche en cours. Au lieu de cela, /QUIT agit davantage comme une option pour empêcher l’exécution d’une tâche en premier lieu.

Officiellement, l’option /QUIT « force robocopy à terminer le traitement de la ligne de commande ». Cependant, il serait mieux expliqué comme la création d’un fichier de tâche sans exécuter de tâche.

Si vous utilisez l’option /SAVE, cela exécutera également automatiquement la tâche. Il n’y a aucun moyen de créer un fichier de tâche sans exécuter d’abord la tâche. Vous pouvez créer le fichier de tâche RCJ avec un éditeur de texte ou vous pouvez utiliser robocopy en ajoutant /QUIT à la fin.

> robocopy C:\src C:\dst /SAVE:myjob /QUIT

Modification d’un fichier de tâche

Étant donné que les fichiers de tâches sont simplement des fichiers texte, vous pouvez les modifier avec votre éditeur de texte préféré ou vous pouvez demander à robocopy de le faire pour vous.

Vous pouvez modifier les fichiers de tâches en utilisant une combinaison des options /JOB, /SAVE et /QUIT.

Par exemple, peut-être souhaitez-vous exclure tous les fichiers EXE de votre tâche robocopy enregistrée dans un fichier de tâche appelé backupfiles.rcj. Vous avez déjà créé le fichier de tâche et ne voulez pas écraser le fichier entier. Vous pouvez ajouter la nouvelle option comme suit:

> robocopy /JOB:backupfiles /XF *.EXE /SAVE:backupfiles /QUIT

Utilisation de plusieurs fichiers de travail

Vous pouvez même combiner l’utilisation de plusieurs fichiers de travail. Lorsque vous spécifiez plusieurs fichiers de travail lors de la même exécution, toutes les options utilisées dans cette exécution seront combinées ensemble.

Par exemple, peut-être avez-vous une longue liste de fichiers à exclure de votre tâche de copie de sauvegarde backupfiles. Ouvrez un éditeur de texte et ajoutez ce qui suit pour créer un fichier exclude.rcj.

/XF
    a.exe
    b.txt
    c.cer

Vous pouvez ensuite exclure ces fichiers de la tâche backupfiles comme ceci:

> robocopy /JOB:backupfiles /JOB:exclude

Puisque le fichier de tâche backupfiles d’origine excluait déjà tous les fichiers EXE, la syntaxe de l’exécution ci-dessus serait /XF *.exe a.exe b.txt c.cer. Robocopy combine toutes les options en une seule.

Modèles Robocopy et utilisation des options /NOSD et /NODD

Si vous travaillez avec de nombreux fichiers de travail, vous pouvez créer des fichiers de travail pour accepter des paramètres. Robocopy vous permet de transmettre des valeurs depuis la ligne de commande vers les tâches lorsqu’elles sont exécutées. Un paramètre n’est pas un terme robocopy, mais il s’adapte bien à ce scénario.

Vous pouvez créer des tâches robocopy pour accepter des paramètres en ne spécifiant pas de répertoire source ou de destination, soit en utilisant explicitement les options /NOSD et /NODD, soit en n’incluant tout simplement aucun répertoire source et destination.

Pour un exemple simple, créez un fichier de travail sans répertoire source ou destination en utilisant la syntaxe ci-dessous. L’intention de cette tâche est de copier tous les fichiers TXT et EXE d’une source vers un répertoire de destination.

> robocopy *.txt *.exe /SAVE:backupfiles /QUIT

À lui seul, ce fichier de travail ne fonctionnera jamais car aucun répertoire source ou destination n’est spécifié.

Lorsque vous créez un travail sans répertoire source et destination, le fichier de travail est automatiquement créé en utilisant les options /NOSD et /NODD.

/NOSD           
/NODD
/IF
    *.txt
    *.exe
/DCOPY:DA
/COPY:DAT
/R:1000000
/W:30

L’option /NOSD indique à robocopy que vous n’avez pas inclus de répertoire source tandis que /NODD indique que vous n’avez pas inclus de répertoire de destination. Ce fichier de travail est un « modèle » pour d’autres travaux.

Mais vous pouvez passer des « paramètres » à ce fichier de travail pour fournir les répertoires source et destination.

Pour utiliser le fichier de travail que vous venez de créer pour copier des fichiers de C:\src à C:\dst, vous pouvez passer ces répertoires directement en ligne de commande, qui seront ensuite transmis au travail.

> robocopy /JOB:backupfiles C:\src C:\dst

Copie asynchrone (Robocopy /MT)

Par défaut, robocopy ne traite qu’un fichier à la fois. Cependant, vous pouvez forcer robocopy à copier plusieurs fichiers à la fois en utilisant l’option /MT.

L’option /MT vous permet de spécifier le nombre de threads que robocopy utilisera pour copier les fichiers. Le maximum est de 128.

Vous pouvez utiliser /MT comme ceci:

> robocopy C:\src C:\dst /MT:32

I’ve chosen 32 in this case as a baseline. I suggest starting at 32 to see how your computer and network handle things and adjust the threads accordingly.

Notez que si vous utilisez /MT, vous ne pourrez pas utiliser /IPG ou /EFSRAW. Pour de meilleures performances, n’affichez pas le journal sur la console. Utilisez plutôt /LOG.

Planification de Robocopy

Robocopy offre plusieurs façons de planifier son exécution.

En utilisant /RH

En utilisant l’option /RH, vous pouvez indiquer à robocopy de s’exécuter uniquement pendant une période spécifique. C’est idéal si vous disposez d’une fenêtre de maintenance ou d’un moment où tout le monde est parti pour la journée.

Vous pouvez spécifier une heure de début et une heure de fin au format HHMM-HHMM. Par exemple, pour exécuter robocopy mais lui permettre de s’exécuter uniquement entre 17h et 9h, tel que défini par l’horloge système, exécutez :

> robocopy C:\src C:\dst /RH:1700-0900

Vous verrez que si vous appelez robocopy en dehors de ces heures, il vous indiquera l’heure actuelle et attendra l’heure de début pour s’exécuter.

Robocopy tells you what time it will start if scheduled

Vous devez vous assurer que les deux heures sont au format 24 heures et comportent exactement quatre chiffres. La fenêtre doit être supérieure à deux minutes.

Par défaut, en utilisant /RH, robocopy vérifiera l’heure de début avant l’exécution complète. Cependant, si vous avez beaucoup de fichiers et que vous pensez que le processus pourrait durer plus longtemps, vous pouvez utiliser l’option /PF. /PF forcera robocopy à vérifier la fenêtre avant chaque fichier.

Utilisation du planificateur de tâches

Le journal de sortie

Robocopy renverra toujours un journal de sortie. Que ce journal soit affiché via stdout sur la console et/ou redirigé vers un fichier journal vous appartient.

Vous avez de nombreuses options pour afficher la sortie de robocopy.

Switch Explanation Default Behavior Equivalent Switch Notes
/NP No progress. Suppresses the display of progress information. This can be useful when output is redirected to a file.
/unicode Display the status output as unicode text
/LOG:file Output status to log file and overwrite
/UNILOG:file Output status to unicode log file and overwrite
/LOG+:file Output status to log file and append to existing log file
/UNILOG+:file Output status to unicode log file and append to existing log file
/TS Displays the file timestamps for every file processed.
/FP Replaces simple file names with full file pathnames in the output.
/NS Does not show file sizes.
/NC Hides output the file class “Text Tags” (Go here for more information: https://www.uvm.edu/~gcd/2015/04/robocopy-file-classes/)
/NFL Hides file names. Failures are still logged though. Any files files deleted or would be deleted if /L was omitted are always logged
/NDL Hides output of the directory listing. Full file pathnames are output to more easily track down problematic files.
/TEE Output to console window, as well as the log file
/NJH No job header
/NJS No job summary
/BYTES Print sizes as bytes
/X Report all files, not just those selected & copied
/V Produce verbose output log, showing skipped files
/ETA Show estimated time of arrival of copied files. See the start time of each file copy and the estimated time of completion based on the observed throughput of previous copies. Times are displayed after the file name in the format HH:MM – > HH:MM (start – > finish).
/DEBUG Show debug volume information

Limitez les éléments du journal avec les options /NJS et /NJH

Par défaut, robocopy renvoie deux éléments dans sa sortie, un en-tête de tâche et un résumé de tâche.

L’en-tête de tâche est l’en-tête ROBOCOPY simple en haut.

Robocopy job header

Le résumé de l’emploi affiche l’état récapitulatif de tous les fichiers/dossiers, la quantité de données transférées et l’heure de fin de l’exécution.

Robocopy job summary

Vous pouvez masquer chacun de ces éléments en utilisant l’option /NJH pour masquer l’en-tête de l’emploi et l’option /NJS pour masquer le résumé de l’emploi. Vous pouvez inclure l’une ou l’autre de ces options ou les deux ensemble.

Hiding the job header and job summary

Redirection du journal de sortie vers un fichier

Si vous devez enregistrer le journal de sortie, vous pouvez le rediriger vers un fichier texte et/ou l’afficher sur la console. Vous pouvez le faire en utilisant les redirigeurs de sortie traditionnels tels que >, >>, PowerShell ou l’option /LOG.

Pour rediriger le journal de sortie vers un fichier en écrasant tout fichier journal existant, utilisez la syntaxe /LOG:<chemin du fichier> comme indiqué ci-dessous. La seule sortie que vous recevrez sur la console est le chemin vers le fichier journal.

> robocopy C:\src C:\dst /LOG:c:\file.log

 Log File : c:\file.log

Si vous souhaitez conserver le contenu d’un fichier journal existant et ajouter les résultats à un fichier, vous pouvez utiliser l’opérateur + comme indiqué ci-dessous.

> robocopy C:\src C:\dst /LOG+:c:\file.log

 Log File : c:\file.log

Redirection du journal de sortie vers un fichier et affichage sur la console

Si vous souhaitez enregistrer le journal de sortie dans un fichier tout en le visualisant sur la console, vous pouvez utiliser l’option /TEE. Cette option permet à robocopy d’écrire la sortie dans le fichier journal tout en conservant le comportement par défaut de renvoyer la sortie à la console.

robocopy C:\src C:\dst /LOG+:c:\file.log /TEE

Codes de sortie

Comme tous les autres utilitaires en ligne de commande, robocopy renvoie des codes de sortie en fonction des résultats de l’exécution. Nous espérons tous que robocopy se terminera toujours avec succès avec un code 0, mais cela n’arrive pas toujours.

Ci-dessous, vous trouverez tous les codes de sortie que renvoie robocopy et leur explication. Tout code de sortie supérieur à sept indique au moins une défaillance lors de l’exécution.

Exit Code Explanation
0 No action performed. Source and destination are synchronized.
1 At least one file was copied successfully.
2 Extra files or directories were detected. Examine log.
3 Exit codes 2 and 1 combined.
4 Mismatched files or directories found. Examine log.
5 Exit codes 4 and 1 combined.
6 Exit codes 4 and 2 combined.
7 Exit codes 4, 1 and 2 combined.
8 At least one file or directory could not be copied. Retry limit exceeeded. Examine log.
16 Copy failed catastrophically.

Notez que si vous exécutez robocopy dans un utilitaire tiers, cet utilitaire peut considérer tout code de sortie différent de zéro comme une défaillance. Pour éviter cela, vous pouvez modifier le code de sortie en 0 s’il renvoie 1.

Le code de sortie « extra » de Robocopy est un code de retour courant qui signifie qu’un fichier « extra » se trouve dans le dossier de destination mais pas dans le dossier source. Ce code exclut les fichiers supplémentaires qui empêcheront toute suppression depuis la destination.

Modification du code de sortie dans un fichier batch

Si vous exécutez robocopy avec un fichier batch, vous pouvez trouver la valeur de la variable %ERRORLEVEL%. S’il renvoie 1, utilisez le mot-clé exit pour quitter le script avec 0.

> (robocopy <options>) ^& IF %ERRORLEVEL% LEQ 1 exit 0

Modification du code de sortie dans un script PowerShell

Si vous exécutez robocopy dans un script PowerShell, vous pouvez invoquer robocopy avec Start-Process en utilisant PassThru pour renvoyer le processus créé et Wait pour attendre que robocopy se termine. Vous pouvez ensuite vérifier la propriété ExitCode pour une valeur de 1. Si le code de sortie est 1, quittez le script PowerShell avec 0 en utilisant $host.SetShouldExit().

$exitCode = (Start-Process -FilePath 'robocopy' -ArgumentList '<option>' -PassThru -Wait).ExitCode
if ($exitCode -eq 1) {
    $host.SetShouldExit(0)
}

Erreurs courantes

Si vous traitez des milliers de fichiers, vous êtes susceptible de rencontrer certains problèmes. Voici un aperçu des erreurs courantes que j’ai rencontrées

Erreur Paramètre invalide

Lorsque vous voyez une erreur indiquant erreur paramètre invalide, cela signifie généralement que vous avez essayé de passer des options à robocopy de manière incorrecte. L’erreur robocopy paramètre invalide 3 est la plus courante, semble-t-il.

A common reason you’d receive this error is when you specify a source or destination directory with spaces and forget to surround it with quotes.

Exemples de robocopy

Vous pouvez créer vos propres chaînes de robocopy ou utiliser ce que d’autres ont appris ! Dans cette section, je vais couvrir des cas d’utilisation sur la façon d’utiliser robocopy pour accomplir différentes choses.

Trouver la taille d’un dossier sur un réseau

Contributeur : northendtroooper (Reddit)

> robocopy "\\MACHINE\fileshare" c:\dummy /l /xj /e /nfl /ndl /njh /r:0 /mt:64

Supprimer rapidement le contenu d’un dossier (en ignorant les autorisations des sous-dossiers)

Contributeur : pizzasteveo (Reddit)

> robocopy c:\dummy c:\foldertodelete /MIR

Réaliser des migrations de fichiers volumineux

Contributeur : @MySnozzberries (Twitter)

L’objectif de cet extrait de code est de forcer la propriété de tous les fichiers à revenir aux Administrateurs. Nous ajoutons ensuite un ACE explicite pour le groupe Administrateurs avec un contrôle total sur chaque objet de manière récursive, même si nous configurons également l’héritage.

Enfin, nous effectuons une copie complète de robocopy avec les DACL vers la destination avec un journal. Le journal peut ensuite être examiné pour d’autres problèmes de permissions ou simplement des verrous de fichiers, et une autre synchronisation delta peut être effectuée ultérieurement.

> takeown /F .\test /R /A /D Y
> icacls .\test /grant "Administrators":(OI)(CI)F /T
> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

Récursivement, forcer le groupe Administrateurs comme propriétaire de tous les fichiers et répertoires. Il peut y avoir des moyens de contourner cela, mais c’est l’approche la plus radicale et généralement la plus rapide.

> takeown /F .\test /R /A /D Y

Une fois que nous sommes propriétaires, nous pouvons maintenant forcer une nouvelle ACE dans le DACL pour chaque objet. Cela accorde aux Administrateurs un contrôle total avec l’héritage activé et de manière récursive dans le chemin.

En définissant cela à la racine avec l’héritage, nous couvrons l’environnement, mais lorsque un partage a CRÉATEUR PROPRIÉTAIRE avec Contrôle total (ce qui est malheureusement même la recommandation de Microsoft pour des choses comme les profils d’utilisateurs de fichiers), l’utilisateur peut désactiver l’héritage ou supprimer les ACE à sa discrétion. Donc une approche radicale est généralement la solution la plus rapide.

> icacls .\test /grant "Administrators":(OI)(CI)F /T

Une fois que nous avons modifié les DACLs sur la majorité des fichiers, nous essayons de copier les fichiers vers un nouvel emplacement, une pratique courante pour les migrations de partage de fichiers. Pour cela, nous copions les éléments de manière récursive et utilisons l’option /SEC pour également copier les Données/Attributs/ Horodatages/ DACLs.

Ensuite, nous enregistrons l’opération avec les chemins complets et pour tous les objets (option de verbeux /V) dans un journal, afin de pouvoir remédier aux <5% d’erreurs qui sont généralement liées à la longueur du chemin ou au verrouillage des fichiers et d’obtenir plus de granularité.

> robocopy .\test .\test2 /E /SEC /FP /V /LOG:.\temp.log

C’est un cadre simple pour gérer une migration de partage de fichiers avec un impact minimal sur l’expérience utilisateur. Cela améliore également le contrôle que l’informatique exerce sur les données. Si un client dispose d’une pratique solide de gouvernance des données où la propriété est correctement gérée au niveau des sous-dossiers, cela devient une discussion plus compliquée, mais la plupart des clients que nous rencontrons ont la chance d’utiliser uniquement l’héritage et les ACE basés sur les groupes, c’est donc la situation la plus courante et le point de départ de la résolution.

Alternatives à Robocopy

Robocopy est un outil génial, mais il existe de nombreux autres outils similaires qui pourraient vous intéresser.

  • xxcopy – Une utilitaire en ligne de commande similaire avec une tonne d’options.
  • Copy-Item PowerShell cmdlet – Moins complet mais beaucoup plus simple.
  • TreeSize – Utilitaire avec interface graphique et possibilité de script pour trouver des informations sur les dossiers.

Résumé

Robocopy est un excellent outil pour copier de grands ensembles de fichiers. Que vous effectuiez une migration de données, que vous gardiez des dossiers synchronisés ou que vous ayez simplement besoin d’un moyen rapide de copier des fichiers avec précision, robocopy est un excellent choix.

Source:
https://adamtheautomator.com/robocopy/