Se non vedi il banner pubblicitario disabilita il blocco nel browser, aiuterai questo sito a rimanere online, grazie!

Autore [BATCH] Individuare il Sistema Operativo da un CMD  (Letto 2684 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Ripley

  • Ministro degli Esteri
  • AssistantAdmin
  • ****
  • Post: 7178
  • Karma: 20
[BATCH] Individuare il Sistema Operativo da un CMD
« il: 09 Dic 2014, 18:03:14 »
In questo periodo sto migrando i pc del mio ufficio, principalmente da XP a Seven.
Il nostro "parco" SO comprende XP, Vista e Seven.

Con l'aiuto del mitico sito ss64.com, mi sono quindi fatto un batch per il backup dei dati utente, che copia su un HD USB alcune determinate cartelle e file, lanciando una serie di comandi robocopy contenuti in un file CMD.

In base al SO installato, le cartelle da copiare stanno ovviamente in percorsi diversi.
Questo CMD mi sta tornando molto utile, perchè fa tutto lui:

Codice: [Seleziona]
@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%]
goto PC_WINXP


:sub_2003
Echo Windows 2003 o XP 64 bit [%PROCESSOR_ARCHITECTURE%]
goto NON_SUPP


:sub6
if "%_minor%"=="1" goto sub7
Echo Windows Vista o Windows 2008 [%PROCESSOR_ARCHITECTURE%]
goto PC_VISTA


:sub7
Echo Windows 7 o Windows 2008 R2 [%PROCESSOR_ARCHITECTURE%]
goto PC_WIN7


:PC_WINXP
REM operazioni da fare se pc = Windows XP
goto ESCI


:PC_VISTA
REM operazioni da fare se pc = Windows Vista
goto ESCI


:PC_WIN7
REM operazioni da fare se pc = Windows 7
goto ESCI


:NON_SUPP
Echo Versione non supportata
goto ESCI

:ESCI
« Ultima modifica: 05 Set 2015, 16:56:05 da Ripley »
Cougar 00736
OrbiterAddons/Vimeo

Offline Ripley

  • Ministro degli Esteri
  • AssistantAdmin
  • ****
  • Post: 7178
  • Karma: 20
Re:[BATCH] Individuare il Sistema Operativo da un CMD
« Risposta #1 il: 05 Set 2015, 17:18:16 »
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.
Codice: [Seleziona]
robocopy "%USERPROFILE%\Desktop" "%_disco%:\BK_%USERNAME%\Disco_C\Desktop" /MIR /Z /R:1 /W:1 /NP
In 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)

Codice: [Seleziona]
@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

:ESCI

Dopo 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  ERRORI

Potrebbe 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:
Citazione
/LOG:unità_disco:nome_file

Quindi nel mio CMD diventa:
Citazione
/LOG:%_disco%:\%USERNAME%_bklog.txt

Invece per aggiungere (append) informazioni in fondo al file già creato si deve aggiungere un "+":
Citazione
/LOG+:%_disco%:\%USERNAME%_bklog.txt

Il codice per vedere gli errori (sta alla fine del CMD) è questo:

Codice: [Seleziona]
cls
ECHO Fine copia
ECHO Visualizzazione eventuali errori:
find /N /I "ERROR 3 (" %_disco%:\%USERNAME%_bklog.txt
pause

Per fare prima, l'eventuale stringa da cercare in Notepad++ è
Codice: [Seleziona]
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.
Cougar 00736
OrbiterAddons/Vimeo

Se non vedi il banner pubblicitario disabilita il blocco nel browser, aiuterai questo sito a rimanere online, grazie!

 


SimplePortal 2.3.7 © 2008-2026, SimplePortal