
Problématique de départ : pour la mise à jour d'un automate, nous lançons une commande MS-DOS (qui déclenche un programme en Java, mais peu importe). Si le batch ne contient pas la valeur correcte du port COM sur lequel est connecté l'automate, la commande MS-DOS reste figée sur un message, sans se fermer d'elle-même.
Solution : scruter le STDOUT de la fenêtre afin de déterminer si oui ou non, il y a des changement dans cette dernière.
#include <Constants.au3>
#include <File.au3>
$timeout = 5 ; Nombre de secondes sans modifications de la sortie texte de la commande MSDOS avant fermeture
$foo = Run(@ComSpec & " /c D:\iCASH-Loader\iCASH10FO-getVersion.bat", @SystemDir, @SW_SHOW, $STDERR_CHILD + $STDOUT_CHILD)
_TimeOut($foo, $timeout)
Func _TimeOut($programme, $duree)
$line_alt = "Coin !"
$compteur = 0
$logfile = "c:\temp\log.txt"
_FileWriteLog($logfile, "Lancement du batch ...")
FileWrite($logfile, @CRLF & "************************** SORTIE CONSOLE ****************************" & @CRLF & @CRLF)
While 1
$line = StdoutRead($programme)
FileWrite($logfile, $line)
If @error Then ExitLoop
If $line_alt = $line Then
Sleep(1000)
$compteur = $compteur + 1
Else
$compteur = 0
EndIf
If $compteur = $duree Then
ProcessClose($programme)
FileWrite($logfile, @CRLF & @CRLF & "**************************** FIN SORTIE ******************************" & @CRLF & @CRLF)
_FileWriteLog($logfile, "Timeout => exit !")
ExitLoop
EndIf
$line_alt = $line
WEnd
EndFunc ;==>_TimeOut
#include <File.au3>
$timeout = 5 ; Nombre de secondes sans modifications de la sortie texte de la commande MSDOS avant fermeture
$foo = Run(@ComSpec & " /c D:\iCASH-Loader\iCASH10FO-getVersion.bat", @SystemDir, @SW_SHOW, $STDERR_CHILD + $STDOUT_CHILD)
_TimeOut($foo, $timeout)
Func _TimeOut($programme, $duree)
$line_alt = "Coin !"
$compteur = 0
$logfile = "c:\temp\log.txt"
_FileWriteLog($logfile, "Lancement du batch ...")
FileWrite($logfile, @CRLF & "************************** SORTIE CONSOLE ****************************" & @CRLF & @CRLF)
While 1
$line = StdoutRead($programme)
FileWrite($logfile, $line)
If @error Then ExitLoop
If $line_alt = $line Then
Sleep(1000)
$compteur = $compteur + 1
Else
$compteur = 0
EndIf
If $compteur = $duree Then
ProcessClose($programme)
FileWrite($logfile, @CRLF & @CRLF & "**************************** FIN SORTIE ******************************" & @CRLF & @CRLF)
_FileWriteLog($logfile, "Timeout => exit !")
ExitLoop
EndIf
$line_alt = $line
WEnd
EndFunc ;==>_TimeOut