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 😉

Tag Technorati: ,

21 commenti/trackback a “Script RoboCopy”

  1. Andrea Beggi scrive:

    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/

  2. flod scrive:

    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 🙂

  3. Roberto scrive:

    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%

  4. Davide Bia scrive:

    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

  5. Enrico scrive:

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

  6. flod scrive:

    @enrico

    Perché non piazzare direttamente il batch sul disco USB?

  7. Enrico scrive:

    @pseudotecnico

    Perché non piazzare direttamente il batch sul disco USB?

    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.

  8. flod scrive:

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

  9. Enrico scrive:

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

  10. Alberto scrive:

    Veramente un signore script! domandina.. per escludere alcune cartelle come posso fare?

    Ciao e grazie

  11. flod scrive:

    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 )

  12. mattia scrive:

    Ma se io volessi avere più sorgenti di cui fare il backup cosa dovrei fare? usare più set sorgenti?
    grazie

  13. flod scrive:

    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)

  14. Mattia scrive:

    Grazie, replicherò lo script per tutte le cartelle che mi interessano…provo 🙂

  15. Roberto scrive:

    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è???

  16. flod scrive:

    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

  17. Roberto scrive:

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

  18. flod scrive:

    Mai usato, utilizzo solo varianti minime di questo script 😉

  19. Fabrizio scrive:

    utilizzando robocopy non la versione grafica,è possibile visualizzare a video il tempo che rimane x completare la copia?

  20. flod scrive:

    Non mi risulta sia possibile

Trackback e pingback

  1. Best of Week #26 | Gioxx's Wall
    [...] Script RoboCopy [...]

Non è possibile inserire nuovi commenti. I commenti vengono disattivati automaticamente dopo 60 giorni.