Comandi Robocopy: Migrazione dei Dati, Sincronizzazione delle Cartelle e Altro Ancora

Robocopy è uno dei più utilizzati strumenti a riga di comando per copiare grandi volumi di dati in Windows. È uno strumento così popolare perché è molto potente. Ma con tutta questa potenza arriva anche la complessità. In questa guida, analizzeremo tutta questa complessità e forniremo un tutorial completo sull’utilizzo di questo utile strumento.

Robocopy è un’utilità a riga di comando di Windows disponibile fin da Windows NT. È un sostituto dell’utility xcopy meno versatile. Consente di specificare un percorso di unità o di server per copiare/spostare file da un prompt dei comandi.

La versione di Robocopy al momento della stesura di questo testo è la 10.0.18. Su questa versione ho effettuato i miei test.

Robocopy offre una serie di funzionalità che puoi sfruttare per eseguire copie e spostamenti di file efficienti e veloci. Può:

  • Copiare file su una rete con funzionalità di ripresa
  • Può saltare i punti di giunzione NTFS che causano solitamente errori a causa di loop infiniti
  • Copiare attributi di file e directory preservando i timestamp
  • Copiare autorizzazioni NTFS, proprietari e informazioni di auditing
  • Copiare i timestamp delle directory
  • Copiare file in modalità “backup” per assicurarsi che i file vengano copiati anche se l’amministratore ha negato i diritti
  • Riprovare automaticamente
  • Sincronizzare due cartelle
  • È abbastanza intelligente da saltare i file già copiati
  • Può copiare percorsi più lunghi del limite di 256 caratteri
  • Eseguire copie asincrone utilizzando la sua capacità di multithreading
  • Restituisce codici di uscita standardizzati per l’uso in script

Come puoi vedere, c’è molto da copiare. Volevo coprire tutto ciò che c’è da sapere su questo pratico strumento.

Riferimento alla sintassi comune di Robocopy

Perché un così lungo post su un singolo utilità? Basta dare un’occhiata alle tabelle qui sotto. Hai molte opzioni per copiare o spostare file con robocopy! Troverai ulteriori opzioni nelle sezioni individuali.

Queste tabelle sono state create dalla sintassi di aiuto restituita da robocopy /?. Sono state suddivise in sezioni più significative, aggiunte nel tempo e ripulite per fornire informazioni più utili.

Opzioni di origine

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

Opzioni di destinazione

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

Opzioni di copia

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

Opzioni di monitoraggio

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

Comprensione del comportamento di 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 copia solo intere directory

Ogni esecuzione di robocopy avrà una directory di origine e una directory di destinazione. Robocopy copia e sposta i file per intere directory. Non è possibile copiare esplicitamente un singolo file con robocopy. Usa copy o Copy-Item di PowerShell per questo.

Tuttavia, puoi robocopiare un singolo file con il giusto filtraggio che imparerai di seguito. Per robocopiare un singolo file, specifica la directory di origine e di destinazione seguite immediatamente dal nome del file nella directory di origine.

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

La sintassi dipende dall’ambiente

Inoltre, le opzioni che fornisci a robocopy dipenderanno dall’ambiente. Dovrai rispondere a qualche domanda quando cercherai di capire quali opzioni utilizzare.

  • Sarai sempre in grado di copiare in una directory vuota?
  • È possibile che i file esistano già nella directory di destinazione?
  • Stai copiando terabyte di dati o solo pochi megabyte?
  • Stai copiando file tramite rete o localmente?
  • …e altro ancora.

Se non ci sono file nella directory di destinazione, non è necessario preoccuparsi delle opzioni che sovrascrivono i file. Se non stai copiando file tramite rete, non preoccuparti di quelle opzioni. Definisci esplicitamente la tua situazione attuale e potenziali circostanze future in cui si troverà il tuo ambiente.

Riconosci le opzioni predefinite

Robocopy utilizza molte opzioni di default. Puoi identificarle guardando le tabelle sopra. Fornisce anche un utile output ogni volta che esegui l’utilità.

