Shellexecute und $STDOUT_CHILD

  • Hallo,
    mit den Parametern $STDERR_CHILD + $STDOUT_CHILD, wie in

    [autoit]

    $rc =Run($cmd,'',@SW_MAXIMIZE,$STDERR_CHILD + $STDOUT_CHILD)

    [/autoit]


    gibt es ja die Möglichkeit, die Meldungen des gestarteten Programms anzeigen zu lassen.

    Jetzt habe ich den Fall, dass ich ein Programm mit so vielen Parametern und Pfadangaben aufrufe, dass run mit den ganzen Anführungszeichen nicht mehr klar kommt.
    Mit shellexecute klappt das sehr gut.
    Nun meine Frage:
    Wie kann ich die Meldungen eines Programms abfangen, dass ich mit shellexecute aufgerufen habe ?

    Danke

    Einmal editiert, zuletzt von Axel_Zucker (18. September 2008 um 13:45)

  • Das Eingangproblem ist jetzt zwar gelöst,
    die Zeile muss lauten:

    [autoit]

    $rc=Run(@ComSpec & ' /c ' & $cmd, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit]

    Ich verstehe zwar nicht, was das /c bewirkt, aber so läuft das Programm jedenfalls.

    Aber mein Ziel ist es ja, evtl. Fehlermeldungen des aufgerufenen Programms anzeigen zu lassen. Ich habe schon den allseits beliebten Code

    [autoit]

    $cmd = 'ipconfig -all'
    $stream = Run(@ComSpec & ' /c ' & $cmd, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $text &= @CR & StdoutRead($stream)
    If @error Then ExitLoop
    WEnd
    MsgBox(64, 'info', $text)

    [/autoit]

    getestet. Mit 'ipconfig' und anderen Befehlen, deren Meldungen man auch per '>Datei.txt' umleiten kann, funktioniert der Code auch prima.
    Bei dem Programm, dass ich in der Shell starten will (GPSBabel, ein Programm zur Übertragung von Daten auf GPS-Geräte), wird die Fehlermeldung aber nur im Shell-Fenster angezeigt und lässt sich nicht in eine Datei umleiten. Folglich (?) funktioniert auch der o.g. Code nicht.

    Gibt es noch eine andere Möglichkeit, die Meldungen im Shell-Fenster auszulesen ?

    Axel

    • Offizieller Beitrag

    Hi,

    es gibt immer einen Eingabe einen Ausgabe und ErrorStream. Wenn das Programm nichts in den Error oder Ausgabestream schreibt, dann wirst du auch nichts finden.

    Kannst du es irgendwie per Screenshot oder so verdeutlichen was passiert und was der Ablauf sein sollte?

    Mega

  • Das Programm wird aus dem AutoIt-Skript gestartet mit:

    "D:\Programme\gpsbabel>gpsbabel -i gpx -f garmin.gpx -o garmin -F usb:"

    Wenn die Übertragung klappt, kommt keine Meldung, wenn z.B. kein Gerät angeschlossen ist kommt:

    "GPSBabel Version: 1.3.3
    [ERROR] SetupDiEnumDeviceInterfaces: Es sind keine Daten mehr verf³gbar.

    Is the Garmin USB unit number 0 powered up and connected?
    Is it really a USB unit? If it's serial, don't choose USB, choose serial.[ERROR
    ] Get_Time: Unknown date/time protocol
    GARMIN:Can't init usb:"

    Gibt es vllt. alternativ die Möglichkeit, das Shell-Fenster offen zu halten ? Dann kann man jedenfalls die Fehlermeldung dort lesen.

    Gruß
    Axel

  • Hallo,
    mein Skript generiert aus verschiedenen Informationen, die ein anderes Programm zur Verfügung stellt, eine sog. GPX-Datei, die dann mit dem externen Programm GPSBabel über USB an GPS-Geräte gesendet wird. Soweit funktioniert das alles sehr gut.

    Mir geht es jetzt nur noch um das Abfangen von Fehlermeldungen von GPSBabel. Die häufigsten Fehler sind:
    Ungültige Zeichen in der GPX-Datei,
    GPX-Datei ist zu groß (hängt vom angeschlossenen GPS-Gerät ab),
    Gerät ist nicht angeschlossen
    Aber es können auch noch andere Fehlermeldungen auftreten, die mir noch nicht bekannt sind.

    Mit folgendem Code rufe ich GPSBabel auf:

    [autoit]

    $cmd='start ' & $prog_path & 'gpsbabel -i gpx -f "' & @ScriptDir & '\garmin.gpx" -o garmin -F usb:'

    [/autoit][autoit][/autoit][autoit]

    $rc=Run(@ComSpec & ' /c ' & $cmd, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $text = $text & @CRLF & StderrRead($rc)
    If @error Then ExitLoop
    WEnd

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "STDOUT read:", $text)

    [/autoit]

    Das bewirkt dann die Ausgabe der Cmd-Zeile:
    "D:\Programme\gpsbabel>D:\Programme\gpsbabel\gpsbabel -i gpx -f C:\programme\AutoIt\garmin.gpx -o garmin -F usb:"

    Wenn die Übertragung klappt, kommt keine Meldung.
    Evtl.Fehlermeldungen werden aber leider nicht mit obigem Code-Schnipsel angezeigt.

    Mir wäre schon sehr damit geholfen, wenn nach dem run- bzw. shellexecute-Befehl das Shell-Fenster nicht sofort wieder geschlossen werden würde.
    Wie kann man das erreichen ?

    Gruß
    Axel

    Einmal editiert, zuletzt von Axel_Zucker (18. September 2008 um 08:45)

  • Guten Morgen (sitzt Du eigentlich rund um die Uhr am PC ?),

    Hi,

    wenn es mehr nicht ist. Dann mach mal einfach @SW_SHOW und/oder /K anstatt /c (keep anstatt close ) :D

    Mega

    Das hatte ich schon probiert:
    /k lässt zwar das Shell-Fenster offen, aber es ist dann völlig leer.

    So wie in:

    [autoit]

    #include <GUIConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    $cmd='ipconfig -all'

    [/autoit][autoit][/autoit][autoit]

    $rc=Run(@ComSpec & ' /k ' & $cmd, '', @SW_SHOW, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit]


    Gruß
    Axel

  • Hi,
    sorry wenn die deine Frage vieleicht falsch verstanden habe, aber du möchtest die Ausgabe von "ipconfig -all" haben ist das richtig?
    Wenn ja habe ich eine Lösung die Funktioniert. Saß da nämlich auch dran, da ich heute auf die Version 3.2.12.1 installiert habe und alles stdout_read funktionierte nicht mehr.

    MfG
    Der_Doc

    • Offizieller Beitrag

    Hi,

    also ...

    1) Abfangen mit StdOut funktioniert nicht lt. deiner Aussage
    2) bei keep steht nichts in der Kommandozeile lt. deiner Aussage

    Wie wäre es, wenn du mal guckst ob die Meldungen irgendwie anders ausgegeben werden können? z.b. Parameter für ein log.

    Frage : Was machst du denn um die Fehler angezeigt zu bekommen? DosBox öffnen und dann starten und dann schreibt das Programm in die gleiche DosBox?

    Mega

    P.S.: Nein :D nicht wirklich. Aber schon viel ! :thumbup:

  • Hi,

    :thumbup: Fehler gefunden !!! :thumbup:

    [autoit]

    $cmd='start ' & $prog_path & 'gpsbabel -i gpx -f "' & @ScriptDir & '\garmin.gpx" -o garmin -F usb:'
    $rc=Run(@ComSpec & ' /c ' & $cmd, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit][autoit][/autoit][autoit][/autoit]

    Da steht ein 'start' zuviel ! Und 'cmd /c (oder /k) start...' führt zu solch seltsamen Effekten.
    Jetzt klappt es auch mit dem StderrRead.

    Dank an alle und speziell an Mega für die unendliche Geduld und die "Rund um die Uhr"-Betreuung :)

    Axel

  • Hi nur kann es sein das in der neuen Version die Abfrage mit StdoutRead irgendwie geändert wurde?

    Ich muß die Abfrage von StdoutRead in eine While-Schleife packen vorher ging das anders, da hat es so gereicht

    [autoit]

    $pid = Run(@ComSpec & " /c ipconfig /all", "", "", 2)
    $ausgabe = StdoutRead($pid)

    [/autoit]

    Nun muß das ganze in eine Schleife weil die erste Antwort leer ist ;(
    Das hat mich schon 2 Std heute gekostet.

    MfG
    Der_Doc

    • Offizieller Beitrag

    Hi,

    ja das wurde komplett neu geschrieben.

    Nutze einfach

    [autoit]

    Func _getDOSOutput($command)
    Local $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2 + 4)
    While 1
    $text &= StdoutRead($Pid, False, False)
    If @error Then ExitLoop
    Sleep(10)
    WEnd
    Return $text
    EndFunc ;==>_getDOSOutput

    [/autoit]

    Mega