[Frage Sammelthread] STD... | Erklärung bzw. Antworten

  • Hallo Community :D

    Ich versuche jetzt seit längeren die 4 Funktionen (+ 1 Parameter) auf die schliche zu kommen:

    [autoit]

    Run() ;~ Spezifisch der 2. Parameter
    StderrRead()
    StdinWrite()
    StdioClose()
    StdoutRead()

    [/autoit]

    Auf Wikipedia habe ich dies dazu gefunden:
    Wikipedia - Standard-Datenströme

    Dazu diverse Seiten! Allerdings auf Englisch. Leider konnte ich nichts wichtiges was ich bereits von Wikipedia weiß daraus lernen. Auch nicht mit dem Google Übersetzer. Daher stelle ich meine Fragen bezüglichst mit der Programmierung hier.


    Run - 2. Parameter [gelöst] (Das stand zwar jetzt nicht in dem Wikipedia Beitrag, aber was wirklich sinnvollen habe ich nicht gefunden.)
    Der Pfad, in dem das Programm ausgeführt werden soll (Arbeitsverzeichnis). Dies ist nicht der Pfad des Programms.

    Frage 1: Welche Rolle spielt der Pfad? Hat das irgendwelche auswirkungen auf die ausführbarkeit der exe die ich damit starte?


    Frage 2: Muss mein Arbeitsverzeichnis (@WorkingDir) angegeben werden oder ist jedes Verzeichnis möglich?


    Frage 3: Was bringt die Angabe des Arbeitsverzeichnisses?

    Danke an funkey für den nützlichen Link ^^ >> http://www.delphi-treff.de/tipps/dateienv…chnis-arbeiten/
    Dies habe ich dazu auch noch gefunden:

    Zitat

    Genau genommen ist das Arbeitsverzeichnis kein “automatisches” Verzeichnis und nicht wirklich festgelegt. Wie der Name schon sagt, soll in diesem Verzeichnis “gearbeitet” werden. Also Dateien gelesen und geschrieben werden. Man könnte auch sagen, dass das Arbeitsverzeichnis für jede Datei anders ist. nämlich genau das Verzeichnis in dem die Datei liegt (oder abgelegt wird).


    Quelle: http://blog.nigjo.de/netbeans/2010/05/verzeichnistypen/


    StderrRead und StdoutRead [gelöst]
    Liest eine Anzahl von Zeichen aus einem STDERR-Stream eines zuvor gestarteten Child-Prozesses ein.

    Dazu habe ich mir das Beispiel in der Hilfe angeschaut: (leicht verändert | Zeile 4)

    Spoiler anzeigen
    [autoit]

    ; Demonstriert StdoutRead()
    #include <Constants.au3>

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

    Local $foo = Run(@ScriptDir & '/Output.exe', @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDOUT gelesen:", $line)
    WEnd

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

    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDERR gelesen:", $line)
    WEnd

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

    MsgBox(0, "Debug", "Wie aufregend...")

    [/autoit]

    Dazu der Inhalt der Output.exe:

    [autoit]

    ConsoleWrite('Make-Grafik')
    ConsoleWrite('Make-Grafik Error') ;~ Hinzugefügt
    Sleep(10000) ;~ Hinzugefügt

    [/autoit]



    Frage 1: Wieso liest StdoutRead nichts aus aber dafür StderrRead?


    Frage 2: Wieso liest StderrRead nichts aus, wenn ich Zeile 6 bis 10 auskommentiere?

    Spoiler anzeigen
    [autoit]

    ; Demonstrates StdoutRead()
    #include <Constants.au3>

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

    Local $foo = Run(@ScriptDir & '/Output.exe', @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    ;~ While 1
    ;~ $line = StdoutRead($foo)
    ;~ If @error Then ExitLoop
    ;~ MsgBox(0, "STDOUT read:", $line)
    ;~ WEnd

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

    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDERR read:", $line)
    WEnd

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

    MsgBox(0, "Debug", "Exiting...")

    [/autoit]

    Danke an Shadowigor >> Post #6
    Auch ein Danke an misterspeed für den Hinweis >> Post #7 (Die Antwort hat euch vor einer weiteren Frage bewahrt ^^)

    StdinWrite [gelöst]
    Hier wieder das veränderte Script (Zeile 4)

    Spoiler anzeigen
    [autoit]

    ; Demonstriert den Gebrauch von StdinWrite()
    #include <Constants.au3>

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

    Local $foo = Run('Output.exe', @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    ; Schreibt den zu sortierenden String in sort.exe's STDIN
    StdinWrite($foo, "Ratte" & @CRLF & "Katze" & @CRLF & "Fledermaus" & @CRLF)
    ; Aufruf ohne zweites Argument schliesst den Stream
    StdinWrite($foo)

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

    ; Lies aus dem Child's STDOUT und zeige es an
    Local $data
    While True
    $data &= StdoutRead($foo)
    If @error Then ExitLoop
    Sleep(25)
    WEnd
    MsgBox(0, "Debug", $data)

    [/autoit]

    Frage 1: Wieso kommt als Ausgabe "Make-Grafik"? Sollte dort nicht "Ratte Katze Fledermaus" erscheinen? Hier das Orginal Beispiel:

    Spoiler anzeigen
    [autoit]

    ; Demonstriert den Gebrauch von StdinWrite()
    #include <Constants.au3>

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

    Local $foo = Run("sort.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    ; Schreibt den zu sortierenden String in sort.exe's STDIN
    StdinWrite($foo, "Ratte" & @CRLF & "Katze" & @CRLF & "Fledermaus" & @CRLF)
    ; Aufruf ohne zweites Argument schliesst den Stream
    StdinWrite($foo)

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

    ; Lies aus dem Child's STDOUT und zeige es an
    Local $data
    While True
    $data &= StdoutRead($foo)
    If @error Then ExitLoop
    Sleep(25)
    WEnd
    MsgBox(0, "Debug", $data)

    [/autoit]

    Ich habs verstanden :D

    +++++ | +++++ | +++++ | +++++ | +++++

    Ich möchte mich hier Vorweg schonmal bedanken :) Ich weiß das es nicht selbstverständlich ist auf meine Fragen zu Antworten! Deswegen bin ich für jeden Tipp / Hinweis / Antwort wirklich sehr dankbar :D | Ich bemühe mich auch das ganze schnell zu verstehen ^^

    Mfg. Make-Grafik

    6 Mal editiert, zuletzt von Yjuq (24. November 2012 um 14:58)

  • Nein :D
    Okey, das ist doch mal ein nützlicher tipp ^^ Dann teste ich das ganze als Consolenanwendung x.x :D

    Eidt >> Habe das ganze nun als Consolenanwendung getestet. Es ergibt sich daraus kein sichtlicher unterschied.

  • Ja, bei mir funktionieren die Beispiele ja auch alle :D
    >> Nur es gibt keinen sichtlichen unterschied als ob ich es als Consolenanwendung kompiliert habe oder nicht ^^


    Es wäre schön wenn auf die Fragen eingegangen wird ^^
    >> So komme ich leider derzeitig nicht weiter ;D

    Aber danke für den Link funkey. Ich schaue mir diesen jetzt an.

  • Also wenn du ConsoleWrite benutzt müsstest du es eigentlich nur mit StdoutRead lesen können. StderrRead liest daten welche mit ConsoleWriteError geschrieben wurden. Deinen Fehler kann ich mir allerdings nicht erklären. Bei deinem Problem mit StdinWrite kommt es ganz darauf an was in dem aufgerufenen Script steht. Dort sollte wohl sowas stehen wie

    [autoit]

    Local $line

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

    While Not @error
    $line &= ConsoleRead()
    Sleep(10)
    WEnd

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

    ConsoleWrite($line)

    [/autoit]


    Dann sollte es eigentlich funktionieren.

    Gruss Shadowigor

  • Dazu der Inhalt der Output.exe:

    [autoit]


    ConsoleWrite('Make-Grafik')

    [/autoit]

    Frage 1: Wieso liest StdoutRead nichts aus aber dafür StderrRead?


    Sofern deine Output.exe wirklich nur diese eine Zeile enthält wird es daran liegen, dass die Output.exe längst beendet ist bevor das erstemal versucht wird den stdout stream zu lesen. Dies scheitert dann einfach, weil der Prozess nicht mehr existiert.
    Du solltest also ein kurzes sleep ans Ende der Output.exe setzen, damit das lesende Script noch die Möglichkeit hat den stdout Buffer auszulesen.

  • Danke euch dreien :D Solangsam verstehe ich das ganze :)

    Allerdings bleibt noch eine Frage offen :D Aber dank euch dreien bin ich schon um einiges weiter ^^


    Edit:
    Aha :D So ist das ^^ Zu jeder Funktion (außer StdioClose()) gibt es eine gegenfunktion :D Einmal zum schreiben und einmal zum lesen. Dabei sind 3 Streame zum verwenden möglich :D

    [autoit]

    ;~ ConsoleWriteError > STDERR-Stream > Schreiben
    ;~ StdinWrite > STDIN-Stream > Schreiben
    ;~ ConsoleWrite > STDOUT-Stream > Schreiben
    ;~ - - - - - - - - - - - - - - - - - - - - - - -
    ;~ StderrRead > STDERR-Stream > Lesen
    ;~ ConsoleRead > STDIN-Stream > Lesen
    ;~ StdoutRead > STDOUT-Stream > Lesen
    ;~ +| --------------------------------------------- |+
    ;~ StdioClose > STDIO-Stream > Schließen

    [/autoit]

    STDERR-Strem >> Für Fehler Meldungen?
    STDIN-Stream >> Eingaben von Script B für Script A?
    STDOUT-Stream >> Eingaben von Script A für Script B?


    Bitte berichtigt mich wenn ich irgendwo falsch liege :D Ich lerne das ganze gerade neu ^^


    Edit 2:
    Ich habs jetzt verstanden :D Yea :P Danke euch allen ^^

    Output.exe Inhalt:

    Spoiler anzeigen
    [autoit]

    ;~ ConsoleWriteError > STDERR-Stream > Schreiben
    ;~ StdinWrite > STDIN-Stream > Schreiben
    ;~ ConsoleWrite > STDOUT-Stream > Schreiben
    ;~ - - - - - - - - - - - - - - - - - - - - - - -
    ;~ StderrRead > STDERR-Stream > Lesen
    ;~ ConsoleRead > STDIN-Stream > Lesen
    ;~ StdoutRead > STDOUT-Stream > Lesen
    ;~ +| --------------------------------------------- |+
    ;~ StdioClose > STDIO-Stream > Schließen

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

    Do
    Sleep(1000)
    Until ConsoleRead(True) <> ''
    ;~ Wartet bis in den STDIN-Stream geschrieben wurde

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

    MsgBox(0, '', ConsoleRead(), 1)

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

    ConsoleWrite('Ausgabe')

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

    Do
    Sleep(1000)
    Until ConsoleRead(True) <> ''

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

    Exit

    [/autoit]

    Script:

    Spoiler anzeigen
    [autoit]

    ;~ ConsoleWriteError > STDERR-Stream > Schreiben
    ;~ StdinWrite > STDIN-Stream > Schreiben
    ;~ ConsoleWrite > STDOUT-Stream > Schreiben
    ;~ - - - - - - - - - - - - - - - - - - - - - - -
    ;~ StderrRead > STDERR-Stream > Lesen
    ;~ ConsoleRead > STDIN-Stream > Lesen
    ;~ StdoutRead > STDOUT-Stream > Lesen
    ;~ +| --------------------------------------------- |+
    ;~ StdioClose > STDIO-Stream > Schließen

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

    #include <Constants.au3>
    ;~ Hier drin befinden sich die Variablen $STDIN_CHILD und $STDOUT_CHILD

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

    $PID = Run('Output.exe', @ScriptDir, @SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD)
    ;~ Startet die Output.exe und stellt ein Handle zum STDIN-Stream und STDOUT-Stream des Child-Fensters bereit
    If Not $PID Then
    MsgBox(0, '', 'Error: ' & @error, 1)
    Exit
    EndIf
    ;~ Gibt es beim Startet der Output.exe einen Fehler, so wird dieses Script beendet

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

    Sleep(1000)

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

    StdinWrite($PID, 'Eingabe')
    ;~ Schreibt in den STDIN-Stream des zuvor gestarteten Child-Fenster

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

    Do
    Sleep(1000)
    Until StdoutRead($PID, True) <> ''
    ;~ Wartet bis in den STDOUT-Stream geschrieben wurde (Erwartet Rückgabe von Output.exe)

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

    MsgBox(0, '', StdoutRead($PID), 1)

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

    StdinWrite($PID, 'Exit')
    ;~ Schreibt in den STDIN-Stream des zuvor gestarteten Chilf-Fenster

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

    Do
    Sleep(1000)
    Until Not ProcessExists($PID)
    ;~ Wartet bis der Prozess beendet wurde (Output.exe)

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

    $r = StdioClose($PID)
    ;~ Schließt den STDIO-Stream des zuvor geöffneten Child-Fensters

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

    MsgBox(0, '', 'Exit', 1)

    [/autoit]


    Allerdings habe ich noch eine Frage zu $STDIO_INHERIT_PARENT und $RUN_CREATE_NEW_CONSOLE (siehe 4. Parameter "Run")
    Wenn ich z.B. Run('Output.exe', @ScriptDir, @SW_SHOW, $STDIO_INHERIT_PARENT) verwende, dann funktioniert das nicht mehr in meinen Script :D Woran liegt das?
    (Die beiden habe ich noch nicht durchblickt. Bei dem Rest ist alles okey und verstanden :D Danke, ihr seid super :D)

    4 Mal editiert, zuletzt von Yjuq (22. November 2012 um 23:24)

  • So weit ich das verstanden habe dreht $STDIO_INHERIT_PARENT das ganze um. Sprich Script2 kann dann z.B. per StdinWrite in den Stdin von Script 1 schreiben oder den Stdout von Script1 lesen. $RUN_CREATE_NEW_CONSOLE gibt Script2 eine eigene Konsole. Wird das Script als Konsolenprogramm kompiliert, läuft Script2 normalerweise in der selben Konsole wie Script1. Somit würden auch beide Scripts mit ConsoleWrite in das selbe Fenster schreiben. Mit $RUN_CREATE_NEW_CONSOLE kann man das umgehen und gibt Script2 eine eigene Konsole.

  • Ah okey :o

    Ich teste dann noch ein wenig :D
    Wenn das ganze dann zutrifft, dann setz ich das Thread auf [gelöst]

    Danke :D


    Shadowigor:
    Könntest du mir bitte ein Beispiel zu $STDIO_INHERIT_PARENT schreiben? Durch irgend einen Grund kann ich das nicht so umsetzen wie du es beschrieben hast. :)

    2 Mal editiert, zuletzt von Yjuq (23. November 2012 um 12:37)

  • Naja wenn ichs jetzt schreiben müsste, wüsste ich ehrlich gesagt auch nicht genau wie ^^ . So habe ich einfach die Hilfe verstanden. Ich denke aber nicht, dass diese Funktion oft verwendet wird und genauer kann ich es dir leider auch nicht beschreiben, da ich es auch noch nie so verwendet habe. Da soll lieber noch jemand antworten, der sich sicher ist.

  • Okey, ich setzt das Thread dann jetzt auf gelöst :)
    Alle Fragen sind ja beantwortet. Aber wer noch eine Antwort von Beispiel bezüglich Post #10 schreiben kann/will. Der kriegt ne Cola :D


    Na dann, danke an euch dreien :D Ihr habt mir sehr geholfen :P