Lire le retour d'un exécutable

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
gaelds
Niveau 2
Niveau 2
Messages : 27
Enregistré le : sam. 18 avr. 2015 06:59
Status : Hors ligne

Lire le retour d'un exécutable

#1

Message par gaelds »

Bonjour,

Débutant en autoit, j'ai un souci pour utiliser "StdoutRead". Je souhaite récupérer les codes erreurs d'un exécutable lancé par RunWait et l'affichage que cet exécutable enverrait sur la console.

Par exemple, sur un PC la commande affiche "FROZEN." dans la console DOS:
Image
Et d'après la doc de Deepfreeze, DFC.exe doit retourner 0 si le PC est dégelé, 1 s'il est gelé. Mais quelque soit le PC et le statut gelé/pas gelé, $line est vide et @error = 0.

Code : Tout sélectionner

Local $cmd = "C:\Windows\SysWOW64\DFC.EXE get /isfrozen"
   Local $PIDProcess = RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE)
   Local $line = StdoutRead($PIDProcess)
   MsgBox(0, "Retour:", $line)
   MsgBox(0, "Erreur:", @error)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Lire le retour d'un exécutable

#2

Message par mikell »

Pour que StdoutRead fonctionne tu dois utiliser Run avec le paramètre $STDOUT_CHILD (ou $STDERR_MERGED)
cf. le fichier d'aide pour Run
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
gaelds
Niveau 2
Niveau 2
Messages : 27
Enregistré le : sam. 18 avr. 2015 06:59
Status : Hors ligne

Re: Lire le retour d'un exécutable

#3

Message par gaelds »

Désolé mais même en lisant l'aide je ne comprends pas comment utiliser ces arguments, j'ai essayé de différentes façons mais $line est toujours vide...

Code : Tout sélectionner

Local $PIDProcess = RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Local $PIDProcess = RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE, $STDOUT_CHILD)
Local $PIDProcess = RunWait(@ComSpec & " /c " & $cmd, "", @SW_HIDE, $STDERR_MERGED)
Local $PIDProcess = RunWait(@ComSpec & " /c " & $cmd, "", $STDOUT_CHILD)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Lire le retour d'un exécutable

#4

Message par mikell »

Faut utiliser Run, pas RunWait
Lis bien les pages (et les exemples) de l'aide pour Run et StdoutRead
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
gaelds
Niveau 2
Niveau 2
Messages : 27
Enregistré le : sam. 18 avr. 2015 06:59
Status : Hors ligne

Re: Lire le retour d'un exécutable

#5

Message par gaelds »

pas mieux avec le run, et même en recopiant les lignes de l'aide de StdoutRead ça ne fonctionne pas. Et d'ailleurs je ne comprends pas la partie avec
"ArrayDisplay".

Code : Tout sélectionner

Local $cmd = "C:\Windows\SysWOW64\DFC.EXE get /isfrozen"
   Local $PIDProcess = Run(@ComSpec & " /c " & $cmd, "", @SW_HIDE, $STDOUT_CHILD)
   ProcessWaitClose($PIDProcess)
   Local $sOutput = StdoutRead($PIDProcess)
   MsgBox(0, "Retour:", $sOutput)
   MsgBox(0, "Erreur:", @error)
Il n'y pas d'autres exemples d'utilisation de StdoutRead ailleurs ? je ne trouve rien sur google.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Lire le retour d'un exécutable

#6

Message par Tlem »

Bonsoir.
La commande ProcessWaitClose() devrait être après la lecture du flux de sortie ...

Pour plus d'exemple il suffit de suivre le lien StderrRead() qui est dans la doc de la commande Run() (ou de cliquer sur les liens générés dans ce message). ;)
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é".
gaelds
Niveau 2
Niveau 2
Messages : 27
Enregistré le : sam. 18 avr. 2015 06:59
Status : Hors ligne

Re: Lire le retour d'un exécutable

#7

Message par gaelds »

Désolé mais je laisse tomber, je n'ai pas plus de temps à consacrer à ce petit programme. J'ai beau recopier le code des exemples, le $sOutput est toujours vide à l'affichage, ça vient sans doute de l’exécutable.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Lire le retour d'un exécutable

#8

Message par Tlem »

J'ai essayé rapidement et effectivement pas de retour ... A première vue cette application n'est pas une véritable application console, donc c'est probablement l'explication.
Par contre si vous lisez la documentation de la commande, voici ce qui est dit :
DFC get /ISFROZEN
Queries workstation if it is Frozen.
Returns 0 if Thawed. Returns 1 if Frozen.
Donc, ceci doit vous convenir :

Code : Tout sélectionner

$retVal = RunWait("C:\Windows\SysWOW64\DFC.EXE get /isfrozen")
If $retVal = "0" Then
	MsgBox(0, "", "Thawed")
Else
	MsgBox(0, "", "Frozen")
EndIf
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é".
gaelds
Niveau 2
Niveau 2
Messages : 27
Enregistré le : sam. 18 avr. 2015 06:59
Status : Hors ligne

Re: Lire le retour d'un exécutable

#9

Message par gaelds »

Tlem a écrit : mer. 15 nov. 2017 23:13 J'ai essayé rapidement et effectivement pas de retour ... A première vue cette application n'est pas une véritable application console, donc c'est probablement l'explication.
Par contre si vous lisez la documentation de la commande, voici ce qui est dit :
DFC get /ISFROZEN
Queries workstation if it is Frozen.
Returns 0 if Thawed. Returns 1 if Frozen.
Donc, ceci doit vous convenir :

Code : Tout sélectionner

$retVal = RunWait("C:\Windows\SysWOW64\DFC.EXE get /isfrozen")
If $retVal = "0" Then
	MsgBox(0, "", "Thawed")
Else
	MsgBox(0, "", "Frozen")
EndIf

Merci de ton aide ! ça pourrait être plus simple en effet. Mais juste en le testant sur mon PC, où DFC.exe n'existe pas, le programme retourne "Thawed" au lieu d'un message d'erreur. Du coup j'ai ajouté le test de l'existence du fichier DFC et ça devrait fonctionner.

If FileExists("C:\Windows\SysWOW64\DFC.EXE") Then...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Lire le retour d'un exécutable

#10

Message par Tlem »

Bonsoir,
J'étais partit effectivement du postulat ou l'exécutable est sensé être présent car pour faire ce que vous cherchez à faire, il faut obligatoirement l'exécutable ...
Du coup je n'ai pas pris en compte la partie vérification. ^^
Maintenant, avec un FileInstall() dans le dossier temporaire de l'utilisateur, vous ne devriez plus avoir de problème.
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é".
Répondre