[R] Actualiser la base de registre sans redemarrer

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

[R] Actualiser la base de registre sans redemarrer

#1

Message par liberte75 »

Bonjour tout le monde de retour encore.
je travail actualement sur l'ajout de quelque variables d'environnement à travers ces lignes:

Code : Tout sélectionner

RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name", "REG_SZ", "value")
    EnvUpdate()
Bon tout marche bien.
sauf que lorsque j'execute un fichier .bat à travers mon script creer avec autoit, quelque commande dos semble ne pas etre reconue.
il suffit juste de redemarrer l'ordinateur et reexecuter mon script et tout marche bien.

Code : Tout sélectionner

RunWait (nomfichier.bat,"chemain du fichier .bat")
Est ce qu'il y'a une commande avec autoit pour actualiser la base de registre.
car meme avec EnvUpdate() mes affaires ne marche pas.
Merci d'avance
Modifié en dernier par liberte75 le lun. 11 mars 2013 17:44, modifié 1 fois.
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#2

Message par sksbir »

bonjour

ça ne marche pas, parce qu'il faut utiliser la fonction envset pour modifier une variable d'environnement ( puis envupdate).
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#3

Message par Tlem »

Si le but est uniquement de mettre à jour une variable d'environnement, le code ci-dessous fonctionne parfaitement sous XP. ;)
► Afficher le texte
Sinon, si on veut faire plus simple, le simple appel à la ligne de code ci-dessous permet de mettre à jour les variables d'environnement utilisateur :
► Afficher le texte
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#4

Message par jguinch »

