Script RoboCopy
22 Ottobre 2008
Visto che tutte le volte mi dimentico dove l’ho salvato, a futura memoria faccio un copia/incolla dello script di base per Robocopy che uso per il backup su dischi esterni.
@For /F "tokens=1,2,3 delims=/ " %%A in ('Date /t') do @( Set Giorno=%%A Set Mese=%%B Set Anno=%%C Set Data=%%C%%B%%A ) Set Sorgente=*** percorso cartella di origine *** Set Destinazione=*** percorso cartella di destinazione*** Set FileLog=*** percorso cartella di log***\Backup%Data%.log :: /MIR mirror, elimina i file in destinazione :: /XJ esclude junction points :: /R:5 /W:15 attende 15 secondi e riprova 5 volte se la copia fallisce (default 30 secondi, 1 milione) :: /V verbose output :: /NP disattiva percentuale di progresso :: /LOG specifica la posizione del log (default schermo) Set Opzioni=/MIR /XJ /R:5 /W:15 /V /NP /LOG:%FileLog% Robocopy "%Sorgente%" "%Destinazione%" %Opzioni%
Note:
- non è indispensabile installare l’intero Windows Resource Kit, è sufficiente estrarre l’eseguibile (robocopy.exe) usando 7zip;
- lo script elimina nel percorso di destinazione file non più presenti nel percorso di origine (mirror);
- l’output è verbose, per cui i file di log tendono ad essere corposi (e non vengono sovrascritti, visto che ogni log contiene la data nel nome del file);
- nello specifico non mi interessa escludere delle cartelle, per cui non ho preso in considerazione un’ulteriore variabile.
Se avete suggerimenti per migliorare lo script, dite pure 😉
21 commenti/trackback a “Script RoboCopy”
Trackback e pingback
- Best of Week #26 | Gioxx's Wall
[...] Script RoboCopy [...]
Non è possibile inserire nuovi commenti. I commenti vengono disattivati automaticamente dopo 60 giorni.
22 Ottobre 2008 alle 11:17
Io aggiungo l’invio del log via mail con blat, lo mando a me e alla persona che deve controllare i backup.
http://www.blat.net/
22 Ottobre 2008 alle 11:24
Conosco blat, ma nel caso dei backup preferisco evitare l’invio tramite e-mail: io verrei sommerso dalle mail dei clienti, il cliente non le degnerebbe di uno sguardo.
Comunque è sicuramente una possibilità da tenere a mente 🙂
22 Ottobre 2008 alle 13:39
A me capita spesso di fare confusione con il FOR così per ottenere la data ripiego sempre su %date%
Per seguire il tuo esempio:
Set Giorno=%date:~0,2%
Set Mese=%date:~3,2%
Set Anno=%date:~-4,4%
Set Data=%date:~-4,4%%date:~3,2%%date:~0,2%
22 Ottobre 2008 alle 13:42
Normalmente con robocopy imposto i backup con ciclo settimanale, in modo da recuperare file cancellati accidentalmente fino ad una settimana fa.
Per ottenere il giorno della settimana in uno script batch normalmente basta cambiare il formato della data breve nel pannello di controllo in ggg gg/mm/aaaa in Xp e ddd dd/mm/yyyy in Vista (è possibile farlo da riga di comando), mentre Windows 2000 mostra il giorno della settimana di default.
set weekday=%date:~0,3%
robocopy C:\ D:\backup\%weekday% /MIR /B
22 Ottobre 2008 alle 18:46
@Pseudotecnico
Ho fatto uno script simile, utilizzando la stessa sintassi suggerita da Roberto per la data.
Ho schedulato il backup perchè venga effettuato in automatico (come penso abbia fatto anche tu).
La destinazione del backup è un disco esterno USB, che puo’ essere collegato e/o acceso oppure no.
Ho creato un file check.txt che è memoriozzato sull’unità esterna.
Lo script, come prima cosa, controlla che esista il file check.txt; se non lo trova (=unità esterna non presente) riprova all’infinito.
Beh, non proprio all’infinito perchè ho impostato lo scheduler in modo da terminare l’operazione dopo 23 ore, se questa è ancora in esecuzione.
Risultato: il backup viene tentato ogni giorno e lo script resta in esecuzione in background finchè un’anima pia non si degna di collegare/accendere l’unità esterna.
22 Ottobre 2008 alle 19:56
@enrico
Perché non piazzare direttamente il batch sul disco USB?
24 Ottobre 2008 alle 10:09
@pseudotecnico
Perchè utilizzando autoplay per mandarlo in esecuzione (suppongo sia questa la tua idea), partirebbe il backup ogni volta che accendo l’unità esterna.
Mentre a me interessa l’esecuzione ad una certa ora, ogni giorno, a patto che l’unità sia accesa.
Ottengo il risultato con queste istruzioni:
:INIZIO
if exist %_TARGET%controllo.txt GOTO START
FOR /l %%a in (300,-1,1) do (ping -n 1 -w 1000 127.0.0.1>NUL)
GOTO INIZIO
:START
….
%_TARGET% è il percorso in cui salvare il backup
300 è il numero di secondi di attesa tra un tentativo e l’altro.
Uso il ping per far trascorrere i 300 secondi.
25 Ottobre 2008 alle 11:31
No, intendo proprio piazzare il batch che esegue il backup direttamente sul disco esterno (se il disco è collegato, il file non viene rilevato e il backup non parte).
25 Ottobre 2008 alle 12:30
@pseudotecnico
Non vedo vantaggi mentre vedo almeno uno svantaggio:
dovrei replicare lo script su ogni unità esterna che voglio utilizzare allo scopo. In caso di modifica dello script, dovrei poi ricordarmi di modificarli tutti.
In questo modo, invece, è sufficiente che sia presente il file di testo controllo.txt (o altro file di check qualsiasi).
Inoltre (ma è un dettaglio da perfezionista), con il metodo che suggerisci nel log di sistema verrebbe registrato un errore.
Infine, col metodo che utilizzo ho il vantaggio di poter collegare/accendere l’unità esterna anche con ritardo rispetto all’ora prevista per il backup, ed il backup avverrebbe ugualmente.
26 Novembre 2008 alle 14:21
Veramente un signore script! domandina.. per escludere alcune cartelle come posso fare?
Ciao e grazie
26 Novembre 2008 alle 14:36
Puoi usare i parametri /XF (per i file) e /XD (per le directory).
http://www.ss64.com/nt/robocopy.html
Ti basta aggiungerli alla variabile “Opzioni”, o eventualmente usare una seconda variabile da accodare (ad es. Set Esclusioni = /XD c:\nonsalvare )
17 Giugno 2010 alle 15:23
Ma se io volessi avere più sorgenti di cui fare il backup cosa dovrei fare? usare più set sorgenti?
grazie
17 Giugno 2010 alle 16:14
Non mi risulta sia possibile avere una sorgente “multipla”, per cui dovresti replicare lo script per ogni cartella (oppure fare il backup della cartella superiore ed escludere quelle che non ti interessano con /XD)
17 Giugno 2010 alle 16:28
Grazie, replicherò lo script per tutte le cartelle che mi interessano…provo 🙂
11 Gennaio 2011 alle 16:30
Ciao a tutti, sono un nuovo utilizzatore di Robocopy, ho creato un batch per sincronizzare due directory, una sul server e l’altra in un’unità remota ….
RoboCopy /MIR /LOG:C:\Backup\V19.txt E:\Folder_19 Z:\Folder_19 ….. e funziona, poi ho provato a fare la sincronizzazione delle dir specificando una lista di files da escludere ……. RoboCopy /MIR /XF C:\Backup\exclude.txt /LOG:C:\Backup\V19.txt E:\Folder_19 Z:\Folder_19 ………. dove “exclude.txt” contiene i percorsi completi di tutti i files che non voglio copiare, e così non funziona.
Sapete dirmi perchè???
11 Gennaio 2011 alle 16:53
Dove hai trovato che è possibile utilizzare un file per l’esclusione? Che io sappia puoi solo indicare un elenco di file. Esempio:
/XF c:\pippo.txt *.doc c:\prova.tmp
11 Gennaio 2011 alle 16:59
Siccome, se non ricordo male, con il vecchio xcopy si poteva fare speravo si potesse fare anche con robocopy.
Allora mi sa tanto che devo provare con /MAXAGE: per fargli trasferire solamente gli ultimi files. Lo avete mai usato???
11 Gennaio 2011 alle 17:10
Mai usato, utilizzo solo varianti minime di questo script 😉
8 Gennaio 2012 alle 01:10
utilizzando robocopy non la versione grafica,è possibile visualizzare a video il tempo che rimane x completare la copia?
8 Gennaio 2012 alle 08:21
Non mi risulta sia possibile