Page 1 sur 1
[..] Problème avec EnvUpdate()
Posté : lun. 16 août 2010 16:04
par keltharak
Bonjour,
J'ai un souci avec la fonction EnvUpdate(). L'idée est de créer une variable d'environnement machine et de la lire dans le même script. Pour la création pas de problème, j'ajoute une valeur dans la clé de registre qui va bien ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment") et ça fonctionne. Mais pour utiliser ensuite cette variable dans mon script, là ça coince...
Voici mon code (je n'ai gardé que la partie sur cette variable):
► Afficher le texte
Code : Tout sélectionner
Func setEnvVar($var, $val)
$result = RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", $var, "REG_SZ", $val)
If $result = 1 Then
EnvUpdate()
If @error Then MsgBox(16, "Erreur", "echec du EnvUpdate()")
Else
MsgBox(16, "Erreurr :", "echec du set de la variable")
Exit
EndIf
Return True
EndFunc
Func delEnvVar($var)
RegDelete("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", $var)
EnvUpdate()
If @error Then MsgBox(16, "Erreur", "echec du EnvUpdate()")
Return True
EndFunc
Func AfficheVar($var)
$getVar = EnvGet($var)
MsgBox(0, $var & " :", "[" & $getVar & "]")
EndFunc
$MyVar = "Test_variable"
AfficheVar($MyVar)
setEnvVar($MyVar, "blablabla")
AfficheVar($MyVar)
delEnvVar($MyVar)
AfficheVar($MyVar)
Mes 3 affichages restent désespérément vide, alors que j'ai bien un EnvUpdate() après chaque ajout ou suppression de la variable. Et si je fait un "set" dans une fenetre msdos avant la suppression de la variable je la vois sans problème. (ça ne raffraichi pas non plus les fenêtres msdos déja lancés avant mon programme)
J'imagine que je n'utilise pas cette fonction correctement mais je ne vois pas comment la.
Merci d'avance.
Re: [..] Problème avec EnvUpdate()
Posté : lun. 16 août 2010 16:40
par SrBelial
plutôt qu'utiliser l'écriture dans le registre, utilise directement la fonction EnvSet($var, $val)
j'ai testé et ça marche ...
edit : ou alors fais tout en passant par RegWrite et RegRead ....
Re: [..] Problème avec EnvUpdate()
Posté : lun. 16 août 2010 17:06
par keltharak
Le problème de SetEnv c'est que ça crée une variable utilisateur non ?
Pour la lecture de la variable par le registre j'y ai pensé, mais ce que je n'aime pas dans cette idée c'est qu'on ne teste pas tout à fait le même mécanisme, c'est peut-être infondé comme crainte mais je trouve plus propre de lire la même information que ce que lirons mes autres programmes ensuite. Mais si je ne trouve pas d'autre solution c'est surement ce que je ferai.
Je suis entrain de chercher sur le forum anglais (j'aurai effectivement du commencer par la mais je n'ai pas le réflexe désolé) et c'est très curieux car les programmeurs semble dire que la fonction EnvUpdate marche bien si l'on veut actialisé la liste des variable d'environnement du process autoit...
► Afficher le texte
Code : Tout sélectionner
$key = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$val = "PATH"
$PATH = RegRead($key, $val)
$sAddThisPath = "C:\my new path\"
$PATH = $PATH & ";" & $sAddThisPath
RegWrite($key,$val,"REG_EXPAND_SZ",$PATH)
EnvUpdate()
C'est un exemple du forum anglais (
ici), j'ai rajouté une msgbox à la fin pour afficher le path et bien ça ne marche pas non plus chez moi. je commence à me demander si le problème ne vient pas de mon PC...
Re: [..] Problème avec EnvUpdate()
Posté : lun. 16 août 2010 17:43
par SrBelial
je te rassure, ton exemple ne marche pas non plus chez moi, sauf si j'utilise EnvSet() au lieu de RegWrite() ...
donc soit le problème vient du fait que ce n'est pas la bonne clé, soit ça vient d'ailleurs ...
d'ailleurs pour être plus précis, EnvSet crée une variable d'environnement temporaire : elle ne sera lisible que par les programmes lancés depuis le script autoit !!! (via la commande run notamment) ...
une fois le script fini, la variable n'existe plus ....
si tu tiens à passer par la base de registre, une bonne idée serait de créer une variable à la main, l'exporter dans un fichier .reg, et ensuite copier/coller le chemin de la clé pour être sur que tu as le bon chemin dans le script ....
essaie peut-être en changeant le type de valeur que tu crée dans le registre ...
EDIT : en fait c'est pas la création de la variable qui gène, j'ai regardé, c'est le EnvGet() qui marche pas !
Re: [..] Problème avec EnvUpdate()
Posté : mar. 17 août 2010 09:01
par keltharak
OK ! Merci beaucoup pour ton aide précieuse ! En fin de compte je vais donc lire ma variable directement dans le registre, je ne vois pas d'autre solution.
Hum... je pense que c'est le envupdate qui ne marche pas plutot.
Si je fais un :
Code : Tout sélectionner
Opt("ExpandEnvStrings", 1)
...
MsgBox(0, "%Test_variable%", "%temp%")
%temp% est remplacé mais pas %Test_variable%. Maintenant si je fais :
Temp est bien reconnu mais Test_variable reste vide.
Re: [..] Problème avec EnvUpdate()
Posté : mar. 17 août 2010 15:43
par SrBelial
non le envupdate fonctionne comme il faut !
j'ai testé ainsi :
* ajout de la clé dans le registre
* appel à envupdate
* regardé les variables d'environnement directement depuis les propriétés du poste de travail
=> la variable existait bien, mais n'était simplement pas visible par envget()
Re: [..] Problème avec EnvUpdate()
Posté : mer. 18 août 2010 00:29
par Tlem
En fait,
EnvUpdate() fonctionne parfaitement, le seul problème, c'est que lorsque vous lancez le script, la variable d'environnement à une valeur. Pour le système elle est mise à jour pour toute nouvelle session d'un programme, mais ceux qui sont en cours de fonctionnement, ne voient pas cette mise à jour ... Y compris le script en cours.
Essayez de lancer deux fois un script de modification d'une variable d'environnement et vous verrez que sur le deuxième lancement elle sera mise à jour.

Re: [..] Problème avec EnvUpdate()
Posté : mer. 18 août 2010 19:20
par SrBelial
hé bien voila qui éclaircit les choses même pour moi ^__^
merci thierry !