Une fois n’est pas coutume, voici un article présentant un batch DOS, et non pas un script BASH !

Dernièrement, un des points d’entrée d’une de mes trieuses RFID a complètement perdu la date et l’heure : il se croyait en janvier 2010 – bonjour le bazar dans la table ci_dt_loan_history quand des prêts faits en 2018 ont une date de retour en 2010 !!

Bref, sans m’apesantir sur les détails (j’avais paramétré la synchronisation avec notre serveur NTP, mais ça n’a pas l’air de fonctionner, il faudra que je regarde ça de plus près), j’ai décidé d’écrire un batch qui me récupérerait la date et l’heure de chacun de mes appareils RFID, pour vérifier qu’aucun n’est trop déréglé…

Après avoir testé diverses solutions (NET TIME, psexec…), j’ai finalement trouvé mon bonheur avec une commande WMIC : « OS Get LocalDateTime », qui permet d’avoir la date/heure d’un PC local ou distant. On l’utilise ainsi :

WMIC /node:"nom_pc" /user:"login" /password:"password" OS Get LocalDateTime

Ça renvoie la date et l’heure au format AAAAMMJJHHMMSS (avec un peu de blabla en plus). Ex :

20181208142512.885000+060

Un peu de reformatage, une petite fonction pour éviter d’avoir trop de lignes de code, et voici le batch en question :

@echo off
title Recuperer la date et l'heure des appareils RFID
set fichier=date_rfid_%date:~6,4%%date:~3,2%%date:~0,2%.txt
echo Date et heure des appareils RFID le %date% %time% : >> %fichier%
echo. >> %fichier%
call:datepc automate-1 login password
call:datepc automate-2 login password
call:datepc automate-3 login password
call:datepc automate-4 login password
call:datepc automate-5 login password
call:datepc automate-6 login password
call:datepc automate-7 login password
REM Ajouter une ligne pour chaque appareil dont on veut récupérer la date/heure
pause
exit
::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------
:datepc for /f "delims=" %%a in ('WMIC /node:"%~1" /user:"%~2" /password:%~3 OS Get LocalDateTime ^| find "."') do set dt=%%a
set dt=%dt:~6,2%/%dt:~4,2%/%dt:~0,4% %dt:~8,2%:%dt:~10,2%:%dt:~12,2%
echo %~1 : %dt% >> %fichier%
set dt=
goto:eof

Je récupère un fichier texte avec sur chaque ligne la date et l’heure d’un automate :

Date et heure des appareils RFID le 08/12/2018 14:52:40,14 :

automate-1 : 08/12/2018 14:53:30
automate-2 : 08/12/2018 14:53:18
automate-3 : 08/12/2018 14:53:13
automate-4 : 08/12/2018 14:53:16
automate-5 : 08/12/2018 14:53:53
automate-6 : 08/12/2018 14:53:37
automate-7 : 08/12/2018 14:53:43

et je vois en un clin d’œil que le décalage entre les différents appareils reste raisonnable.

Il n’y a plus qu’à ajouter éventuellement un envoi par mail, le planifier avec le planificateur de tâches, et voilà !

Il y a probablement moult façons d’arriver au même résultat, mais celle-ci fonctionne, et elle m’a permis de pratiquer deux outils que j’utilise peu : les fonctions dans les batches et le WMIC.

Il y aurait matière à améliorer, par exemple en soustrayant la date distante à l’heure locale pour vérifier que le résultat est dans  une plage définie (5 minutes, disons ?), ou en faisant une boucle FOR pour appeler la fonction (mais ça devient compliqué si les appareils n’ont pas le même login/password)… Mais bon, disons que c’est un outil temporaire en attendant de faire correctement fonctionner la synchronisation NTP.

Et vous, comment auriez-vous fait ?

Publicités