Page 1 sur 1

[R] Actualiser la base de registre sans redemarrer

Posté : mer. 06 mars 2013 22:59
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

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

Posté : jeu. 07 mars 2013 00:16
par sksbir
bonjour

ça ne marche pas, parce qu'il faut utiliser la fonction envset pour modifier une variable d'environnement ( puis envupdate).

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

Posté : jeu. 07 mars 2013 08:22
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

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

Posté : jeu. 07 mars 2013 10:21
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"))

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

Posté : jeu. 07 mars 2013 15:09
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:

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

Posté : jeu. 07 mars 2013 15:44
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.

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

Posté : jeu. 07 mars 2013 16:26
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é.

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

Posté : jeu. 07 mars 2013 18:13
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.

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

Posté : jeu. 07 mars 2013 21:23
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.

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

Posté : jeu. 07 mars 2013 22:10
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.

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

Posté : jeu. 07 mars 2013 22:35
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.

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

Posté : jeu. 07 mars 2013 22:43
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?

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

Posté : jeu. 07 mars 2013 23:00
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:

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

Posté : jeu. 07 mars 2013 23:10
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

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

Posté : ven. 08 mars 2013 17:40
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.

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

Posté : ven. 08 mars 2013 21:37
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).

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

Posté : lun. 11 mars 2013 17:37
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.