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

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.

/L
Le basi: copiare file
L’uso più basilare di robocopy è utilizzare una directory di origine e una di destinazione senza opzioni.
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.
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).
È anche possibile utilizzare /MOVE
per spostare tutti i file e le sottocartelle.
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!
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.
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.
Se desideri limitare solo ai file che iniziano con la lettera a, puoi utilizzare a*.
Puoi anche fornire più insiemi di corrispondenze di nomi file separandoli con uno spazio come mostrato di seguito.
Quando filtrate per nome file, robocopy mostrerà il filtro nell’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.
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.
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 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.
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.
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.
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.
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:
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.
Puoi quindi escludere questi file dal lavoro backupfiles in questo modo:
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.
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
.
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.
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:
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:
Vedrai che se invochi robocopy al di fuori di quelle ore, ti indicherà l’ora corrente e aspetterà l’ora di inizio per eseguirsi.

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.

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.

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.

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.
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.
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.
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.
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()
.
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)
Eliminare rapidamente i contenuti di una cartella (ignorando le autorizzazioni nelle sottocartelle)
Contributore: pizzasteveo (Reddit)
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.
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.
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.
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.
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.