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.
Local $exec = @ComSpec &  $path_tako & "tako.exe test_include_twice.tak "
Local $iPID = Run ($exec)
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 :oops:
[img]
erreur.jpg
[/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.
Local $exec = @ComSpec &  $path_tako & "tako.exe test_include_twice.tak "
Local $iPID = Run ($exec)
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 :) :D

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 :
Local $exec = @ComSpec &  $path_tako & "tako.exe test_include_twice.tak "
Local $iPID = Run ($exec)
ConsoleWrite($exec & @CRLF)

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é...

Code : Tout sélectionner

#RequireAdmin
ConsoleWrite("test" & @CRLF)
... 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 ! :oops:
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 :cry:
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 ! :oops:
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 :D :D :D :D

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