[R] Impossible à récupérer stdout stdrr

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

[R] Impossible à récupérer stdout stdrr

#1

Message 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
Modifié en dernier par amouna98 le mar. 02 févr. 2016 18:02, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#2

Message par orax »

C'est StderrRead pour lire la sortie des erreurs et tu n'exécutes pas Run correctement. Regarde l'exemple de StderrRead.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#3

Message 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
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#4

Message 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).
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#5

Message 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]
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#6

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#7

Message 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
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#8

Message par amouna98 »

Merci d'avoir déplacé le message :) :D
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#9

Message 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)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#10

Message 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()
Modifié en dernier par walkson le mar. 02 févr. 2016 15:56, modifié 1 fois.
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#11

Message 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)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#12

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#13

Message par walkson »

oups ! :oops:
j'ai rectifié dans la variable $exec post #10
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#14

Message 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
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#15

Message 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
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr

#16

Message par TommyDDR »

Pour rediriger les flux de votre exécutable, regardez du côté des paramètres optionnels de "Run"
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
amouna98
Niveau 5
Niveau 5
Messages : 127
Enregistré le : jeu. 15 juil. 2010 10:17
Status : Hors ligne

Re: [..] impossible à récupérer stdout stdrr  

#17

Message 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
Répondre