Così com'è, il CMD qua sopra non è altro che un
template vuoto, da usare nel caso si debbano compiere delle operazioni condizionali in base al Sistema Operativo.
Allo stato attuale sarebbe comunque da ampliare per permettergli di distinguere anche Windows 8/8.1 e l'ultimo Windows 10.
Proverò a spiegare meglio perchè a me torna/è tornato molto utile a lavoro.
Non svelerò niente di
pazzesco come al solito, ma solo una cosina simpatica.
Tutto "parte" dalla schermata di output del comando
SET.
Se da una finestra DOS diamo questo comando, possiamo vedere le
variabili d'ambiente attualmente in uso nel nostro SO.
Un giorno guardando quella schermata e pensando alla configurazione multiutente del mio ufficio mi sono detto: "...e perchè non usare queste variabili in modo utile?".
Infatti, quando in ufficio faccio login ed entro nel pc, uso il mio codice fiscale come nome utente (oltre alla mia password), quindi è sicuro che la variabile d'ambiente %USERNAME% contiene un valore univoco (il mio codice fiscale).
Lo stesso naturalmente avviene per ogni altro utente/pc del mio ufficio.
Quindi usando/combinando qualche variabile d'ambiente esistente posso costruire un comando per copiare una determinata cartella di un utente, in questo esempio il desktop, nella
sua sottocartella di backup del disco USB.
In questo caso la praticità è data dal fatto che
una sola linea di codice andrà bene per
tutti gli utenti dell'ufficio: vado di pc in pc, attacco il disco USB, lancio il CMD, e alla fine avrò tutti i backup di tutti gli utenti, ognuno nella sua cartella.
La sintassi del comando robocopy è sempre la solita:
robocopy origine destinazione /opzioni.
robocopy "%USERPROFILE%\Desktop" "%_disco%:\BK_%USERNAME%\Disco_C\Desktop" /MIR /Z /R:1 /W:1 /NPIn questa linea notiamo, racchiusa tra i segni "%" di percentuale, un'altra variabile (
_disco) che viene valorizzata tramite il comando CHOICE, subito dopo l'identificazione del SO.
Occhio che CHOICE ha una diversa sintassi in Windows 7 e successivi, quindi la linea andrà leggermente adattata per gli altri SO.
La versione
aggiornata del CMD diventa quindi:
(per semplicità inserisco solo la parte che tratta XP)
@echo off
Setlocal
For /f "tokens=2 delims=[]" %%G in ('ver') Do (set _version=%%G)
For /f "tokens=2,3,4 delims=. " %%G in ('echo %_version%') Do (set _major=%%G& set _minor=%%H& set _build=%%I)
Echo Major version: %_major% Minor Version: %_minor%.%_build%
if "%_major%"=="5" goto sub5
if "%_major%"=="6" goto sub6
goto NON_SUPP
:sub5
REM Winxp o 2003
if "%_minor%"=="2" goto sub_2003
Echo Windows XP [%PROCESSOR_ARCHITECTURE%]
Echo.
Echo Scegli la lettera identificativa del disco USB (Z per uscire)
CHOICE /C:GHIZ /T:Z,10
IF ERRORLEVEL ==4 GOTO ESCI
IF ERRORLEVEL ==3 set _disco=I
IF ERRORLEVEL ==2 set _disco=H
IF ERRORLEVEL ==1 set _disco=G
goto PC_WINXP
:PC_WINXP
robocopy "%USERPROFILE%\Desktop" "%_disco%:\BK_%USERNAME%\Disco_C\Desktop" /MIR /Z /R:1 /W:1 /NP
:ESCIDopo aver "capito" che siamo in XP (siamo nella routine :sub5), con il comando CHOICE, scelgo la lettera identificativa che il pc su cui sono
in quel momento ha assegnato al disco USB appena collegato.
Magari l'utente potrebbe avere già inserito una sua chiavetta, o un cellulare, così mi garantisco di avere un range di ID disponibili (G:, H: o I:).
A questo punto, usando le altre variabili messe a disposizione dal SO, si possono aggiungere tutte le righe che vogliamo per copiare altre cartelle.
GESTIONE ERRORIPotrebbe capitare per qualche motivo (file aperti, ecc...) che robocopy non riesca a copiare qualche file. Io gestisco questa situazione così: durante la copia faccio creare a robocopy un file di log e poi (con Notepad++) cerco una determinata stringa in questo file (finita la copia, lascio comunque in pausa il programma così da poter leggere subito a schermo se ci sono errori).
L'opzione di robocopy per
creare un file di log è questa:
/LOG:unità_disco:nome_file
Quindi nel mio CMD diventa:
/LOG:%_disco%:\%USERNAME%_bklog.txt
Invece per aggiungere (append) informazioni in fondo al file
già creato si deve aggiungere un "+":
/LOG+:%_disco%:\%USERNAME%_bklog.txt
Il codice per vedere gli errori (sta alla fine del CMD) è questo:
cls
ECHO Fine copia
ECHO Visualizzazione eventuali errori:
find /N /I "ERROR 3 (" %_disco%:\%USERNAME%_bklog.txt
pausePer fare prima, l'eventuale stringa da cercare in Notepad++ è
ERROR 3 (Ci sono altri tipi e codici di errore nella documentazione di robocopy, ma il 3 è quello che interessa a me.
Mi sono accorto adesso (facendo la solita "manutenzione") che avevamo già trattato questo stesso argomento
qua, evidentemente il problema è ricorrente. La soluzione in quel thread mi sembra però un po'
acerba e molto meno elegante di questa.