Puoi vedere qui sotto che quando ho eseguito robocopy con le sue opzioni più elementari (la cartella di origine e la cartella di destinazione), ha utilizzato automaticamente alcune opzioni. Comprendere il comportamento predefinito è importante.

Fai riferimento alle opzioni che vedi nell’output con le spiegazioni delle opzioni sopra e capirai esattamente cosa fa robocopy sotto il cofano.

Default robocopy options

Comprendere cosa possono fare i comandi di robocopy

Se hai utilizzato il comando copy o il cmdlet Copy-Item di PowerShell, probabilmente hai specificato una sorgente e una destinazione e hai proseguito con la tua giornata. Non ci sono molte opzioni che puoi configurare lì. Questi comandi robocopy hanno un comportamento predefinito.

Ma robocopy, d’altra parte, comprende molto altro e ti offre la flessibilità di modificare il comportamento quanto desideri.

È importante sapere che robocopy non è solo consapevole del concetto di file o directory. C’è molto di più in un filesystem e robocopy supporta praticamente tutto.

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 proprietario
  • informazioni di auditing NTFS
  • flag nascosto
  • flag archiviato

Quando si copia o sposta un file, si ha la possibilità di portare con sé tutte queste informazioni, se si desidera.

È importante capire che quando si esegue robocopy, non si sta solo copiando un file, si sta anche potenzialmente copiando tutte le altre informazioni ad esso associate. È importante rendersene conto e tenerne conto nelle opzioni che si forniscono a robocopy.

Le basi: esecuzione di scenari WhatIf

Se si dispone di un enorme server di file da migrare e non si desidera ancora compiere alcuna azione, è possibile utilizzare robocopy per restituire ciò che avrebbe fatto.

Utilizzando l’opzione /L, è possibile indicare a robocopy di enumerare tutti i file e/o cartelle specificate e restituire un elenco dei file che avrebbe copiato/spostato.

È possibile utilizzare l’opzione /L con qualsiasi altra opzione. Questo è un ottimo modo per restituire tutte le opzioni che robocopy avrebbe utilizzato (predefinite o meno). Ti darà una visione generale di ciò che robocopy farà in base alle opzioni che hai fornito.

Using /L

Le basi: copiare file

L’uso più basilare di robocopy è utilizzare una directory di origine e una di destinazione senza opzioni.

> robocopy C:\src C:\dst

Questa opzione copierà tutti i file (escludendo le sottocartelle) da C:\src a C:\dst.

È possibile copiare anche tutto inclusi i sottocartelle (vuoti o meno) e le autorizzazioni NTFS. Questo è, da quello che posso capire, il metodo per copiare letteralmente tutto ciò che riguarda una directory di file in un’altra directory.

Di seguito sto copiando tutte le ACL NTFS, i proprietari dei file, le sottocartelle (inclusi quelli vuoti) e tutti gli attributi dei file. Tutto ciò è reso possibile con l’opzione /E per includere tutte le sottocartelle vuote e /COPYALL per il resto.

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

Le nozioni di base: spostamento dei file

Spostare i file trasferisce i file da una directory a un’altra proprio come la copia. L’unica differenza con un’operazione di spostamento è che i file di origine vengono rimossi dopo la copia.

Per eliminare file/cartelle dalla sorgente dopo la copia, utilizzare l’opzione /MOV. Ciò rimuoverà tutti i file nella directory specificata (senza sottocartelle).

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

È anche possibile utilizzare /MOVE per spostare tutti i file e le sottocartelle.

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

Le nozioni di base: sincronizzazione dei file

Robocopy consente di sincronizzare due directory. Ciò significa assicurarsi che tutti i file nella directory di destinazione siano nella directory di origine e non di più. /MIR replicherà i dati copiando tutti i file nella sorgente non presenti nella destinazione e eliminerà i file nella destinazione non presenti nella sorgente. Attenzione!

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

Copia dei file su una rete

Se si copiano file su una rete, ci sono alcune opzioni da considerare.

Robocopy consente di copiare file in “modalità di ripristino” utilizzando l’opzione /Z. Ciò significa che se un file inizia a copiare e si interrompe a metà, la copia può ripartire anziché fallire completamente. L’opzione /Z è utile quando la connessione viene interrotta su una rete.

