Page 1 sur 2
[R] Execution planifiée jours de la semaine/plage horaire
Posté : lun. 11 mai 2009 18:52
par Julien
Bonsoir,
Je suis en train de faire un petit script qui doit tournée du lundi au vendredi de 07h10 à 17h30 afin d'actualiser l'affichage dans un logiciel. Dans cette plage horaire je dois exécuter une action (une seule fois dans la journée) puis une action toutes les 2 minutes et une autre toutes les 40 minutes.
J'ai écrit un bout de code qui me parait bien mais j'aimerais avoir votre avis.
Le voici :
► Afficher le texteCode
Code : Tout sélectionner
#include <Date.au3>
#NoTrayIcon
HotKeySet("{ESC}","Exit_ESC") ; Pour arreter le script en cas de besoin
Global $nbM = 0, $nbC = 0
Local $window = "Fenetre_Prog"
While 1
If @WDAY > 1 And @WDAY < 7 Then ; Du lundi au vendredi
If @HOUR > "07" And @MIN > "10" Then ; A partir de 07h10
BlockInput(1) ; Verouillage du clavier et de la souris
If WinExists($window) Then ; Si la fenêtre existe
WinActivate($window, "") ; Focus su la fenêtre
If $nbC <> 1 Then ; Logon avant poursuite à éxécuter 1 seule fois
; Actions de logon
; Déplacement souris + click
; Identification
; Ouverture de l'onglet
EndIf
If Not @HOUR < "17" And Not @MIN < "30" Then ; jusqu'à 17h30
If $nbM <> 40 Then ; Si $nbm <> 40 (minutes)
; Actions d'actualisation
; Déplacement souris + click
; Comparaison de résultat
; Beep en cas de différence
Sleep(120000) ; 2 minutes avant prochaine actualisation
$nbM = $nbM + 2
Else ; Sinon
; Actions de simulation
; Déplacement souris + click
Sleep(60000) ; 1 minute pour lui laisser le temps de finir son action
$nbM = 0
EndIf
Else
$nbC = 0 ; Pour réexecution du lendemain
EndIf
Else
BlockInput(0)
MsgBox(16,"Erreur","La fenêtre n'existe pas.")
Exit
EndIf
Else
BlockInput(0)
EndIf
Else
BlockInput(0)
EndIf
wend
Func Exit_ESC()
Exit 0
EndFunc
Edit : petites modifications
Edit : Correction des "sleep"
D'avance merci.
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : lun. 11 mai 2009 18:59
par Yogui
Franchement pour un script qui doit se lancer tout les jours hors week end j'utilise la commande DOS AT pour le lancer
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : lun. 11 mai 2009 19:05
par Julien
Je ne peux tester que pendant la journée et j'ai essayé la commande AT mais elle ne fonctionne pas. (chez moi oui pour mes backups)
Je n'ai pas accès à la configuration des postes.
En revanche je sais qu'en utilisateur j'ai bien le retour des dates et heures, d'où ce script.
Sinon pensez vous que cela réponde à mon besoin ? trop lourd ? trop gourmand ? n'importe quoi ?
Merci
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : lun. 11 mai 2009 19:28
par Yogui
Comme ça je ne suis pas certain que les sleeps soit correcte 1 seconde = sleep(1000) donc 1 minutes sleep(60000)
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : lun. 11 mai 2009 19:33
par Julien
J'ai corrigé. merci.
Si vous avez d'autres commentaires je suis toujours "preneur" !
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : lun. 11 mai 2009 23:16
par Tlem
En essayant d'être le plus complet possible, voici une autre solution.
Il vous faudra récupérer l'UDF _Adlib.au3 disponible
ici.
► Afficher le texte
Code : Tout sélectionner
#include <Date.au3>
#Include '_Adlib.au3'
#NoTrayIcon
HotKeySet("{ESC}","Exit_ESC") ; Pour arreter le script en cas de besoin
Global $nbM = 0, $nbC = 0
Local $window = "Fenetre_Prog"
$LogFile = "MonScript.log"
While 1
If @WDAY > 1 And @WDAY < 7 Then ; Du lundi au vendredi
If @HOUR & @MIN >= 0710 And @HOUR & @MIN <= 1730 Then ; Test de la plage horaire.
BlockInput(1) ; Verouillage du clavier et de la souris
If $nbC = 0 and MonProgActif() Then ; Action à exécuter une seule fois si $nbC=0 et MonProgActif()=1
;
; Votre Action Ici
;
$nbC = 1
Else
FileWriteLine($LogFile, "L'action X n'à pas pu être exécutée le " & _NowDate() & " à " & _NowTime() & @CRLF) ; Fichier LOG
EndIf
_AdlibEnable("Action40Mn", 2400000) ; Action d'exécution toute les 40 mn
_AdlibEnable("Action02Mn", 120000) ; Action d'exécution toute les 02 mn
Else
BlockInput(0)
$nbC = 0 ; Remise à zéro du compteur pour la prochaine exécution
EndIf
Else
BlockInput(0)
_AdlibDisable() ; Désactivation des deux timer.
EndIf
Sleep(250) ; Petite pause pour soulager le CPU.
wend
Func Action40Mn() ; Fonction à exécuté toutes les 40Mn
If MonProgActif() Then
;
; Code
;
Else
FileWriteLine($LogFile, "L'action 40mn n'à pas pu être exécutée le " & _NowDate() & " à " & _NowTime & @CRLF) ; Fichier LOG
EndIf
EndFunc
Func Action02Mn() ; Fonction à exécuté toutes les 02Mn
If MonProgActif() Then
;
; Code
;
Else
FileWriteLine($LogFile, "L'action 02mn n'à pas pu être exécutée le " & _NowDate() & " à " & _NowTime & @CRLF) ; Fichier LOG
EndIf
EndFunc
Func MonProgActif()
Local $Res = 0
If WinExists($window) Then ; Si la fenêtre existe
$Res = WinActivate($window, "") ; Focus su la fenêtre
EndIf
Return $Res
EndFunc
Func Exit_ESC()
Exit 0
EndFunc
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mar. 12 mai 2009 18:25
par Julien
Bonsoir,
Merci pour toutes ces informations.
J'ai pu essayé ce script aujourd'hui, j'ai corrigé quelques erreurs mais je trouve que les timing d'exécution ne sont pas respectés.
Pour utiliser les fonctions _AdlibEnable("Action40Mn", 40000) il faut bien mettre en millisecondes ?
Pour 40 minutes il faudrait pas mettre 2400000 ? et pour 2 minutes, 120000 ?
Merci.
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mar. 12 mai 2009 23:01
par Tlem
Arf, le piège de débutant.
J'étais trop concentré sur votre sujet et un autre, que je n'ai pas réfléchit correctement.
Mais effectivement c'est bien des millisecondes qu'il faut mettre et donc les valeurs que vous donnez sont exactes.
Désolé.

Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 07:26
par Julien
Pas de problème, ça m'a obligé à chercher comment ça fonctionne avant de faire bêtement un copier/coller ! c'est très bien.
Une autre petite chose, il manque les () à _NowTime() sinon erreur lors de la compilation.
Je test tout ça aujourd'hui.
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 07:39
par Tlem
J'ai édité le code pour corriger les erreurs.
Il devrait pouvoir fonctionner tel quel.

Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 08:12
par Julien
ok, il est lancé.
je vais tester.
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 10:49
par Julien
alors,
j'ai l'impression qu'il n'incrémenta pas ma variable $nbC pour l'action unique en début de journée.
du coup il tourne en boucle sur la première étape mais il ne va pas plus loin.
je n'arrive pas non plus à incrémenter les lignes dans le fichier de log, d'ailleurs une petite erreur en début de code : $LogFile = FileOpen("Log.log", 1)
j'ai rajouté FileOpen
une idée ?
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 13:13
par Julien
J'ai apporté une petite modification en n'initialisant pas $nbC
global $nbC
avec des msgbox je constate que l'état change bien de vide à 1, par contre les actions 2 minutes et 40 minutes ne semble pas s'exécuter.
j'ai l'impression que les deux actions ne sont pas lues. Ça répète juste la première boucle.
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 13:48
par Julien
Nouveau test.
Bon en fait le début fonctionne correctement. à priori.
Et les deux actions (02 & 40 minutes) sont bien lancées, mais l'une derrière l'autre en continue. Extrait du fichier de Log :
Début de process le 13/05/2009 à 13:38:10
Taskkill le 13/05/2009 à 13:38:10
Run SC le 13/05/2009 à 13:38:12
Ouverture file d'attente le 13/05/2009 à 13:39:12
Run Action02Mn le 13/05/2009 à 13:39:18
Run Action40Mn le 13/05/2009 à 13:39:18
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:18
Run Action02Mn le 13/05/2009 à 13:39:18
Run Action40Mn le 13/05/2009 à 13:39:18
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:19
Run Action02Mn le 13/05/2009 à 13:39:19
Run Action40Mn le 13/05/2009 à 13:39:19
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:19
Run Action02Mn le 13/05/2009 à 13:39:19
Run Action40Mn le 13/05/2009 à 13:39:19
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:19
Run Action02Mn le 13/05/2009 à 13:39:19
Run Action40Mn le 13/05/2009 à 13:39:19
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:19
Run Action02Mn le 13/05/2009 à 13:39:19
Run Action40Mn le 13/05/2009 à 13:39:19
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:20
Run Action02Mn le 13/05/2009 à 13:39:20
Run Action40Mn le 13/05/2009 à 13:39:20
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:20
Run Action02Mn le 13/05/2009 à 13:39:20
Run Action40Mn le 13/05/2009 à 13:39:20
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:20
Run Action02Mn le 13/05/2009 à 13:39:20
Run Action40Mn le 13/05/2009 à 13:39:20
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:20
Run Action02Mn le 13/05/2009 à 13:39:20
Run Action40Mn le 13/05/2009 à 13:39:20
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:21
Run Action02Mn le 13/05/2009 à 13:39:21
Run Action40Mn le 13/05/2009 à 13:39:21
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:21
Run Action02Mn le 13/05/2009 à 13:39:21
Run Action40Mn le 13/05/2009 à 13:39:21
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:21
Run Action02Mn le 13/05/2009 à 13:39:21
Run Action40Mn le 13/05/2009 à 13:39:21
L'action 1036 n'à pas pu être exécutée le 13/05/2009 à 13:39:21
Run Action02Mn le 13/05/2009 à 13:39:21
Run Action40Mn le 13/05/2009 à 13:39:21
J'ai bien récupéré le _Adlib.au3 et placé dans le même dossier pour la compilation. pas d'erreur signalé par autoit.
J'ai quand même l'impression qu'il ne fait que passer sur les ligne :
FileWriteLine($LogFile, "Run Action02Mn le " & _NowDate() & " à " & _NowTime() & @CRLF) ; Fichier LOG
_AdlibEnable("Action02Mn", 120000) ; Action d'exécution toute les 02 mn
FileWriteLine($LogFile, "Run Action40Mn le " & _NowDate() & " à " & _NowTime() & @CRLF) ; Fichier LOG
_AdlibEnable("Action40Mn", 2400000) ; Action d'exécution toute les 40 mn
parce qu'il ne m'active pas la fenêtre indiqué dans la fonction Action02Mn/Action40Mn
Auriez-vous une idée ?
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 17:23
par Tlem
Oui, je sais pourquoi, encore une fois, précipitation et réflexion ne font pas bon ménages.
C'est lié aux deux _AdlibEnable qui sont activé à chaque fois dans la boucle.
Je regarde ça se soir et j'essaie de faire quelque chose d'un peut plus réfléchit.

Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 18:22
par Julien
C'est sympa que tu prennes de ton temps ! je vois que tu es toujours hyper actif sur ce forum.
Pour info et parce que je devais faire tourner quelque chose aujourd'hui j'ai utilisé un combiné de mon premier jet et ton premier script.
Ça tourne mais c'est pas très optimisé et j'ai encore quelques améliorations à apporter.
Ceci dit ton code est beaucoup plus clair que le mien donc si tu corrige (au moins pour voir comment ça fonctionne parce que j'y ai passé un bon moment cet après-midi sans trouver de solution) je suis intéressé.
Merci
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : mer. 13 mai 2009 22:18
par Tlem
Bon, avec un peut de temps et quelques tests, voici pour moi le script final

:
► Afficher le texteWeek Timer
Code : Tout sélectionner
#include <Date.au3>
#Include '_Adlib.au3'
#NoTrayIcon
HotKeySet("{ESC}","Exit_ESC") ; Pour arreter le script en cas de besoin
Global $nbM = 0, $nbC = 0, $Timer = 0
Local $window = "Fenetre_Prog"
$LogFile = "MonScript.log"
While 1
If @WDAY > 1 And @WDAY < 7 Then ; Du lundi au vendredi
If @HOUR & @MIN >= 0710 And @HOUR & @MIN <= 1730 Then ; Test de la plage horaire.
BlockInput(1) ; Verouillage du clavier et de la souris
If $nbC = 0 Then ; Action à exécuter une seule fois si $nbC=0
If MonProgActif() Then ; Si la fenêtre est bien détectée (MonProgActif()=1)
;
; Votre Action Ici
;
$nbC = 1 ; Pour ne pas ré-executer le code.
Else
FileWriteLine($LogFile, "L'action X n'à pas pu être exécutée le " & _NowDate() & " à " & _NowTime() & @CRLF) ; Fichier LOG
$nbC = 1 ; Pour éviter de boucler le test (l'action sera relancée lors de la prochaine plage horaire).
EndIf
EndIf
If $Timer = 0 Then ; On regarde si les timers ont été activés.
_AdlibEnable("Action40Mn", 2400000) ; Action d'exécution toute les 40 mn (2400000 ms)
_AdlibEnable("Action02Mn", 120000) ; Action d'exécution toute les 02 mn (120000 ms)
$Timer = 1 ; Flag pour ne pas réactiver les timers à chaque tour de boucle.
EndIf
Else
BlockInput(0)
_AdlibDisable() ; Désactivation des deux timer.
$Timer = 0 ; Flag pour signaler que les timers sont désactivés.
$nbC = 0 ; Remise à zéro du compteur pour la prochaine exécution
EndIf
Else
BlockInput(0)
EndIf
Sleep(500) ; Petite pause pour soulager le CPU.
wend
Func Action40Mn() ; Fonction à exécuté toutes les 40Mn
If MonProgActif() Then
;
; Code
;
Else
FileWriteLine($LogFile, "L'action 40mn n'à pas pu être exécutée le " & _NowDate() & " à " & _NowTime() & @CRLF) ; Fichier LOG
EndIf
EndFunc
Func Action02Mn() ; Fonction à exécuté toutes les 02Mn
If MonProgActif() Then
;
; Code
;
Else
FileWriteLine($LogFile, "L'action 02mn n'à pas pu être exécutée le " & _NowDate() & " à " & _NowTime() & @CRLF) ; Fichier LOG
EndIf
EndFunc
Func MonProgActif()
Local $Res = 0
If WinExists($window) Then ; Si la fenêtre existe
WinActivate($window, "") ; Focus sur la fenêtre
$Res = WinActive($window, "") ; Vérifie que la fenêtre du prog à le focus.
EndIf
Return $Res
EndFunc
Func Exit_ESC()
Exit 0
EndFunc
Si les actions ne sont pas exécutées, il se peut qu'il y ait un problème sur la fonction
MonProgActif(). Il faut que cette fonction renvoie 1 pour que les autres fonctions puissent être exécutées car si votre appli n'est pas active, je suppose que le timer n'a pas d'intérêt.
J'ai modifié légèrement la fonction au cas ou ...
En ce qui concerne l'écriture du fichier de log, je n'ai eu aucun problèmes.
Il est inutile d'utiliser le
FileOpen car le
FileWriteLine sait gérer l'ouverture et la fermeture du fichier tout seul.
Voilà, à vous de me dire si ça fonctionne comme vous le désirez.
Edit : J'ai mis à jour l'UDF _Adlib.au3 pour résoudre un problème de déclaration de variable (rien de méchant).
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : jeu. 14 mai 2009 08:55
par Julien
Du premier coup !
Une petite remarque, mon clavier/souris sont bien verrouillés pendant l'exécution mais la touche ECHAP ne réagi pas. Je dois fermer ma session pour retrouver le contrôle. En fait quand je fais ECHAP je voudrais pas l'arrêter mais retrouver le contrôle de la souris/clavier et si je une autre combinaison je re-bloque. je vais me pencher la dessus.
Je vais le tester sur une journée. Pour infos ma version d'hier que j'ai laissé tourner toute la nuit ma générée un fichier de log de 12.5Go

qui ma planté mon poste.
J'ai un wamp (serveur LAMP) installé sur ce poste et je me disait que je devrais peux être enregistrer les log dedans. je vais regarder comment ça fonctionne avec autoit et si c'est possible.
Sinon merci encore pour cette aide précieuse !
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : jeu. 14 mai 2009 17:43
par Tlem
BlocInput bloque clavier
et souris, donc aucune touche ne peut être gérée.
La seule solution :
Remarks
If BlockInput is enabled, the Alt keypress cannot be sent!
The table below shows how BlockInput behavior depends on the Windows version; however, pressing Ctrl+Alt+Del on any platform will re-enable input due to a Windows API feature.
Re: [...] Execution planifiée jours de la semaine/plage horaire
Posté : jeu. 14 mai 2009 18:09
par Julien
Ha ben voila! tout s'explique, j'avais pas connaissance de cela.
Merci pour ta précieuse aide.