Page 1 sur 1
[R] Impossible à récupérer stdout stdrr
Posté : lun. 01 févr. 2016 14:07
par amouna98
Bonjour,
Le sujet n'est pas très nouveau mais même après avoir parcouru les sujet déjà résolut j'ai pas trouvé de solution
pour faire simple :
j'ai un script ( .exe) développé en C++
quand je le lance en ligne d cmd j'arrive à récupérer l'erreur soit directement sur cmd ou dans un fichier si j'ajoute "2>test.txt"
jusque la pas de problème
sauf que je veux utiliser autoit pour lancer et récupérer le résultat, pour ça j'utilise run(), la les problèmes commencent!!
Code : Tout sélectionner
Local $iPID = Run ( @ComSpec & $path_tako & "tako.exe test_include_twice.tak ")
; Wait until the process has closed using the PID returned by Run.
ProcessWaitClose($iPID)
; Read the Stdout stream of the PID returned by Run. This can also be done in a while loop. Look at the example for StderrRead.
Local $sOutput = StdoutRead($iPID)
MsgBox (0,"", $sOutput)
le msgBox est toujours vide
j'ai éssayé avec
Code : Tout sélectionner
While 1
$sOutput &= StdoutRead($iPID)
If @error Then ExitLoop
WENd
mais tjr le même problème.
j'ai même essayé :
Code : Tout sélectionner
Run ( @ComSpec & $path_tako & "tako.exe test_include_twice.tak 2>test.txt ")
toujours vide
Merci d'avance
Re: [..] impossible à récupérer stdout stdrr
Posté : lun. 01 févr. 2016 14:55
par orax
C'est StderrRead
pour lire la sortie des erreurs et tu n'exécutes pas Run correctement. Regarde l'exemple de StderrRead.
Re: [..] impossible à récupérer stdout stdrr
Posté : lun. 01 févr. 2016 16:05
par TommyDDR
Il y a tellement de sujet concernant la mauvaise utilisation de la commande run...
Sachez que la commande run fonctionne EXACTEMENT comme ce que vous écrivez directement dans la console.
Donc, mettez dans une variable le contenu de ce que vous avez mis dans "Run" et affichez le, essayez ensuite de coller le résultat dans une console, vous verrez tout de suite d'où vient le problème.
EDIT : Pourquoi avez-vous posté le message dans "Règles du forum" ?
@Tlem : Je ne sais pas comment déplacer un sujet avec la nouvelle version
Re: [..] impossible à récupérer stdout stdrr
Posté : lun. 01 févr. 2016 16:48
par orax
Déplacé dans Aide Générale. Par contre je ne sais pas s'il faut cocher
Laisser un sujet-traceur dans l’ancien forum.
Pour le déplacer il faut cliquer sur le marteau à coté de Répondre (avec le thème par défaut).
Re: [..] impossible à récupérer stdout stdrr
Posté : lun. 01 févr. 2016 17:46
par amouna98
désolé pour l’erreur de l'emplacement du message je ne savais même pas que je pouvais écrire des message dans Règles du forum, et en plus j'arrive pas à le déplacer
[img]
[/img]
Re: [..] impossible à récupérer stdout stdrr
Posté : lun. 01 févr. 2016 18:30
par orax
Ce n'est pas grave, ça arrive. Et il n'y a que les modérateurs qui peuvent les déplacer donc tu n'as pas cette icône pour le faire. En fait, je m'adressais à TommyDDR.
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 11:49
par amouna98
TommyDDR a écrit :Il y a tellement de sujet concernant la mauvaise utilisation de la commande run...
Sachez que la commande run fonctionne EXACTEMENT comme ce que vous écrivez directement dans la console.
Donc, mettez dans une variable le contenu de ce que vous avez mis dans "Run" et affichez le, essayez ensuite de coller le résultat dans une console, vous verrez tout de suite d'où vient le problème.
EDIT : Pourquoi avez-vous posté le message dans "Règles du forum" ?
@Tlem : Je ne sais pas comment déplacer un sujet avec la nouvelle version
J'ai essayé comme ça
Code : Tout sélectionner
Local $exec = $path_tako & "tako.exe test_include_twice.tak "
$iPID = Run(@ComSpec & " " & $exec)
Local $sOutput = ""
While 1
$sOutput = StdoutRead($iPID)
If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
ExitLoop
EndIf
MsgBox($MB_SYSTEMMODAL, "Stdout Read:", $sOutput)
WEnd
While 1
$sOutput = StderrRead($iPID)
If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
ExitLoop
EndIf
MsgBox($MB_SYSTEMMODAL, "Stderr Read:", $sOutput)
WEnd
ceci m'ouvre la cmd dans le bon repertoire et c tt il me lance pas le script !
j'arrive a lancer le script en utilisant send après run
Code : Tout sélectionner
Local $exec = $path_tako & "tako.exe test_include_twice.tak "
$iPID = Run(@ComSpec )
Sleep(1000)
Send( $exec & "{ENTER}")
et j'ai la ligne ( le résultat ) que je veux récupérer qui s'affiche sur la cmd ( ou dans un fichier ) avec :
Code : Tout sélectionner
Local $exec = $path_tako & "tako.exe test_include_twice.tak "
$iPID = Run(@ComSpec )
Sleep(1000)
Send( $exec & " 2>test.txt" & "{ENTER}")
moi je ne veux pas ouvrir la cmd je veux soit récupérer le résultat dans une variable ( de préférence) ou dans un fichier
Merciiiiiii d'avance
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 11:50
par amouna98
Merci d'avoir déplacé le message

Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 13:24
par TommyDDR
"Affichez le" je parlais d'un ConsoleWrite, je l'ai en effet oublié dans le code :
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 14:02
par walkson
Bonjour,
Une suggestion:
Code : Tout sélectionner
#RequireAdmin ;variable selon les programmes
#include <Constants.au3>
Local $exec = '" /c' & $path_tako & "\tako.exe test_include_twice.tak " & '"';pas d'espaces dans le path ou ""
$iPID = Run(@ComSpec & " " & $exec, @SystemDir,@SW_HIDE,$STDOUT_CHILD)
; ou bien
;$iPID = Run( $exec, @WorkingDir,@SW_HIDE,$STDOUT_CHILD);@ComSpec n'est pas tjs indispensable
Local $sOutput = ""
While 1
$sOutput &= StdoutRead($iPID & @CRLF)
If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
ExitLoop
EndIf
WEnd
MsgBox(0, "Stdout Read:", $sOutput)
Mais la méthode de TommyDDr permet vraiment de savoir si le chemin est correcte et de voir s'il y a des espaces dans le path (interdit avec CMD)
RMQ: ici la console est masquée
[Edit]avec #RequireAdmin, consolwrite() ne fonctionne pas, soit le supprimer si possible, soit MsgBox()
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 14:48
par TommyDDR
Pourquoi la console serait masquée ?
Si le programme est lancé par SciTE, la console SciTE sera présente (F8 pour l'afficher)
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 15:20
par orax
En fait elle n'est pas "masquée" mais quand ce code est exécuté...
... le texte suivant s'affiche dans la console :
! Your script requires Admin rights while SciTE is running at normal level.
! This means no Console output from the script will be displayed and SciTE will show the script as ended right away.
SciTE ne pourra pas afficher la sortie de la console à moins de l'
exécuter en tant qu'Administrateur.
$iPID = Run(@ComSpec & " " & $exec, @SystemDir,@SW_HIDE,$STDOUT_CHILD)
ne pourra pas marcher. Il faut le /c ou /k :
@ComSpec & " /c "
. C'est pour ça que ça n'ouvrait que cmd dans le message #7.
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 15:58
par walkson
oups !
j'ai rectifié dans la variable $exec post #10
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 16:14
par amouna98
ça arche pas
j'ai enlevé tout les variables dans $exec
Code : Tout sélectionner
Local $exec = '"C:\Users\...\tako.exe C:\Users\...\test_include_twice.tak"'
Local $iPID = Run ($exec)
ConsoleWrite($exec & @CRLF)
Local $sOutput = ""
While 1
$sOutput &= StderrRead($iPID & @CRLF)
If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
ExitLoop
EndIf
WEnd
MsgBox(0, "Stdout Read:", $sOutput)
ConsoleWrite: affiche bien la ligne
MsgBox : vide
J'arrive pas a avoir le résultat sans utiliser send
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 16:18
par amouna98
walkson a écrit :oups !
j'ai rectifié dans la variable $exec post #10
oui avec la rectification j'affiche bien le résultat dans la console reste a savoir si je peux la récupérer dans une variable

Merciiii

Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 16:47
par TommyDDR
Pour rediriger les flux de votre exécutable, regardez du côté des paramètres optionnels de "Run"
Re: [..] impossible à récupérer stdout stdrr
Posté : mar. 02 févr. 2016 17:57
par amouna98
j'ai trouvé la solution dans un site russe, j'ai pas bien compris le pourquoi du comment mais le voici:
http://autoit-script.ru/index.php?PHPSE ... 8#msg71688
et le script devient :
Code : Tout sélectionner
If Not FileExists($Tako_script) Then
MsgBox(16, 'Error', 'zbarimg.exe not found.')
Exit
EndIf
$PID = Run($Tako_script & ' "' & $input_file & '"', '', @SW_HIDE, BitOR($STDOUT_CHILD, $STDERR_CHILD))
While 1
$Str &= StdoutRead($PID)
If @error Then
ExitLoop
EndIf
WEnd
While 1
$Err &= StderrRead($PID)
If @error Then
ExitLoop
EndIf
WEnd
If $Str Then
MsgBox(64, 'ZBar std out', BinaryToString(StringToBinary(StringReplace($Str, 'QR-Code:', '', 1), 1), 4))
Else
MsgBox(16, 'ZBar err', $Err)
EndIf