Avviso: Alcuni hanno segnalato che l’utilizzo di /Z riduce le prestazioni del 25%. Fammi sapere i tuoi risultati.

Puoi anche utilizzare l’opzione /FFT. Questo interruttore è noto per preservare in modo più accurato i timestamp dei file durante il trasferimento su una rete. Questa opzione utilizza i timestamp del sistema di file FAT anziché NTFS.

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

Utilizzo di /IPG per controllare l’intervallo tra pacchetti

Quando si copiano file su una rete, è possibile utilizzare l’interruttore /IPG. Questo è anche noto come opzione di intervallo tra pacchetti. Questa opzione definisce (in millisecondi) la frequenza con cui robocopy attende tra l’invio di nuovi pacchetti.

Utilizzare sempre percorsi UNC anziché lettere di unità

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.

Modalità di backup di Robocopy (Robocopy /Z)

Robocopy ha un’opzione (/B) o come modalità di backup (/ZB) che copia i file in modalità di backup. Cosa si intende per “modalità di backup” comunque?

Di solito, quando si copia un file in Windows e si incontra un file che richiede privilegi amministrativi per l’accesso, si riceverà un errore che indica che non si dispone delle autorizzazioni. Anche se si sta eseguendo come amministratore locale, Windows non consente l’accesso.

ATTENZIONE: Sono stati segnalati casi di volumi del server corrotti durante la copia dei dati su un server Windows Server 2016 con la deduplicazione attivata. Quando si utilizza lo switch /ZB, il risultato sarà un archivio di chunk di deduplica danneggiato nella cartella System Volume Information. I file copiati non saranno leggibili e genereranno errori quando si cercherà di manipolarli. Link a Serverfault con ulteriori informazioni.

La modalità di backup è un modo per accedere ai file senza preoccuparsi delle autorizzazioni.

Robocopy utilizza la modalità di backup per utilizzare il privilegio SeBackupPrivilege per la lettura dei file e il diritto utente SeRestorePrivilege per accedere a qualsiasi file di cui ha bisogno. Ciò ignora qualsiasi ACE che normalmente impedirebbe l’accesso a tali file.

I diritti utente SeBackupPrivilege e SeRestorePrivilege vengono normalmente assegnati agli utenti nei gruppi Backup Operators e Amministratori, ma a volte possono essere rimossi. Il modulo di backup elimina tale rischio e concede temporaneamente all’utente che esegue robocopy questi diritti.

Se desideri verificare se il tuo account utente dispone di tale diritto, puoi eseguire il comando whoami /priv e entrambi i diritti dovrebbero essere visualizzati.

Filtraggio dei file e delle cartelle

La maggior parte delle opzioni disponibili ti consente di escludere file e directory in molti modi diversi. Ho suddiviso tutte le modalità di filtraggio o esclusione di file e directory in base a vari criteri.

Per nome file o per estensione file

La selezione dei file da copiare/spostare in una chiamata robocopy viene effettuata utilizzando i caratteri jolly. Puoi utilizzare un carattere jolly per filtrare i file che corrispondono a una specifica stringa di nome file o estensione.

Ad esempio, per copiare solo i file TXT, puoi specificare *.txt.

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

Se desideri limitare solo ai file che iniziano con la lettera a, puoi utilizzare a*.

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

Puoi anche fornire più insiemi di corrispondenze di nomi file separandoli con uno spazio come mostrato di seguito.

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

Quando filtrate per nome file, robocopy mostrerà il filtro nell’output.

FIltering files output

Per nome directory

Robocopy consente di filtrare gli elementi non solo per nome file, ma anche per nome directory. Utilizzando il comando robocopy /xd, puoi escludere determinate directory che corrispondono a un nome specifico.

Quando si copiano più cartelle, utilizza lo switch /XD per escludere le cartelle dall’esecuzione.

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

Per data/ora di file/directory

Di seguito troverai tutte le opzioni di robocopy che escluderanno file e cartelle in base a diversi attributi di data/ora.

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

