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

Letture consigliate

Per ingannare il tempo in attesa del ritorno di Cthulhu potresti leggere anche:

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

Trackback e pingback

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

Scrivi un commento