[R] Ecrire dans le registre le contenu d'un fichier texte

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

[R] Ecrire dans le registre le contenu d'un fichier texte

#1

Message par Vins83 »

Salut à tous !!

Voilà mon probleme que je rencontre pour mes programmes..
La durée de ceux ci peu durer de 10 minutes a des heures et le probleme est que si la mise en veille prolongé est activé,l'opération ne peu se finir donc:

Je crée une sauvegarde des parametres étant sur l'ordinateur:

Code : Tout sélectionner

FileDelete ( " Désactiver la mise en veille prolongée.txt " )
$file = FileOpen ( " Désactiver la mise en veille prolongée.txt " , 1 )
$var = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , ' " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " ' )
FileWrite ( $file , ' , " Heuristics " ' )
FileWrite ( $file , ' , " ' & $var & ' " ' & @CRLF )
$var1 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , ' " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " ' )
FileWrite ( $file , ' , " Heuristics " ' )
FileWrite ( $file , ' , " ' & $var1 & ' " ' & @CRLF )
FileClose ( $file )


ensuite il faut bien sur que je supprime ces valeurs pour désactiver la mise en veille:

Code : Tout sélectionner

; Supprime la mise en veille prolongé
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )


Maintenant une fois que mon programme c'est fini,il faut que je remette les parametre a l'identique (plutot logique),et c là que je rame....

Que faire?

Lire le texte et copier le contenu dans le registre?

Si vous avez une idée,je suis preneur..
Modifié en dernier par Vins83 le lun. 29 oct. 2007 07:14, modifié 1 fois.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#2

Message par sylvanie »

Salut,

ta question est étonante, car elle comporte déjà la réponse ...
oui effectivement je ferai ainsi.

du moins il faut prendre un moyen de stockage physique comme tu le fait (écriture en fichier), mais surtout pas en variable en RAM durant la vie du programme, car si ta machine à une coupure ou ton programme reçoit un kill-9, on aura perdu le contenu de ces clés.

Si le fichier text paraît dérangenant, on peux utiliser à la place une clé de registre en backup pour chacune de celles qui vont se faire détruiure. Par exple créer HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power\Heuristics_bckup et l'autre calée sur le même modèle

pour la restauration de fin par contre, je suggère de l'inclure dans une fonction de sortie:

Code : Tout sélectionner

autoitsetoption("Onexitfunc","My_Exit")

ton prog


func My_Exit()
   recopie des backup vers les vraie clé
   destruction des backup
Endfunc
du coups, si ton programme est arrêté autrement que par un kill 9 ou une coupure de courrant, tu es sûr que la restauration du backup est éxécutée (même en cas de reboot anormale de la machine)
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#3

Message par Tlem »

Personnellement, je préfèrerais la sauvegarde des paramètres dans un fichier .reg, puis la mise en place d'une valeur de remise en place de la sauvegarde dans la clé RunOnce (en cas de Kill9, coupure EDF ...).
[codee=reg][HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx][/codee]


Si le prog s'exécute correctement, remise en place des valeurs sauvegardées, puis suppression de la clé RunOnce.

La remise en place des valeurs sera effectuée par un simple :

Code : Tout sélectionner

regedit  /S SAV.reg
Voici le format d'un fichier .reg :

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power]
"Heuristics"=hex:05,00,00,00,00,01,01,00,74,9d,00,00,f0,00,00,00,a7,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power]
"Heuristics"=hex:05,00,00,00,00,01,01,00,74,9d,00,00,f0,00,00,00,a7,00,00,00
 
Pour info, il est possible de supprimer des valeurs de base de registre comme ceci :

Code : Tout sélectionner

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power]
"Heuristics"=-

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power]
"Heuristics"=-
PS : Pour information, sur un de mes PC, la clé HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001 n'existe pas.
Par contre, j'ai les clés :
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003

et
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004
dans lesquelles on retrouve la valeur ...Control\Session\Manager\Power\Heuristics
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
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

#4

Message par Vins83 »