Ci sono due opzioni popolari da scegliere quando si filtra per cose come la data/ora; /XO e /MAXAGE.

/XO ti consente di escludere i file dalla copia solo se sono più recenti rispetto alla sorgente. Utilizzando l’opzione /XO, puoi robocopy solo i file nuovi in base alla data di accesso.

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

Se conosci l’età massima dei file, puoi anche utilizzare l’opzione /MAXAGE. Questo ti consente di specificare nel formato YYYMMDD la data più vecchia che un file può avere prima di essere copiato.

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

Robocopy Jobs

Hai visto che sono disponibili decine di opzioni. È facile che queste opzioni diventino presto ingombranti. Fortunatamente, hai un’opzione migliore rispetto a memorizzare e assicurarti che tutte queste opzioni siano corrette ogni volta.

I file di lavoro di Robocopy sono file di testo che contengono una singola opzione per riga. Di solito utilizzerai robocopy per creare questi file di lavoro. Una volta creati, puoi quindi utilizzare robocopy per modificarli o un semplice editor di testo.

Hai a disposizione vari comandi robocopy che funzionano con i lavori.

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.

Senza commenti, il file conterrà solo un’opzione per riga.

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

Salvataggio dei file di lavoro

Salvare un file di lavoro è semplice come aggiungere l’opzione /SAVE:<nome_lavoro> alla fine della sintassi. Sostituisci <nome_lavoro> con il nome del lavoro. L’opzione /SAVE creerà un file chiamato <nome_lavoro>.rcj nella directory in cui hai eseguito robocopy.

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

Devi obbligatoriamente specificare /SAVE come ultima opzione. Eventuali opzioni specificate dopo /SAVE non verranno aggiunte al file di lavoro. Inoltre, nota che anche se esiste già un file di lavoro esistente, robocopy sovrascriverà sempre quello esistente. Effettua il backup o controlla la versione dei tuoi file di lavoro!

Nota: Se provi a utilizzare l’opzione /MT durante il salvataggio su un file di lavoro, questa non verrà inclusa nel file di lavoro. Fammi sapere se sei riuscito a farla includere.

Utilizzo dei file di lavoro

Una volta che un lavoro è stato salvato in un file di lavoro, è possibile utilizzare l’opzione /JOB:<nomelavoro> per specificare il file di lavoro da leggere. Robocopy legge tutti i parametri all’interno del file di lavoro e poi si esegue come se avessi fornito le opzioni direttamente dalla riga di comando.

> robocopy /JOB:myjob

Creazione di un file di lavoro senza eseguire un lavoro utilizzando /QUIT

Lo scopo dell’opzione /QUIT non è ovvio. A prima vista, potresti pensare che /QUIT forzi l’interruzione di un lavoro in esecuzione. In realtà, /QUIT agisce più come un’opzione per impedire l’esecuzione di un lavoro in primo luogo.

Ufficialmente, l’opzione /QUIT “forza robocopy a interrompere l’elaborazione della riga di comando”. Tuttavia, sarebbe meglio spiegare che crea un file di lavoro senza eseguire un lavoro.

Se utilizzi l’opzione /SAVE, eseguirà automaticamente anche il lavoro. Non c’è modo di creare un file di lavoro senza eseguire prima il lavoro. Potresti creare il file di lavoro RCJ con un editor di testo o potresti farlo utilizzando robocopy e aggiungendo /QUIT alla fine.

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

Modifica di un file di lavoro

Dato che i file di lavoro sono solo file di testo, puoi modificarli con il tuo editor di testo preferito o puoi farlo fare a robocopy.

Puoi modificare i file di lavoro utilizzando una combinazione di /JOB, /SAVE e /QUIT.

Ad esempio, forse desideri escludere tutti i file EXE dal tuo lavoro di robocopy salvato in un file di lavoro chiamato backupfiles.rcj. Hai già creato il file di lavoro e non vuoi sovrascriverlo completamente. Puoi aggiungere la nuova opzione come segue:

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

Utilizzo di file di lavoro multipli

Puoi anche combinare l’uso di file di lavoro. Quando si specificano più file di lavoro nella stessa esecuzione, tutte le opzioni utilizzate in quella esecuzione verranno combinate insieme.

