Mise en route programmes

Poser vos questions de programmation en AutoHotkey
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Mise en route programmes

06 Aug 2016, 09:20

Bonjour :)
J'utilise un simple script pour executer un exe à partir du fichier de configuration .ini
Je souhaite maintenant pouvoir exécuter plusieurs .exe à partir de mon config.ini, j'ai regardé du coté du Loop mais j'ai du mal à saisir
Merci pour le coup de main par avance, le code ne doit pas être compliqué je pense

Programmes.ahk

Code: Select all

#NoEnv
#SingleInstance force
IniRead, valeur, config.ini, programmes, exe
Run %valeur%
config.ini

Code: Select all

[programmes]
exe=fichier.exe
Last edited by Lner on 07 Aug 2016, 16:02, edited 1 time in total.
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

06 Aug 2016, 14:17

example avec IniRead/write

Code: Select all

#NoEnv
#SingleInstance force
filename1=IniTest
SetWorkingDir, %A_ScriptDir%
Gui,2: Color, ControlColor,Black           ;- background from edit
Gui,2: Color, Gray                         ;- Gui color
Gui,2: Font,s12 cYellow ,Lucida Console    ;- font , font-size and color
;Gui,2:Font, CDefault , FixedSys


pr1:="notepad"
pr2:="calc"

xx:=a_scriptname
SplitPath, xx, name, dir, ext, name_no_ext, drive

RSSINI=%A_scriptdir%\%name_no_ext%_config.ini
ifnotexist,%rssini%
    {
    IniWrite,%pr1%, %rssini% , Program-1 ,EXE
    IniWrite,%pr2%, %rssini% , Program-2 ,EXE
    }
IniRead, valeur1, %rssini%, Program-1, EXE
IniRead, valeur2, %rssini%, Program-2, EXE

Gui,2: Show,x100 y10 w370 h120,%filename1%
Gui,2: Add, text, x10  y10 cWhite, Program1
Gui,2: Add, text, x10  y40 cWhite, Program2

Gui,2: Add, Edit, x100  y10 w120 vC1,%valeur1%
Gui,2: Add, Edit, x100  y40 w120 vC2,%valeur2%

Gui,2: Add, Button, x230 y10 w100 h25   gRun1,Run-1
Gui,2: Add, Button, x230 y40 w100 h25   gRun2,Run-2

Guicontrol,2:Focus,C1
SendInput , {end}
return

2Guiclose:
Gui,2:submit,nohide
gosub,save1
exitapp

Run1:
Gui,2:submit,nohide
Run, %c1%
return

Run2:
Gui,2:submit,nohide
Run, %c2%
return


save1:
IniWrite, %C1%  , %rssini% ,Program-1   , EXE
IniWrite, %C2%  , %rssini% ,Program-2   , EXE
return
;================================================

Run program avec Listbox

Code: Select all

;- run program --
Gui,2: Color, ControlColor,Black           ;- background from edit
Gui,2: Color, Gray                         ;- Gui color
Gui,2: Font,s12 cYellow ,Lucida Console    ;- font , font-size and color