ON va dire que c'est résolu de cette maniere,mais si je trouve mieux,je posterais a nouveau:

Code : Tout sélectionner

_sauvegardemiseenveilleprolonge ( )
; fonction sauvegarder le registre de Désactiver la mise en veille prolongée
Func _sauvegardemiseenveilleprolonge ( )
If Not IniReadSection ( " lang.ini " , " Settings " ) = 0 Then
$file = FileOpen ( " lang.ini " , 1 )
FileWrite ( $file , @CRLF & " [Settings] " & @CRLF )
$var0 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 0 = " & $var0 & @CRLF )
$var1 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 1 = " & $var1 & @CRLF )
$var2 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 2 = " & $var2 & @CRLF )
$var3 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 3 = " & $var3 & @CRLF )
$var4 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " )
FileWrite ( $file , " 4 = " & $var4 & @CRLF )
FileClose ( $file )
EndIf
EndFunc ; == >_sauvegardemiseenveilleprolonge
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " )
RegDelete ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " )
_reinstallerlamiseenveilleprolonge ( )
; fonction reinstaller la mise en veille prolongé
Func _reinstallerlamiseenveilleprolonge ( )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 0 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 1 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 2 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 3 " , " " ) )
RegWrite ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " , " REG_BINARY " , IniRead ( " lang.ini " , " Settings " , " 4 " , " " ) )
EndFunc ; == >_reinstallerlamiseenveilleprolonge
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#5

Message par Tlem »

Pourquoi faites vous 6 accès au fichier, alors qu'un seul suffit ?

Code : Tout sélectionner

If Not IniReadSection ( " lang.ini " , " Settings " ) = 0 Then
$var0 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , " Heuristics " )
$var1 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Power " , " Heuristics " )
$var2 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Power " , " Heuristics " )
$var3 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\Session Manager\Power " , " Heuristics " )
$var4 = RegRead ( " HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Session Manager\Power " , " Heuristics " )
$file = FileOpen ( " lang.ini " , 1 )
FileWrite ( $file , " [Settings] " & @CRLF & " 0 = " & $var0 & @CRLF & " 1 = " & $var1 & @CRLF & " 2 = " & $var2 & " 3 = " & $var3 & @CRLF & " 4 = " & $var4 & @CRLF )
FileClose ( $file )
EndIf
Ce code ne peut fonctionner à cause des espaces parasites dans le chemin de clé et le nom de la clé ("Heuristique").

De plus, si la clé n'existe pas sur la machine hôte, ce qui est mon cas pour ControlSet001, la valeur de retour, sera vide, et donc lors de la remise en place des clés, ControlSet001 sera créer mais ne contiendra rien !!!

Un exemple d'optimisation donnerait :

Code : Tout sélectionner

If Not IniReadSection ( "lang.ini" , "Settings" ) = 0 Then
Dim $SKey = "Heuristics" , $var = "[Settings]" & @CRLF
$var0 = RegRead ( " HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power " , $SKey )
If $var0 <> " " Then $var & = " 0 = " & $var0 & @CRLF
$var1 = RegRead ( " HKLM\SYSTEM\ControlSet001\Control\Session Manager\Power " , $SKey )
If $var1 <> " " Then $var & = " 1 = " & $var1 & @CRLF
$var2 = RegRead ( " HKLM\SYSTEM\ControlSet002\Control\Session Manager\Power " , $SKey )
If $var2 <> " " Then $var & = " 2 = " & $var2 & @CRLF
$var3 = RegRead ( " HKLM\SYSTEM\ControlSet003\Control\Session Manager\Power " , $SKey )
If $var3 <> " " Then $var & = " 3 = " & $var3 & @CRLF
$var4 = RegRead ( " HKLM\SYSTEM\ControlSet004\Control\Session Manager\Power " , $SKey )
If $var4 <> " " Then $var & = " 4 = " & $var4 & @CRLF
$file = FileOpen ( "lang.ini" , 1 )
FileWrite ( $file , $var )
FileClose ( $file )
EndIf
Edit : Je vois qu'en fait, c'est ForumColor qui rajoute les espaces indésirables ...
Aller hop, un ptit post là ou il faut.
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é".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#6

