Page 1 sur 1

Lire le retour d'un exécutable

Posté : lun. 13 nov. 2017 11:21
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)

Re: Lire le retour d'un exécutable

Posté : lun. 13 nov. 2017 18:04
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

Re: Lire le retour d'un exécutable

Posté : mar. 14 nov. 2017 10:06
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)

Re: Lire le retour d'un exécutable

Posté : mar. 14 nov. 2017 13:31
par mikell
Faut utiliser Run, pas RunWait
Lis bien les pages (et les exemples) de l'aide pour Run et StdoutRead

Re: Lire le retour d'un exécutable

Posté : mar. 14 nov. 2017 15:45
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.

Re: Lire le retour d'un exécutable

Posté : mer. 15 nov. 2017 00:20
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). ;)

Re: Lire le retour d'un exécutable

Posté : mer. 15 nov. 2017 15:57
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.

Re: Lire le retour d'un exécutable

Posté : mer. 15 nov. 2017 23:13
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

Re: Lire le retour d'un exécutable

Posté : ven. 17 nov. 2017 14:26
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...

Re: Lire le retour d'un exécutable

Posté : ven. 17 nov. 2017 21:12
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.