Data/ora in formato ISO 8601 per gli script batch

In uno script batch (con estensione BAT o CMD) a volte può essere necessario conoscere la data ed ora correnti. Le variabili di ambiente %date% e %time% contengono queste informazioni, ma in alcuni casi non possono essere utilizzate direttamente. Ad esempio, utilizzando xcopy e volendo ottenere un file di log di tutto quello riportato sullo schermo, si ottiene un errore.

xcopy C:\dati C:\backup /E /Y /I /H /O > C:\log\%date%.log
Impossibile trovare il percorso specificato

Questo perché si tenta di creare il file C:\log\03/10/2008.log, che contiene il carattere / non valido per i nomi di file. La soluzione ideale è di usare il formato ISO 8601 aaaa-mm-gg (es. 2008-10-03), che oltre a poter essere utilizzato come nome di file, risulta comodo per tenere in ordine cronologico i file. Per ottenere questo risultato possiamo creare una nuova variabile estrapolando le informazioni dalla data corrente, quindi successivamente la usiamo a piacere all’interno dello script.

set today=%date:~6,4%-%date:~3,2%-%date:~0,2%
xcopy C:\dati C:\backup /E /Y /I /H /O > C:\log\%today%.log

Attenzione: nell’esempio viene estrapolata la data ISO a partire dalla data di sistema, che viene proposta di default, nelle versioni in italiano, nel formato gg/mm/aaaa. In un sistema con altra lingua, potrebbe essere usato un formato differente ed è necessario adattare di conseguenza il codice.

L’operazione analoga possiamo eseguirla anche con la variabile %time%, per ignorare i millisecondi non previsti dallo standard ISO.

set datetime=%date:~6,4%-%date:~3,2%-%date:~0,2%T%time:~0,2%%time:~3,2%%time:~6,2%
xcopy C:\dati C:\backup /E /Y /I /H /O > C:\log\%datetime%.log