IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

FAQs Windows Discussion :

[Batch] Récupérer valeur décimale d'un REG_DWORD [Fait]


Sujet :

FAQs Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Points : 13
    Points
    13
    Par défaut [Batch] Récupérer valeur décimale d'un REG_DWORD
    Bonjour !

    J'utilisais un script batch qui permettait de récupérer certaines valeurs de clés de registre de l'antivirus de serveurs (version du DAT, version du moteur, date de dernière mise à jour) et qui les comparait avec celles d'un serveur de référence. C'était facile car c'était des REG_SZ donc il s'agissait de comparer des valeurs en décimal.

    Maintenant, la version de l'antivirus à évolué sur certains serveurs, et ce n'est plus aussi simple de récupérer ces valeurs car j'ai maintenant à faire à des REG_DWORD, donc les valeurs que je récupère sont en hexadécimal, et je dois comparer ces valeurs aux mêmes valeurs décimales sur le serveur de référence.

    Après comparaison des valeurs, le script dit si c'est OK ou s'il y a un décalage. Le problème c'est qu'il ne me remonte plus que des erreurs car forcément en comparant de l'hexa à du décimal, c'est pas la même chose !

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    @echo off
    REM -------------------------------------------------------------------
    REM --- CheckDat.bat
    REM -------------------------------------------------------------------
    @SET server=fralsamisips02
    @SET sdat=None
    @SET seng=None
    @SET svdate=None
    @SET xdat=None
    @SET xeng=None
    @SET xvdate=None
    @SET datkey=None
    REM -------------------------------------------------------------------
    REM -----------------  DAT Version From This Computer -----------------  
    REM -------------------------------------------------------------------
    REM Engine Version
    REM -------------------------------------------------------------------
    @echo EngineVersion32Major	None	None > c:\nsclientplus\scripts\%1_temp.txt
    @c:\nsclientplus\scripts\REG.exe QUERY "HKLM\SOFTWARE\McAfee\AVEngine" /v EngineVersion32Major  > c:\nsclientplus\scripts\%1_temp.txt
    @FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%1_temp.txt) do set seng=%%a
    REM -------------------------------------------------------------------
    REM Dat File Version
    REM -------------------------------------------------------------------
    @echo AVDatVersion	None	None > c:\nsclientplus\scripts\%1_temp.txt
    @c:\nsclientplus\scripts\REG.exe QUERY "HKLM\SOFTWARE\McAfee\AVEngine" /v AVDatVersion  > c:\nsclientplus\scripts\%1_temp.txt
    @FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%1_temp.txt) do set sdat=%%a
    REM -------------------------------------------------------------------
    REM Dat Date
    REM -------------------------------------------------------------------
    @ECHO AVDatDate		None	None > c:\nsclientplus\scripts\%1_temp.txt
    @c:\nsclientplus\scripts\REG.exe QUERY "HKLM\SOFTWARE\McAfee\AVEngine" /v AVDatDate  > c:\nsclientplus\scripts\%1_temp.txt
    @FOR /f "tokens=3,4,5 delims=	 " %%a IN (c:\nsclientplus\scripts\%1_temp.txt) do set svdate=%%a-%%b-%%c
    REM 
    REM -------------------------------------------------------------------
    REM ----------------  DAT Version From The Main Server ----------------  
    REM -------------------------------------------------------------------
    @SET machine=\\%server%
    REM -------------------------------------------------------------------
    REM Engine Version
    REM -------------------------------------------------------------------
    @ECHO szEngineVer	None	None > c:\nsclientplus\scripts\%server%_temp.txt
    @c:\nsclientplus\scripts\REG.exe QUERY "%machine%\HKLM\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion" /v szEngineVer > c:\nsclientplus\scripts\%server%_temp.txt
    @FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%server%_temp.txt) do set xeng=%%a
    REM -------------------------------------------------------------------
    REM Dat File Version
    REM -------------------------------------------------------------------
    @ECHO szVirDefVer	None	None > c:\nsclientplus\scripts\%server%_temp.txt
    @c:\nsclientplus\scripts\REG.exe QUERY "%machine%\HKLM\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion" /v szVirDefVer > c:\nsclientplus\scripts\%server%_temp.txt
    @FOR /f "tokens=3 delims=	 " %%a IN (c:\nsclientplus\scripts\%server%_temp.txt) do set xdat=%%a
    REM -------------------------------------------------------------------
    REM Dat Date
    REM -------------------------------------------------------------------
    @ECHO szVirDefDate	None	None > c:\nsclientplus\scripts\%server%_temp.txt
    @c:\nsclientplus\scripts\REG.exe QUERY "%machine%\HKLM\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion" /v szVirDefDate > c:\nsclientplus\scripts\%server%_temp.txt
    @FOR /f "tokens=3,4,5 delims=	 " %%a IN (c:\nsclientplus\scripts\%server%_temp.txt) do set xvdate=%%a-%%b-%%c
    REM -------------------------------------------------------------------
    REM Convert to version only if necessary
    REM -------------------------------------------------------------------
    @SET datkey=%sdat:~1,1%
    @IF NOT %datkey%==. GOTO PASCONV1
    @SET sdat=%sdat:~4,4%%
    :PASCONV1
    @SET datkey=%xdat:~1,1%
    @IF NOT %datkey%==. GOTO PASCONV2
    @SET xdat=%xdat:~4,4%
    :PASCONV2
    REM ---------------------------------------------------------------------
    REM ---- Cleanup
    REM ---------------------------------------------------------------------
    @DEL c:\nsclientplus\scripts\_temp.txt
    @DEL c:\nsclientplus\scripts\%server%_temp.txt
    REM ---------------------------------------------------------------------
    @IF NOT %sdat%==%xdat% GOTO NOTOK
    @IF NOT %seng%==%xeng% GOTO NOTOK
    @echo OK %date% %time% found : %seng% / %sdat% / %svdate% (ref:%server% %xeng% %xdat% %xvdate%) 
    @exit 0
    :NOTOK
    @echo CRITICAL %date% %time% found : %seng% / %sdat% / %svdate% (ref:%server% %xeng% %xdat% %xvdate%)
    @exit 2
    Y a-t-il une possibilité de récupérer la valeur décimale d'un REG_DWORD ? Ou alors la possibilité de rajouter dans mon script une conversion des valeurs hexa en décimal ?

    Pour info : la finalité de ce script est de renvoyer l'état de l'antivirus des serveurs sur Nagios.

    Merci d'avance pour votre aide !

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    C'est possible de convertir de l'hexa en décimal, via la substitution de variables, mais ça prends un paquet de lignes... Ceci étant dit, ça reste possible, même si j'émets des doutes sur la rapidité en cas d'appels "lourds" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    @echo off
    if "%1"=="" goto :help
    setlocal enableextensions enabledelayedexpansion
    
    REM Récupération du chiffre hexa complet.
    set H=%1
    REM Initialisation du résultat de conversion et du multiplicateur.
    set /A C=0
    set /A M=1
    REM Parcours de la chaîne de caractères de droite à gauche.
    for /l %%I in (-1, -1, -8) do (
    	REM Récupération du chiffre hexa, en partant de la fin.
    	set D=!H:~%%I,1!
    	echo Current hexa digit : !D!
    	REM Partie pénible : conversion hexa->décimal, chiffre par chiffre.
    	set /A V=-1
    	if /i !D!==0 set V=0
    	if /i !D!==1 set V=1
    	if /i !D!==2 set V=2
    	if /i !D!==3 set V=3
    	if /i !D!==4 set V=4
    	if /i !D!==5 set V=5
    	if /i !D!==6 set V=6
    	if /i !D!==7 set V=7
    	if /i !D!==8 set V=8
    	if /i !D!==9 set V=9
    	if /i !D!==a set V=10
    	if /i !D!==b set V=11
    	if /i !D!==c set V=12
    	if /i !D!==d set V=13
    	if /i !D!==e set V=14
    	if /i !D!==f set V=15
    	echo   =^> Value : !V!
    	REM V vaut désormais la valeur numérique correspondante au chiffre hexa.
    	REM On va donc multiplier V par M, l'ajouter à C, et augmenter M.
    	if !V! GEQ 0 (
    		set /a V=!V!*!M!
    		set /a M=!M!*16
    		set /a C=!C!+!V!
    	) else (
    		echo   =^> Convert error : !D! is not a valid hexadecimal digit.
    		echo   =^> Result is truncated.
    		goto :breakloop
    	)
    )
    :breakloop
    REM C contient le chiffre décimal final : on l'affiche.
    echo.
    echo Result : %1 = !C!
    goto :eof
    
    :help
    echo Syntax: %0 ^<HexaDigit^>
    echo Warning : maximum 8 digits are used (**SIGNED** 32 bits).
    goto :eof
    Bon, je l'ai fait "super didactique", avec traces et tout, à toi d'extraire le juste nécessaire pour ton besoin. Je n'ai pas trouvé comment passer en 32 bits NON signé par contre, faudra donc jongler un peu avec ça si nécessaire. Tu peux éventuellement faire une fonction qui traite l'entier en deux parties (une partie "milliard", un chiffre décimal, puis la partie "millions"), mais il n'est pas certain que ce soit réellement utile... Enfin, tu verras bien.

    Je ne saurais trop te conseiller de faire une sous-fonction de tout ça, quitte à jouer avec les redirections pour récupérer la valeur numérique...

    En version "minimale", sans traces ni contrôle d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @echo off
    setlocal enableextensions enabledelayedexpansion
    set H=%1
    set /A C=0
    set /A M=1
    for /l %%I in (-1, -1, -8) do (
    	set D=!H:~%%I,1!
    	if /i !D!==0 set V=0
    	if /i !D!==1 set V=1
    	if /i !D!==2 set V=2
    	if /i !D!==3 set V=3
    	if /i !D!==4 set V=4
    	if /i !D!==5 set V=5
    	if /i !D!==6 set V=6
    	if /i !D!==7 set V=7
    	if /i !D!==8 set V=8
    	if /i !D!==9 set V=9
    	if /i !D!==a set V=10
    	if /i !D!==b set V=11
    	if /i !D!==c set V=12
    	if /i !D!==d set V=13
    	if /i !D!==e set V=14
    	if /i !D!==f set V=15
    	set /a V=!V!*!M!
    	set /a M=!M!*16
    	set /a C=!C!+!V!
    )
    echo !C!
    Si quelqu'un veut mettre le bout de code en FAQ Batch, je n'y vois pas d'inconvénients pour ma part.

  3. #3
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    C'est possible de convertir de l'hexa en décimal, via la substitution de variables, mais ça prends un paquet de lignes... Ceci étant dit, ça reste possible, même si j'émets des doutes sur la rapidité en cas d'appels "lourds" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    @echo off
    if "%1"=="" goto :help
    setlocal enableextensions enabledelayedexpansion
    
    REM Récupération du chiffre hexa complet.
    set H=%1
    REM Initialisation du résultat de conversion et du multiplicateur.
    set /A C=0
    set /A M=1
    REM Parcours de la chaîne de caractères de droite à gauche.
    for /l %%I in (-1, -1, -8) do (
    	REM Récupération du chiffre hexa, en partant de la fin.
    	set D=!H:~%%I,1!
    	echo Current hexa digit : !D!
    	REM Partie pénible : conversion hexa->décimal, chiffre par chiffre.
    	set /A V=-1
    	if /i !D!==0 set V=0
    	if /i !D!==1 set V=1
    	if /i !D!==2 set V=2
    	if /i !D!==3 set V=3
    	if /i !D!==4 set V=4
    	if /i !D!==5 set V=5
    	if /i !D!==6 set V=6
    	if /i !D!==7 set V=7
    	if /i !D!==8 set V=8
    	if /i !D!==9 set V=9
    	if /i !D!==a set V=10
    	if /i !D!==b set V=11
    	if /i !D!==c set V=12
    	if /i !D!==d set V=13
    	if /i !D!==e set V=14
    	if /i !D!==f set V=15
    	echo   =^> Value : !V!
    	REM V vaut désormais la valeur numérique correspondante au chiffre hexa.
    	REM On va donc multiplier V par M, l'ajouter à C, et augmenter M.
    	if !V! GEQ 0 (
    		set /a V=!V!*!M!
    		set /a M=!M!*16
    		set /a C=!C!+!V!
    	) else (
    		echo   =^> Convert error : !D! is not a valid hexadecimal digit.
    		echo   =^> Result is truncated.
    		goto :breakloop
    	)
    )
    :breakloop
    REM C contient le chiffre décimal final : on l'affiche.
    echo.
    echo Result : %1 = !C!
    goto :eof
    
    :help
    echo Syntax: %0 ^<HexaDigit^>
    echo Warning : maximum 8 digits are used (**SIGNED** 32 bits).
    goto :eof
    Bon, je l'ai fait "super didactique", avec traces et tout, à toi d'extraire le juste nécessaire pour ton besoin. Je n'ai pas trouvé comment passer en 32 bits NON signé par contre, faudra donc jongler un peu avec ça si nécessaire. Tu peux éventuellement faire une fonction qui traite l'entier en deux parties (une partie "milliard", un chiffre décimal, puis la partie "millions"), mais il n'est pas certain que ce soit réellement utile... Enfin, tu verras bien.

    Je ne saurais trop te conseiller de faire une sous-fonction de tout ça, quitte à jouer avec les redirections pour récupérer la valeur numérique...

    En version "minimale", sans traces ni contrôle d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @echo off
    setlocal enableextensions enabledelayedexpansion
    set H=%1
    set /A C=0
    set /A M=1
    for /l %%I in (-1, -1, -8) do (
    	set D=!H:~%%I,1!
    	if /i !D!==0 set V=0
    	if /i !D!==1 set V=1
    	if /i !D!==2 set V=2
    	if /i !D!==3 set V=3
    	if /i !D!==4 set V=4
    	if /i !D!==5 set V=5
    	if /i !D!==6 set V=6
    	if /i !D!==7 set V=7
    	if /i !D!==8 set V=8
    	if /i !D!==9 set V=9
    	if /i !D!==a set V=10
    	if /i !D!==b set V=11
    	if /i !D!==c set V=12
    	if /i !D!==d set V=13
    	if /i !D!==e set V=14
    	if /i !D!==f set V=15
    	set /a V=!V!*!M!
    	set /a M=!M!*16
    	set /a C=!C!+!V!
    )
    echo !C!
    Si quelqu'un veut mettre le bout de code en FAQ Batch, je n'y vois pas d'inconvénients pour ma part.
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set /a valeur=0x%hexa%
    echo %valeur%
    Je me garde de tout commentaire. Oups, je crois que je viens d'en faire un.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par maxim_um Voir le message
    Je me garde de tout commentaire. Oups, je crois que je viens d'en faire un.
    Narf...

    J'ai épluché l'aide de SET dix fois ce soir, j'ai même pas vu ce paragraphe sur les chiffres hexa, tellement persuadé que c'était obligatoirement un code-usine comme la vérification de la version de Windows...

    Bon, note pour plus tard : arrêter de faire trois / quatre trucs en même temps, on finit par (presque) dire des conneries. Presque, parce que mon code marche malgré tout, même s'il est (très) loin d'être optimal...

    Bon, on va dire que c'est un code générique pour convertir depuis n'importe quelle base numérique, OK ?

  5. #5
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Bon, on va dire que c'est un code générique pour convertir depuis n'importe quelle base numérique, OK ?
    Non.

    Mais je ne t'en veux pas.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par maxim_um Voir le message
    Non.

    Mais je ne t'en veux pas.
    On va dire quand même...

Discussions similaires

  1. Récupérer valeur d'un vbs dans un batch
    Par arnaudperfect dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 15/02/2010, 15h16
  2. Récupérer la valeur décimale : une fonction sur SAS?
    Par fafabzh6 dans le forum SAS Base
    Réponses: 2
    Dernier message: 11/12/2009, 10h59
  3. [Batch] Récupérer valeur décimale d'un REG_DWORD
    Par manu7762323 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 17/07/2009, 02h31
  4. Batch récupérer une valeur
    Par |DuFF| dans le forum Windows
    Réponses: 11
    Dernier message: 12/01/2008, 14h02
  5. récupérer valeur sql - dans un script batch
    Par persam dans le forum SQL
    Réponses: 6
    Dernier message: 09/08/2007, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo