[R] If et RegRead

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

[R] If et RegRead

#1

Message par yoyox »

Bonjour,

j'ai un petit problème concernant la lecture d'une clé registre

Mon script va vérifier si une clé registre existe dans le SID d'un utilisateur

Mon problèmes c'est que je fais une vérification à savoir si le RegRead me renvoie rien un 1 ou un 0 or quand il renvoi 0 ou rien, il me renvoi sur la condition then

Le problème c'est que 0 et rien ne représente pas la même chose ?

aurais-je pas fait une erreur ?

Merci

Code : Tout sélectionner

#RequireAdmin
#NoTrayIcon
#include <MsgBoxConstants.au3>

Opt("TrayIconHide", 1)

Local $sSubKey = "ProfileImagePath"
For $i = 1 To 50
    $sSubKey = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", $i)
    If @error Then ExitLoop
    MsgBox($MB_SYSTEMMODAL, "SubKey #" & $i & " under HKLM\SOFTWARE: ", $sSubKey)
    $key = "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\"
    ;MsgBox(0, "key", $key)
   if RegRead( $key , "ProxyEnable") = ""  Then
      MsgBox(0, "key", "Variable non existante")
   Else
      MsgBox(0, "key", "Variable existante")
       EndIf
Next
Modifié en dernier par yoyox le jeu. 13 août 2015 08:22, modifié 1 fois.
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] If et RegRead

#2

Message par yoyox »

J'ai trouvé la solution en inversant la chose, mais si quelqu'un a la réponse à ma question ça serait cool

merci

Code : Tout sélectionner

#RequireAdmin
#NoTrayIcon
#include <MsgBoxConstants.au3>

Opt("TrayIconHide", 1)

Local $sSubKey = "ProfileImagePath"
For $i = 1 To 50
    $sSubKey = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", $i)
    If @error Then ExitLoop
    MsgBox($MB_SYSTEMMODAL, "SubKey #" & $i & " under HKLM\SOFTWARE: ", $sSubKey)
    $key = "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\"
    ;MsgBox(0, "key", $key)
   if RegRead( $key , "ProxyEnable") = "0" or RegRead( $key , "ProxyEnable") = "1"  Then
      MsgBox(0, "key", "Bon")
   Else
      MsgBox(0, "key", "Pas bon")
       EndIf
Next
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] If et RegRead

#3

Message par jguinch »

La valeur retournée par RegRead ici est de type Int (car ProxyEnable est de type REG_DWORD)
Si tu compares un entier à une chaîne (comme "" ou "0"), la chaîne sera convertie en entier pour effectuer la comparaison.

Exemple :

Code : Tout sélectionner

; pour le test, il faut que ProxyEnable soit à 0
$ProxyEnable = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable")
If $ProxyEnable = "" Then ConsoleWrite("ProxyEnable est egal a ''" & @CRLF) ; On compare la valeur avec une chaîne vide
If $ProxyEnable = "pouet" Then ConsoleWrite("ProxyEnable est egal a 'pouet'" & @CRLF) ; On compare la valeur avec une chaine
Etonnant non ? 0 = "pouet" :wink:
C'est normal, car une comparaison ne peut comparer que ce qui est comparable.. :?
Donc la valeur "pouet" est convertie en entier (Int), ce qui revient à écrire :

Code : Tout sélectionner

If $ProxyEnable = Int("pouet") Then ConsoleWrite("ProxyEnable est egal a 'pouet'" & @CRLF) ; On compare la valeur avec une chaine
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] If et RegRead

#4

Message par yoyox »

d'ou l'obligation de faire comme j'ai fais, à l'enver ? en lui disant que si c'est 1 ou 0 alors il continue

mais comment faire si un jour je tombe sur une chaine vide ou inexistante avec RegRead ?
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] If et RegRead

#5

Message par jguinch »

C'est là qu'intervient @error.
Par exemple, si tu lis une valeur inexistante, RegRead te renverra une valeur vide et @error aura comme valeur -1.
Regarde dans la doc la description de @error pour RegRead (et pour chaque fonction).

Dans ton cas, tu aurais pu faire le test simplement en comparant la valeur avec un entier, et non pas avec une chaîne :
If $ProxyEnable = 0 est différent de If $ProxyEnable = "0"

If $ProxyEnable = 0 (ou 1) => OK : On compare deux entier
If $ProxyEnable = "0" => Pas OK : On compare un entier avec une chaîne. Dans ce cas la chaîne est convertie en entier avant d'être comparée : toute chaîne non numérique deviendra alors 0. C'est pour ça que la condition If 0 = "pouet" est vraie
If String($ProxyEnable) = "0" => OK : On compare deux chaînes

C'est plus clair ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] If et RegRead

#6

Message par yoyox »

Ok, j'ai bien compris la différence entre les deux mais peut etre que j'ai du mal l'appliqué au code
► Afficher le texte
La parti en bleu est un int hors mon if comporte des chaine "0" ou "1"

j'ai donc fait comme tu me la expliqué, j'ai enlever les "" pour mettre mes valeur en int
sauf que cela ne fonctionne plus quand j’enlève les guillemet

peut être que j'ai fait une gaff ?

Merci

Ps: le code fonctionne mais je cherche à comprendre le pourquoi ;)
Modifié en dernier par jguinch le mar. 18 nov. 2014 09:03, modifié 1 fois.
Raison : Ajout de la balise Spoiler
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] If et RegRead

#7

Message par jguinch »

Tu veux dire que ce code te renvoi à chaque fois "la valeur ProxyEnable n'est pas renseignée" ?
► Afficher le texte

Edit : pense à utiliser la balise Spoiler pour le code (quand il a y plus de 10 lignes environ...)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] If et RegRead

#8

Message par yoyox »

Quand je met les guillemet le script fonctionne correctement, j'ai vérifier dans tout les SID à la main

tu peux essayer le script suivant, essai avec et sans les guillemets
► Afficher le texte
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] If et RegRead

#9

Message par jguinch »

Avant de poursuivre, j'ai besoin de comprendre : est-ce que le script sera exécuté sur un serveur ? Si non, il n'y a aucune chance pour que ça fonctionne...

Essai ça :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] If et RegRead

#10

Message par orax »

Code : Tout sélectionner

if RegRead( $key , "ProxyEnable") [color=#FF0000]==[/color] 0 or RegRead( $key , "ProxyEnable") = 1  Then
Sinon la condition sera toujours vraie.

Ou alors

Code : Tout sélectionner

if RegRead( $key , "ProxyEnable") = "0" or RegRead( $key , "ProxyEnable") = "1"  Then

Code : Tout sélectionner

$a = ''
If $a = 0 Then MsgBox(0, '', '=')
If $a == 0 Then MsgBox(0, '', '==')
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] If et RegRead

#11

Message par yoyox »

Oui il sera exécute sur un serveur
yoyox
Niveau 2
Niveau 2
Messages : 29
Enregistré le : ven. 14 nov. 2014 09:19
Status : Hors ligne

Re: [..] If et RegRead

#12

Message par yoyox »

Merci orax, mais mon script fonctionne très bien je me posé juste la question posé ci-dessus à propos des int et string sur les clés de registre
Répondre