e4x=
(Join`|
charmap
calc
notepad
)
Gui,2: Add, ListBox, x6 y37 w180 h160 vEe gAA,%e4x%
Gui,2: Show, x10 y10 w194 h250, Run-Programs
Return

AA:
Gui,2: Submit,nohide
GuiControlGet,bb,,ee
if bb=
   return
;msgbox, 262208,TEST ,%bb%
run,%bb%
Return

2GuiClose:
ExitApp
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

06 Aug 2016, 15:07

En fait le but c'est d’exécuter en arrière plan les programmes sans ouvrir de fenêtre ou boite message, que l'on ajoute dans le fichier config.ini simplement (je ne pensais pas qu'il fallait autant de ligne :) )

En prenant quelques exemples j'ai fait :

Code: Select all

#NoEnv
#SingleInstance force
Loop
{
	FileReadLine, exe, config.ini, %A_Index% 
    	if ErrorLevel 
        	break
 	Run %exe%
 	Sleep , 300
	}
return
ExitApp
Cela fonctionne (surement pas optimisé ^^)
Mais sur ce principe je souhaite que mes lignes commentées ne soit pas lues et ne pose pas d'erreur

config.ini

Code: Select all

// Commentaire
// Commentaire
C:\WINDOWS\notepad.exe
C:\WINDOWS\****.exe
Merci pour le coup de main
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

06 Aug 2016, 15:33

lignes commentées > continue loop

Code: Select all

#NoEnv
#SingleInstance force
e4x=
(
// Commentaire
// Commentaire
notepad
calc
)
f1=%a_scriptdir%\config.txt
ifnotexist,%f1%
  fileappend,%e4x%,%f1%

Loop
{
	FileReadLine, exe, %f1%, %A_Index%
    	if ErrorLevel
        	break
        stringmid,c,exe,1,2
        if (c="//")
            {
            msgbox,%exe%
            continue
            }
 	Run %exe%
 	Sleep , 2000
	}
ExitApp
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

06 Aug 2016, 16:32

Super :)
Je voulais ajouter une alerte lorsque le fichier n'existe pas uniquement , j'ai fait comme ceci mais il me met le message à chaque exécution (j'ai modifier le nom du ini et enlevé le msgbox plus bas)

Code: Select all

#NoEnv
#SingleInstance force
alert=
(
Le fichier n'existe pas
Il vient d'être créé
)
e4x=
(
// Placez vos liens vers vos .exe
// exemple : 
)
f1=config.ini
ifnotexist,%f1%
  fileappend,%e4x%,%f1%
 msgbox,%alert%
Loop
{
	FileReadLine, exe, %f1%, %A_Index%
    	if ErrorLevel
        	break
        stringmid,c,exe,1,2
        if (c="//")
            {

            continue
            }
 	Run %exe%
 	Sleep , 2000
	}
ExitApp
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 03:51

Bonjour
J'ai refait un test cela semble fonctionner comme ceci:

Code: Select all

ifnotexist,%f1%
 	 {
  	fileappend,%e4x%,%f1%
 	msgbox,%alert%
	 }
	
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 04:08

Commentaires autohotkey > ';'
( mais vous pouvez utiliser aussi în text > '//' )

ou
/*
comment-1
comment-2
*/

Code: Select all

#warn
#NoEnv
#SingleInstance force

f1=config.ini
;- peut être
ifexist,%f1%
  filedelete,%f1%

e4x=
(
;Placez vos liens vers vos .exe
;exemple :
C:\WINDOWS\system32\calc.exe
;C:\WINDOWS\system32\notepad.exe
;C:\WINDOWS\system32\charmap.exe
)

ifnotexist,%f1%
  fileappend,%e4x%,%f1%

i=0
Loop
   {
   FileReadLine, exe, %f1%, %A_Index%
   if ErrorLevel
       	break
   stringmid,c,exe,1,1
   if (c=";")
      continue
  else
     {
     ifexist,%exe%
        {
        i++
        Run, %exe%
        Sleep , 2000
        }
     }
  }
if (i=0)
  msgbox, 262208,Programs Not Exist,Aucun programme trouvé
ExitApp
;===========================================================
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 04:56

Merci bien

Par contre cette solution n'est pas bonne car il faut indiquer un programme à executer dans le code du coup il affiche un message d'alerte comme quoi il n'y a pas de programme à exécuter, même si on modifie le fichier il l'efface et remet le même message

La partie e4x n'est la que pour placer un commentaire
e4x=
(
;Placez vos liens vers vos .exe
;exemple :
;C:\WINDOWS\system32\calc.exe
;C:\WINDOWS\system32\notepad.exe
;C:\WINDOWS\system32\charmap.exe
)
Le bon modèle est celui du dessus qui indique le fichier n'existe pas, qu'il faut le configurer et qui va le créer
Si le fichier existe il ne met pas de message (au pire tester s'il n'y a pas de ligne de programme à exécuter et avertir)
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 05:16

vous voulez config.ini seulement quand exe-programme existe

Code: Select all

#warn
#NoEnv
#SingleInstance force

f1=config.ini
ifexist,%f1%
  filedelete,%f1%

e:=""
e4x=
(Join`r`n
;Placez vos liens vers vos .exe
;exemple :
;C:\WINDOWS\system32\calc.exe
;C:\WINDOWS\system32\notepad.exe
;C:\WINDOWS\system32\charmap.exe
)

Loop,parse,e4x,`n,`r              ;- parse each line by `n ascii-10 (EndOfLine ascii 13,10 )
    {
    x:= A_LoopField               ;- line in variable e4x
    stringmid,c,x,1,1
    if (c=";")
      continue
    else
       e .= x . "`r`n"
    }
if e<>
  fileappend,%e%,%f1%

i=0
ifexist,%f1%
{
Loop
   {
   FileReadLine, exe, %f1%, %A_Index%
   if ErrorLevel
       	break
   stringmid,c,exe,1,1
   if (c=";")
      continue
  else
     {
     ifexist,%exe%
        {
        i++
        Run, %exe%
        Sleep , 2000
        }
     }
  }
}
if (i=0)
  msgbox, 262208,Programs Not Exist,Aucun programme trouvé
ExitApp
;===========================================================

Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 06:44

En fait le bon code que vous avez fait au dessus est celui qui va bien

Code: Select all

#NoEnv
#SingleInstance force
alert=
(
Le fichier config.ini n'existe pas
Il vient d'être créé.
Vous pouvez le configurer
)
e4x=
(
// Placez vos liens vers vos .exe
// exemple : 
)
f1=config.ini
ifnotexist,%f1%
  fileappend,%e4x%,%f1%
 msgbox,%alert%
Loop
{
	FileReadLine, exe, %f1%, %A_Index%
    	if ErrorLevel
        	break
        stringmid,c,exe,1,2
        if (c="//")
            {
 
            continue
            }
 	Run %exe%
 	Sleep , 2000
	}
ExitApp
J'ai juste modifié la partie :

Code: Select all

ifnotexist,%f1%
  fileappend,%e4x%,%f1%
 msgbox,%alert%
Et j'ai mis des { } et j'ai ajouté un message d'alerte sinon on a une msgbox à chaque lancement, c'était juste cela que je voulais dire :)