Salut
EnvUpdate() fonctionne aussi bien sous Windows XP que Seven.
A savoir : la fonction envoie un signal au système pour lui indiquer un changement (des variables d'environnement entre autres).
Les applications qui sont ouvertes à ce moment là ne reçoivent pas ce signal (sauf l'explorer) et ne prendront en compte les modifications qu'à leur prochain lancement (l'exécutable lui-même n'est pas informé de la modification).

Si j'ai bien compris ton problème, pour appliquer les modification à ton programme sans le redémarrer il suffit de faire :

Code : Tout sélectionner

EnvSet("PATH", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PATH"))
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#5

Message par Tlem »

@jguinchard
Si je lit ce que liberte75 nous dit :
liberte75 a écrit :je travail actualement sur l'ajout de quelque variables d'environnement à travers ces lignes:

Code : Tout sélectionner

RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name", "REG_SZ", "value")
    EnvUpdate()
Bon tout marche bien.
Donc la partie écriture dans la base de registre est acquise.
liberte75 a écrit :sauf que lorsque j'execute un fichier .bat à travers mon script creer avec autoit, quelque commande dos semble ne pas etre reconue.
il suffit juste de redemarrer l'ordinateur et reexecuter mon script et tout marche bien.
Donc là, je comprend que le script lance un batch DOS mais que les variables d'environnement ne sembles pas actualisées tant que le PC n'est pas redémarré.
liberte75 a écrit :Est ce qu'il y'a une commande avec autoit pour actualiser la base de registre.
car meme avec EnvUpdate() mes affaires ne marche pas.
On voit ici que l'utilisation de EnvUpdate() ne change rien à ces affaires ...

D’où le code proposé qui est forcément différent de EnvUpdate() sinon il n'aurait pas été créé. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#6

Message par jguinch »

@Tlem.
J'ai bien lu et bien compris la problématique.
J'essayais juste d'expliquer la raison pour laquelle le script .bat n'a pas connaissance de la nouvelle variable.

Pour illustrer mon explication, un petit exemple :

Code : Tout sélectionner

RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "TEST", "REG_EXPAND_SZ", "TEST_VALUE")
MsgBox(0, "", EnvGet("TEST") )   ; Ca ne fonctionne pas
EnvUpdate() ; envoi un message au système pour signaler un changement (seuls les nouveaux programmes sans process parent bénéficient de ces changements)
MsgBox(0, "", EnvGet("TEST") )   ; Ca ne fonctionne toujours pas

EnvSet("TEST", "TEST_VALUE" )  ; On applique la modification pour le script lui-même
MsgBox(0, "", EnvGet("TEST") ) ; OK
Maintenant si on remplace EnvSet(...) par _EnvUpdate("TEST", "TEST_VALUE", False, True) on a le même résultat.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#7

Message par Tlem »

Sauf que ce n'est pas le script qui doit avoir accès à la variable d'environnement, mais le batch qui est lancé.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#8

Message par liberte75 »

Merci les gars de votre implication,
je travail actuellement sur la resolution de la problematique.
je viens de tester

Code : Tout sélectionner

EnvSet("PATH", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PATH"))
il semble marche sauf que j'ai un autre message, lorsque j'execute la fichier .bat
il ne reconnait pas la commande regedit
en principe a la fin de mon fichier .bat j'execute cette commande:
regedit /s %HOST_REG%
qui veut dire ecris en silencieux tout ce que tu as ecris auparavant dans le fichier Host_REG dans le registre
a ce moment la, le fichier .bat ne reconnait pas la commande regedit.
je devrai juste ferme mon fichier exe cree avec autoit, le ree_ouvrir pour que ca marche.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#9

Message par jguinch »

Est-ce que tu pourrais poster tout ou partie du script au3 et la partie du batch qui concerne le problème pour qu'on regarde ?
Quand tu modifies le PATH, est-ce que tu es sûr qu'il contient le chemin vers regedit.exe ?

Finalement, je ne suis pas sûr d'avoir compris le but : est-ce que tu dois vraiment effectuer la modification dans les variables systèmes, ou est-ce que la variable sert uniquement dans le .bat ?

@Tlem
Il est dur en affaires le chef ... :D
Sauf que ce n'est pas le script qui doit avoir accès à la variable d'environnement, mais le batch qui est lancé.
Oui, justement avec EnvSet (ou _EnvUpdate) le batch lancé par Run héritera des variables d'environnement du programme.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#10

Message par liberte75 »

jguinchard a écrit :Est-ce que tu pourrais poster tout ou partie du script au3 et la partie du batch qui concerne le problème pour qu'on regarde ?
Quand tu modifies le PATH, est-ce que tu es sûr qu'il contient le chemin vers regedit.exe ?

Finalement, je ne suis pas sûr d'avoir compris le but : est-ce que tu dois vraiment effectuer la modification dans les variables systèmes, ou est-ce que la variable sert uniquement dans le .bat ?
code dans mon fichier .au3

Code : Tout sélectionner

$result = RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name", "REG_SZ", "value")
    ;EnvSet("CAELIB", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "CAELIB"))
    EnvSet( "CAELIB", "C:\CAE\CAELIB" )
code dans le fichier .bat
exemple d'une cle qu'on veut creer dans le registre
si vous regardez la ligne de code dans le fichier .bat, vous remarquer qu'on sauvegarde cette ligne dans un fichier

Code : Tout sélectionner

echo [HKEY_LOCAL_MACHINE\SOFTWARE\rep\rep1\Simulations\%SHIP_FAMILY%\Links]>>%HOST_REG%
echo.>>%HOST_REG%
Et a la fin on lance cette commande

Code : Tout sélectionner

regedit /s %HOST_REG%
, pour ecrire tout ce qu'on a sauvegarder dans le fichier %HOST_REG% dans la base de registre.
maintenant je viens de retester mon script avec l'ajout de ces lignes dans le script

Code : Tout sélectionner

$result = RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name", "REG_SZ", "value")
    ;EnvSet("name", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name"))
    EnvSet( "name", "value" )

mais ca ne fonctionne pas encore.
j'ai compiler mon fichier.au3 j'execute le ficheir exe bien sure. il ajoute les variables, il execute le fihcier bat avec

Code : Tout sélectionner

RunWait ($var4,"C:\scripts")
$var4 contient le chemin du fichier .bat que je veux executer avec les parametres.
mais ca me donne l'erreur suivante:
'regedit' n'est pas reconnu en tant que commande interne.
une fois je ferme mon exe qui est base sur des fenetre GUI cree avec autoit. je reexecute mon fichier exe tout marche bien.
je ne comprends pas pourquoi je dois ferme mon exe et le reexcuter pour que ca marche.
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#11

Message par liberte75 »

liberte75 a écrit :
jguinchard a écrit :Est-ce que tu pourrais poster tout ou partie du script au3 et la partie du batch qui concerne le problème pour qu'on regarde ?
Quand tu modifies le PATH, est-ce que tu es sûr qu'il contient le chemin vers regedit.exe ?

Finalement, je ne suis pas sûr d'avoir compris le but : est-ce que tu dois vraiment effectuer la modification dans les variables systèmes, ou est-ce que la variable sert uniquement dans le .bat ?
code dans mon fichier .au3

Code : Tout sélectionner

$result = RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name", "REG_SZ", "value")
    ;EnvSet("CAELIB", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name"))
    EnvSet( "name", "value" )
code dans le fichier .bat
exemple d'une cle qu'on veut creer dans le registre
si vous regardez la ligne de code dans le fichier .bat, vous remarquer qu'on sauvegarde cette ligne dans un fichier

Code : Tout sélectionner

echo [HKEY_LOCAL_MACHINE\SOFTWARE\rep\rep1\Simulations\%SHIP_FAMILY%\Links]>>%HOST_REG%
echo.>>%HOST_REG%
Et a la fin on lance cette commande

Code : Tout sélectionner

regedit /s %HOST_REG%
, pour ecrire tout ce qu'on a sauvegarder dans le fichier %HOST_REG% dans la base de registre.
maintenant je viens de retester mon script avec l'ajout de ces lignes dans le script

Code : Tout sélectionner

$result = RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name", "REG_SZ", "value")
    ;EnvSet("name", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "name"))
    EnvSet( "name", "value" )

mais ca ne fonctionne pas encore.
j'ai compiler mon fichier.au3 j'execute le ficheir exe bien sure. il ajoute les variables, il execute le fihcier bat avec

Code : Tout sélectionner

RunWait ($var4,"C:\scripts")
$var4 contient le chemin du fichier .bat que je veux executer avec les parametres.
mais ca me donne l'erreur suivante:
'regedit' n'est pas reconnu en tant que commande interne.
une fois je ferme mon exe qui est base sur des fenetre GUI cree avec autoit. je reexecute mon fichier exe tout marche bien.
je ne comprends pas pourquoi je dois ferme mon exe et le reexcuter pour que ca marche.
je veux juste ajouter une chose si j'ouvre une commande dos avec CMD, et je tape regedit l'editeur s'ouvre sans aucun probleme ca veut dire que les commandes dos sont reconnu. car C:\Windows est deja ajouter dans le path.
Modifié en dernier par liberte75 le dim. 10 mars 2013 22:55, modifié 1 fois.
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#12

Message par liberte75 »

je crois que j'ai compris c'est quoi la source du probleme:
A certain moment dans mon script je dois ajouter une valeur dans le path qui contient deja des valeurs que je veux pas perdre, alors je fais ca:

Code : Tout sélectionner

$var = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Path")
    $var &= ";C:\rep\rep1"
    $result = RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "Path", "REG_EXPAND_SZ", $var)
    ;EnvSet("PATH", RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PATH"))
    EnvSet("PATH", $var )
    EnvUpdate()
je crois que lorsque je lance RegWrite a nouveau, le fichier .exe perd le chemin de c:\windows, il faut le ferme pour aller lire a nouveau le path, c'est pour cette raison que ca marche lorsque je relance pour la 2eme fois.
juste une piste je ne sais pas est ce que c'est vrai ou pas?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#13

Message par Tlem »

jguinchard a écrit :Oui, justement avec EnvSet (ou _EnvUpdate) le batch lancé par Run héritera des variables d'environnement du programme.
Je n'avais pas lu la dernière ligne de votre message. :oops:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#14

Message par jguinch »

La partie qui concerne le PATH a l'air correcte.
Attention, à force d'exécuter le script, le PATH va ressembler à xxxx;xxxx;C:\rep\rep1C:\rep\rep1C:\rep\rep1C:\rep\rep1C:\rep\rep1C:\rep\rep1
Par contre, les chemins d'origine sont conservés (dont c:\windows)

Pour tester, il faudrait ajouter dans le .bat les lignes suivantes pour voir la valeur du PATH dans la console DOS :

Code : Tout sélectionner

cls
echo %PATH%
pause
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#15

Message par liberte75 »

salut
je viens de tester a nouveau mon script, en ajoutant les 3 lignes dans le fichier .bat:
Apres l'execution de mon fichier .exe cree avec autoit, la reponse du fichier .bat est la suivante:

- C:\rep\programs\prog\Release;%GrROOT%\bin\%GrMODE%;%GrROOT%\WinX\bin\%GrMODE%;;C:
\Program Files\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
;%CAE_ACS2_HOME%\Bin;C:\rep\rep1 Appuyez sur une touche pour continuer...

la derniere valeur "C:\rep\rep1", c'est la valeur que je veux ajouter, on voit qu'il est la.
y'a autre chose aussi, sur la console de mon fichier .bat je recois les messages d'erreur suivante :

Removing read-only attributes...
'attrib' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.


'regedit' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.

Mais une fois j'arrete mon exe et je le rexcute une autre fois, tout marche bien(meme pas besoin de redemarrer), y'a qlq chose qui ne s'actualise pas pour faire reconnaitre les commande attrib et regedit, lors de l'execution de mon fichier .exe la 1ere fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#16

Message par jguinch »

Ah oui, c'est normal finalement... :oops:
Il faut ajouter AutoItSetOption ("ExpandEnvStrings", 1) avant la fonction EnvSet (ou en début de script).
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
liberte75
Niveau 4
Niveau 4
Messages : 51
Enregistré le : mar. 29 janv. 2013 14:39
Status : Hors ligne

Re: [..] Actualiser la base de registre sans redemarrer

#17

Message par liberte75 »

Je viens de tester mon script avec
AutoItSetOption ("ExpandEnvStrings", 1)
inclut au debut de mon script et ca marche!!!!
Merci jguinchard
et tous ceux qui ont participé à la rèsolution de ce probleme.
Répondre