Ad esempio, forse hai una lunga lista di file da escludere dalla copia del lavoro backupfiles. Apri un editor di testo e aggiungi quanto segue per creare un file exclude.rcj.

/XF
    a.exe
    b.txt
    c.cer

Puoi quindi escludere questi file dal lavoro backupfiles in questo modo:

> robocopy /JOB:backupfiles /JOB:exclude

Dato che il file di lavoro originale backupfiles stava già escludendo tutti i file EXE, la sintassi dell’esecuzione sopra sarebbe /XF *.exe a.exe b.txt c.cer. Robocopy combina tutte le opzioni in una sola.

Modelli di Robocopy e utilizzo delle opzioni /NOSD e /NODD

Se stai lavorando con molti file di lavoro, puoi creare file di lavoro per accettare parametri. Robocopy ti permette di passare valori dalla riga di comando ai lavori quando vengono eseguiti. Un parametro non è un termine di robocopy ma si adatta bene a questo scenario.

Puoi creare lavori robocopy per accettare parametri non specificando una directory di origine o di destinazione in modo esplicito utilizzando le opzioni /NOSD e /NODD o semplicemente non includendo affatto una directory di origine e destinazione.

Per un esempio semplice, crea un file di lavoro senza una directory di origine o destinazione utilizzando la sintassi di seguito. L’intenzione di questo lavoro è copiare tutti i file TXT ed EXE da una directory di origine a una directory di destinazione.

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

Da solo, questo lavoro non funzionerà mai perché non viene specificata una directory di origine o destinazione.

Quando si crea un lavoro senza directory di origine e di destinazione, il file di lavoro viene creato automaticamente utilizzando le opzioni /NOSD e /NODD.

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

L’opzione /NOSD indica a robocopy che non è stata inclusa una directory di origine, mentre /NODD indica che non è stata inclusa una directory di destinazione. Questo file di lavoro è un “modello” per altri lavori.

Tuttavia, è possibile passare “parametri” a questo file di lavoro per fornire le directory di origine e destinazione.

Per utilizzare il file di lavoro appena creato per copiare file da C:\src a C:\dst, è possibile passare queste directory direttamente sulla riga di comando, che verranno quindi passate al lavoro.

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

Copia asincrona (Robocopy /MT)

Per impostazione predefinita, robocopy elabora solo un file alla volta. Tuttavia, è possibile forzare robocopy a copiare più file contemporaneamente utilizzando l’opzione /MT.

L’opzione /MT consente di specificare il numero di thread che robocopy utilizzerà per copiare i file. Il massimo è 128.

Puoi utilizzare /MT in questo modo:

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

Nota che se utilizzi /MT, non sarà possibile utilizzare /IPG o /EFSRAW. Per una migliore prestazione, non visualizzare il log sulla console. Invece, utilizza /LOG.

Pianificazione di Robocopy

Robocopy offre alcuni modi per pianificare l’esecuzione del programma.

Utilizzando /RH

Utilizzando l’opzione /RH, puoi indicare a robocopy di eseguirsi solo durante un determinato intervallo di tempo. Questo è ottimo se hai una finestra di manutenzione o un momento in cui tutti sono andati a casa per il giorno.

Puoi specificare un’ora di inizio e un’ora di fine nel formato HHMM-HHMM. Ad esempio, per invocare robocopy ma consentirgli di eseguirsi solo tra le 17:00 e le 9:00 come definito dall’orologio di sistema, esegui:

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

Vedrai che se invochi robocopy al di fuori di quelle ore, ti indicherà l’ora corrente e aspetterà l’ora di inizio per eseguirsi.

Robocopy tells you what time it will start if scheduled

Devi assicurarti che entrambe le ore siano nel formato a 24 ore e siano esattamente di quattro cifre. La finestra temporale deve essere superiore a due minuti.

Per impostazione predefinita, utilizzando /RH, verrà verificata l’ora di inizio prima dell’intera esecuzione. Tuttavia, se hai molti file e pensi che il processo possa durare più a lungo, puoi utilizzare l’opzione /PF. /PF obbligherà robocopy a verificare la finestra di tempo prima di ogni file.