Code: Select all

alert=
(
Le fichier n'existe pas
Il vient d'être créé
)

ifnotexist,%f1%
{
fileappend,%e4x%,%f1%
 msgbox,%alert%
 }
Par contre dans le fichier config.ini si on met n'importe quoi cela ouvre un message d'erreur de code pas joli

Exemple si je met dans le config.ini

Code: Select all

C:\WINDOWS\system32\calgggg2c.exe
il met :

Code: Select all

---------------------------
Start-EXE.exe
---------------------------
Error:  Failed attempt to launch program or document:
Action: <C:\WINDOWS\system32\calgggg2c.exe>
Params: <>

Specifically: Le fichier spécifié est introuvable.

	Line#
--->	032: Run,%exe%

The current thread will exit.
---------------------------
OK   
---------------------------
On peu mettre simplement un message qui dit que le fichier à executer n'est pas bon ou n'est pas trouvé ?
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 07:10

On peu mettre simplement un message qui dit que le fichier à executer n'est pas bon ou n'est pas trouvé ?
voir example avant

Code: Select all

;...
  else
     {
     ifexist,%exe%
        {
        i++
        Run, %exe%
        Sleep , 2000
        }
;...        
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 07:31

Ok j'ai ajouté le morceau de code et le message d'erreur n'est plus la s'il y a un problème de .exe, c'est parfait

Code: Select all

#NoEnv
#SingleInstance force
alert=
(
Le fichier Start-EXE.ini n'existe pas.
Il se trouve à coté de votre Start-EXE.exe.
)
message=
(
// Ecrire l'emplacement de vos exécutables les uns sous les autres
// Exemple :
)
fichier=Start-EXE.ini
ifnotexist,%fichier%
  {fileappend,%message%,%fichier%
 msgbox,%alert%
}
Loop
	{
	FileReadLine, exe, %fichier%, %A_Index%
    	if ErrorLevel
        break
        stringmid,c,exe,1,2
        if (c="//")
      	continue
  		else
     		{
     		ifexist,%exe%
        		{
        		i++
        		Run, %exe%
        		Sleep , 2000
        		}
     		}
	}
ExitApp
J'ai un script pour fermer les process, je peu utiliser ce code et remplacer le "Run," par "Process Close," ?
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 08:22

process close example

Code: Select all

;- ouvrir /ferme calc.exe avec F7 
F7::
t:= !t
if (t)
   {
   Process, Exist,calc.exe
   if (ErrorLevel <> 0)    ;- quand calc.exe existe
     return
   else
      Run, calc            ;- run calc.exe une fois
   return
   }
else
   {
   Process, Exist, calc.exe
   if (ErrorLevel <> 0)
      Process, Close,calc.exe
   return
   }
return
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 08:34

En fait je voulais la même méthode que l'autre script:
- Un fichier Stop.exe
- Un fichier configuration Stop.ini

Dans le Stop.ini on met le nom des process à stopper
Stop.ini

Code: Select all

// Placez la liste des process à stopper
Calculator.exe
J'avais trouvé ce script et au lieu de "Process Close, Calculator.exe" mettre le code du dessus pour lire le fichier.ini

Code: Select all

#NoTrayIcon
#NoEnv
#Persistent
#SingleInstance force

Process Close, Calculator.exe

DetectHiddenWindows, On
SetWorkingDir %A_ScriptDir%



NoTrayOrphans()
ExitApp
Return

NoTrayOrphans() {
TrayInfo:= TrayIcons(sExeName,"ahk_class Shell_TrayWnd","ToolbarWindow32" . GetTrayBar()) "`n"
. TrayIcons(sExeName,"ahk_class NotifyIconOverflowWindow","ToolbarWindow321")
Loop, Parse, TrayInfo, `n
{
ProcessName:= StrX(A_Loopfield, "| Process: ", " |")
ProcesshWnd:= StrX(A_Loopfield, "| hWnd: ", " |")
ProcessuID := StrX(A_Loopfield, "| uID: ", " |")
If !ProcessName ProcesshWnd
RemoveTrayIcon(ProcesshWnd, ProcessuID)
}
}
RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2) {
NumPut(VarSetCapacity(ni,444,0), ni)
NumPut(hWnd , ni, 4)
NumPut(uID , ni, 8)
NumPut(1|2|4, ni,12)
NumPut(nMsg , ni,16)
NumPut(hIcon, ni,20)
Return DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", ni)
}
TrayIcons(sExeName,traywindow,control) {
DetectHiddenWindows, On
WinGet, pidTaskbar, PID, %traywindow%
hProc:= DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc:= DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
SendMessage, 0x418, 0, 0, %control%, %traywindow%
Loop, %ErrorLevel%
{
SendMessage, 0x417, A_Index-1, pProc, %control%, %traywindow%
VarSetCapacity(btn,32,0), VarSetCapacity(nfo,32,0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", btn, "Uint", 32, "Uint", 0)
iBitmap := NumGet(btn, 0)
idn := NumGet(btn, 4)
Statyle := NumGet(btn, 8)
If dwData := NumGet(btn,12)
iString := NumGet(btn,16)
Else dwData := NumGet(btn,16,"int64"), iString:=NumGet(btn,24,"int64")
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", nfo, "Uint", 32, "Uint", 0)
If NumGet(btn,12)
hWnd := NumGet(nfo, 0)
, uID := NumGet(nfo, 4)
, nMsg := NumGet(nfo, 8)
, hIcon := NumGet(nfo,20)
Else hWnd := NumGet(nfo, 0,"int64"), uID:=NumGet(nfo, 8), nMsg:=NumGet(nfo,12), hIcon := NumGet(nfo,24)
WinGet, pid, PID, ahk_id %hWnd%
WinGet, sProcess, ProcessName, ahk_id %hWnd%
WinGetClass, sClass, ahk_id %hWnd%
If !sExeName || (sExeName = sProcess) || (sExeName = pid)
VarSetCapacity(sTooltip,128), VarSetCapacity(wTooltip,128*2)
, DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", wTooltip, "Uint", 128*2, "Uint", 0)
, DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
, sTrayIcons .= "idx: " . A_Index-1 . " | idn: " . idn . " | Pid: " . pid . " | uID: " . uID . " | MessageID: " . nMsg . " | hWnd: " . hWnd . " | Class: " . sClass . " | Process: " . sProcess . " | Icon: " . hIcon . " | Tooltip: " . wTooltip . "`n"
}
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
return sTrayIcons
}
GetTrayBar() {
ControlGet, hParent, hWnd,, TrayNotifyWnd1 , ahk_class Shell_TrayWnd
ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
Loop {
ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
If Not hWnd
Break
Else If hWnd = %hChild%
{
idxTB := A_Index
Break
}
}
Return idxTB
}