Message par ani »

y a surement une petite commande sous dos qui permet de stopper la mise en veuille prolongé (c'est un élément du panneau des options d'alimentation) comme je te l'avait signalé vins, mais vu que de mon coté je débute... je ne pourrait fournir une réponse pour cette fois-ci..
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#7

Message par Tlem »

Bien vu ani.

En cherchant un peut avec Google, j'ai trouvé ceci :
powercfg -h off Pour désactiver la mise en veille prolongée.
powercfg -h on Pour la réactivée.

Et ceci pour la mise en veille tout cours : http://www.laboratoire-microsoft.org/t/23215/

Sinon, encore mieux :

Code : Tout sélectionner

Powercfg -h off
Powercfg /setactive "Toujours actif"
Le nom du schéma en cours peut être récupérer de 2 manières :

Code : Tout sélectionner

Powercfg -q
Mais il faudra filtrer le résultat (4iem ligne)

Ou alors plus simple :
Lecture de la valeur [HKEY_CURRENT_USER\Control Panel\PowerCfg]
"CurrentPowerPolicy"="1"

qui renvoie sur :
[HKEY_CURRENT_USER\Control Panel\PowerCfg\PowerPolicies\1]
"Name"="Ordinateur portable"


PS: j'ai tenté de modifier directement dans la base de registre : CurrentPowerPolicy
Mais ca ne fonctionne pas ...
Il faut donc passer par la commande Powercfg
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
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

#8

Message par Vins83 »

je vais essayer de passer ça par un run ou un truc du genre,j'ai pas encore eu le temps de tester

run ("powercfg -h off")
sergio
Niveau 2
Niveau 2
Messages : 25
Enregistré le : jeu. 25 oct. 2007 16:14
Status : Hors ligne

#9

Message par sergio »

hello une petite precision sur l'utilisation de la base de registre.
la clé qui est lue lors du l'execution du systeme est dans la partie CurrentControlSet

les autres CurrentControlSet 1,2,3 sont des sauvegardes et par consequent ne sont pas lues.
Donc tu peux alleger ton script en ne mentionant pas ces clés (meme si un copié collé est rapide)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#10

Message par Tlem »

Merci de cette précision sergio.

Cela permet effectivement d'alléger le code, et l'exécution de celui-ci.
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
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

#11

Message par Vins83 »

Merci pour ta réponse sergio,sa fait bien avancé mon chimiliblique..
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

#12

Message par ani »

y a surement une solution moins hardu

solution 1 : changer le temp de x minute en jamais et reinitialiser en fin de programme
solution 2 : ajouter le programme dans les composant de réveil

ou trouver la manière qu'utilise win lors d'un installation ou d'un soft de scanviri il met en veille la machine et pourtant il continu son opération ? non ?


vu que je me suis levé tot je vais chercher un peu .
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

#13

Message par arrkhan »

je déterre car je me suis retrouvé confronté au problème et je l'ai résolu....

la valeur a regarder est bien: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power\Heuristics.
mais il ne faut s'interresser qu'aux 16 premier octets et les récupérer comme suit: StringLeft(RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power", "Heuristics"), 16)

sous XP Pro, Home et Win 2000, 0500000000010000 indique que la mise en veille est inactive et 0500000000010100 qu'elle est activée.

Sous Vista, la mise en veille prolongée est activée par défaut et la donnée est 0600000000010100, je ne peux pas la désactiver (émulation VPC07) mais on peut légitimement pensé qu'il s'agit de 0600000000010000.

il suffit donc de récupérer les données pour voir si la veille prolongée est active ou non et utiliser le "powercfg /h ...." approprié.

/!\ Attention, sous Vista, il faudra avoir les droits "Super Administrateur" pour utiliser "powercfg /h ..." avec #RequireAdmin.
Répondre