Utilizzo del Task Scheduler

Il Registro di Output

Robocopy restituirà sempre un registro di output. Se tale registro viene visualizzato tramite stdout sulla console e/o reindirizzato su un file di registro, dipende da te.

Hai molte opzioni quando si tratta di visualizzare l’output di 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

Limitare gli elementi di registro con /NJS e /NJH

Per impostazione predefinita, robocopy restituisce due elementi nel suo output, un’intestazione del lavoro e un riepilogo del lavoro.

L’intestazione del lavoro è la semplice intestazione ROBOCOPY in alto.

Robocopy job header

Il riepilogo del lavoro mostra lo stato di riepilogo di tutti i file/cartelle, la quantità di dati trasferiti e l’ora in cui è terminata l’esecuzione.

Robocopy job summary

Puoi nascondere ciascuno di questi elementi utilizzando l’opzione /NJH per nascondere l’intestazione del lavoro e l’opzione /NJS per nascondere il riepilogo del lavoro. Puoi includere una o entrambe queste opzioni insieme.

Hiding the job header and job summary

Reindirizzamento del registro di output su un file

Se hai bisogno di salvare il registro di output, puoi reindirizzarlo su un file di testo e/o visualizzarlo sulla console. Puoi farlo utilizzando tradizionali reindirizzatori di output come >, >>, PowerShell o l’opzione /LOG.

Per reindirizzare il registro di output su un file utilizzando l’opzione /LOG sovrascrivendo eventuali file di registro esistenti, utilizza la sintassi /LOG:<percorso_file> come mostrato di seguito. L’unico output che riceverai sulla console sarà il percorso del file di registro.

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

 Log File : c:\file.log

Se desideri mantenere i contenuti di un file di registro esistente e aggiungere i risultati a un file, puoi utilizzare l’operatore + come mostrato di seguito.

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

 Log File : c:\file.log

Reindirizzamento del registro di output su un file e visualizzazione sulla console

Se desideri salvare il registro di output su un file ma visualizzarlo anche sulla console, puoi utilizzare l’opzione /TEE. Questa opzione fa sì che robocopy scriva l’output sul file di registro pur mantenendo il comportamento predefinito di restituire l’output sulla console.

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

Codici di uscita

Come tutti gli altri utilità da riga di comando, robocopy restituisce codici di uscita a seconda dei risultati dell’esecuzione. Tutti speriamo che robocopy esca sempre con successo con un codice 0, ma ciò non accade sempre.

Di seguito troverai tutti i codici di uscita restituiti da robocopy e la loro spiegazione. Qualsiasi codice di uscita superiore a sette indica almeno un errore durante l’esecuzione.

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.

Da notare che se esegui robocopy in un’utilità di terze parti, quella utilità potrebbe considerare qualsiasi codice di uscita diverso da zero come un errore. Per evitare ciò, puoi modificare il codice di uscita in 0 se restituisce 1.

Il codice di uscita “extra” di Robocopy è un codice di ritorno comune che indica la presenza di un file “extra” nella cartella di destinazione ma non nella cartella di origine. Questo codice esclude gli “extra” che impediranno qualsiasi eliminazione nella destinazione.

Modifica del codice di uscita in un file batch

Se stai eseguendo robocopy con un file batch, puoi trovare il valore della variabile %ERRORLEVEL%. Se restituisce 1, utilizza la parola chiave exit per uscire dallo script con 0.

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

Modifica del codice di uscita in uno script PowerShell

Se stai eseguendo robocopy in uno script PowerShell, puoi invocare robocopy con Start-Process utilizzando PassThru per restituire il processo creato e Wait per attendere che robocopy finisca. Puoi quindi verificare la proprietà ExitCode per un valore di 1. Se il codice di uscita è 1, esci dallo script PowerShell con 0 utilizzando $host.SetShouldExit().

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

Errori comuni

Se stai gestendo migliaia di file, è probabile che incontri alcuni problemi. Ecco una panoramica degli errori comuni che ho riscontrato

Errore Parametro non valido