StrX( H,BS="",ES="",Tr=1,ByRef OS=1) {
return,(SP := InStr(H,BS,0,OS)) (L := InStr(H,ES,0,SP+StrLen(BS))) (OS := L + StrLen(ES)) ? SubStr(H,SP := Tr ? SP + StrLen(BS) : SP ,(Tr ? L : L + StrLen(ES))-SP) : ""
}
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 12:29

J'ai copié un des premiers codes et ça marche :)

Code: Select all

Loop
	{
	FileReadLine, exe, %fichier%, %A_Index%
    	if ErrorLevel
        	break
        stringmid,c,exe,1,2
        if (c="//")
            {
            continue
            }
 		Process Close, %exe%
 		Sleep , 2000
	}
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 12:41

idea
Créer des programmes et fermer les programmes avec ESCAPE

Code: Select all

;- in variable e4x = start programs and close these programs with ESC

#warn
#NoEnv
#SingleInstance force

f1=config.ini
ifexist,%f1%
  filedelete,%f1%

e:=""
d:=""

e4x=
(Join`r`n
;Placez vos liens vers vos .exe
;exemple :
C:\WINDOWS\system32\calc.exe
;C:\WINDOWS\system32\notepad.exe
C:\WINDOWS\system32\charmap.exe
)

Loop,parse,e4x,`n,`r              ;- parse each line by `n ascii-10 (EndOfLine ascii 13,10 )
    {
    x:= A_LoopField               ;- line in variable e4x
    stringmid,c,x,1,1
    if (c=";")
      continue
    else
       {
       e .= x . "`r`n"
       SplitPath, x, name, dir, ext, name_no_ext, drive
       d .= name . "`r`n"
       }
    }
if e<>
  fileappend,%e%,%f1%

i=0
ifexist,%f1%
{
Loop
   {
   FileReadLine, exe, %f1%, %A_Index%
   if ErrorLevel
       	break
   stringmid,c,exe,1,1
   if (c=";")
      continue
  else
     {
     ifexist,%exe%
        {
        i++
        Run, %exe%
        Sleep , 2000
        }
     }
  }
}
if (i=0)
  msgbox, 262208,Programs Not Exist,Aucun programme trouvé
return

esc::
Loop, Parse, d, `n,`r
   {
   Process, Exist, %A_LoopField%
   if (ErrorLevel <> 0)
      Process, Close, %ErrorLevel%
  }
exitapp
;===========================================================
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 12:55

En fait il faut simplement que les programmes se ferme lorsque l'on exécute "Stop.exe" et que ce soit mis dans le fichier stop-config.ini (par exemple)

Même principe que pour l'autre script
garry
Posts: 3852
Joined: 22 Dec 2013, 12:50

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 13:19

@Lner , je pense que vous avez la solution ...
Lner
Posts: 11
Joined: 06 Aug 2016, 09:11

Re: Exécuter des programmes sur un fichier .ini

07 Aug 2016, 13:43

Oui j'ai pris un morceau du code plus haut et cela semble fonctionner

merci encore pour l'aide :)

Return to “J'ai besoin d'aide”

Who is online

Users browsing this forum: No registered users and 10 guests