Quando si visualizza un errore che indica errore parametro non valido, significa che hai provato a passare opzioni a robocopy in modo errato. L’errore robocopy parametro non valido 3 è il più comune, sembra.

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.

Esempi di Robocopy

Puoi creare le tue stringhe di robocopy oppure puoi prendere ciò che gli altri hanno imparato e usarle! In questa sezione, coprirò casi d’uso su come utilizzare robocopy per realizzare varie cose.

Trovare la dimensione di una cartella di rete

Contributore: northendtroooper (Reddit)

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

Eliminare rapidamente i contenuti di una cartella (ignorando le autorizzazioni nelle sottocartelle)

Contributore: pizzasteveo (Reddit)

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

Eseguire migrazioni di file di grandi dimensioni

Contributore: @MySnozzberries (Twitter)

Lo scopo di questo frammento è quello di forzare la proprietà di tutti i file agli amministratori. Aggiungiamo quindi un ACE esplicito per il gruppo Amministratori per il controllo completo su ogni oggetto in modo ricorsivo, anche se stiamo impostando anche l’ereditarietà.

Infine, eseguiamo una copia completa di robocopy con DACL (Directory Access Control List) sulla destinazione con log. Il log può quindi essere esaminato per ulteriori problemi di autorizzazioni o semplicemente per controllare i blocchi dei file e successivamente può essere eseguita una sincronizzazione delta aggiuntiva.

> 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

Ricorsivamente, forza il gruppo Amministratori come proprietario di tutti i file e le directory. Ci possono essere modi per aggirare questo, ma questo è l’approccio più radicale e di solito il più veloce.

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

Una volta che siamo i proprietari, possiamo ora forzare un nuovo ACE nel DACL per ogni oggetto. Questo concede agli Amministratori il pieno controllo con l’ereditarietà abilitata e in modo ricorsivo attraverso il percorso.

Impostare questo alla radice con l’ereditarietà coprirebbe l’ambiente, ma quando una condivisione ha CREATOR OWNER con Controllo completo (che purtroppo è anche la raccomandazione di Microsoft per cose come i file di profilo utente), l’utente può disabilitare l’ereditarietà o rimuovere gli ACE a loro discrezione. Quindi, un approccio radicale è di solito la soluzione più veloce.

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

Una volta che abbiamo modificato i DACL sulla maggior parte dei file, proviamo a copiare i file in una nuova posizione, comune per cose come le migrazioni di condivisione file. Per questo, stiamo copiando gli elementi in modo ricorsivo e utilizzando l’interruttore /SEC per copiare anche i dati/attributi/orari/DACL.

Quindi registriamo l’operazione con i percorsi completi e per tutti gli oggetti (interruttore /V verbose) in un registro, in modo da poter risolvere i <5% di errori che sono comunemente legati alla lunghezza del percorso o al blocco del file e ottenere una maggiore precisione.

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

Questo è un semplice framework per gestire una migrazione di condivisione file con un impatto minimo sull’esperienza dell’utente. Migliora anche il controllo che IT ha sui dati. Se un cliente ha una forte pratica di governance dei dati in cui la proprietà è gestita correttamente a livello di sotto-cartella, questa diventa una discussione più complicata, ma la maggior parte dei clienti che troviamo ha la fortuna di utilizzare solo l’ereditarietà e gli ACE basati su gruppi, quindi questa è la situazione più comune e il punto di partenza per la soluzione.

Alternative a Robocopy

Robocopy è un fantastico strumento, ma ci sono molti altri strumenti simili che potrebbero interessarti.

  • xxcopy – Un’utilità simile a riga di comando con tante opzioni.
  • Copy-Item PowerShell cmdlet – Non è altrettanto completo, ma molto più semplice.
  • TreeSize – Un’utilità GUI e scriptabile per trovare informazioni sulle cartelle.

Riassunto

Robocopy è un ottimo strumento per copiare grandi insiemi di file. Che tu stia eseguendo una migrazione dei dati, mantenendo le cartelle sincronizzate o semplicemente avendo bisogno di un modo rapido per copiare accuratamente i file, robocopy è una scelta eccellente.

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