Aufruf eines zweiten Skripts mit Parameterübergabe und -rückgabe

  • Hallo zusammen

    Nachdem ich nun so ziemlich alles abgesucht habe und nicht fündig wurde, erlaube ich mir, die Frage hier zu stellen.

    Ein Hauptskript läuft als Server und sollte während der Laufzeit in der Lage sein, weitere Skripte aufzurufen und deren Ausgabe entgegen zu nehmen.

    Der Aufruf mit Parametern ist ja kein Problem z.B. mit Run, doch wie bekomme ich deren Rückgabewerte in das Hauptskript?

    Den Umweg über Dateien kenne ich, finde ihn aber weder schnell noch elegant. Meiner Ansicht nach müsste das eine Standardproblemstellung sein, zu der auch schon Lösungen existieren. Irgendwie stehe ich aber auf dem Schlauch oder habe ein Brett vor dem Kopf, jedenfalls finde ich auch im Netz gerade mal gar nichts. :(

    Wer schubst mich mit Tipps, Stichworten oder Links in die richtige Richtung?

    Danke.

    Einmal editiert, zuletzt von FeliXYZ (9. Dezember 2011 um 09:01)

  • Der Server könnte die Daten auslesen, die die Skripte mit ConsoleWrite() in die Konsole schreiben.

    Beispiel aus der Hilfe
    [autoit]

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

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

    Local $foo = Run(@ComSpec & " /c dir foo.bar", @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]


    MfG, James C.

  • Wenn Du auf dem Server mit RunWait arbeitest, dann kannst Du den Rückgabewert mit Exit zurückgeben.

    Also im Unterprogramm am Schluss einfach ein Exit($ReturnValue) und schon kommt dieser Wert bei RunWait im Hauptprogramm wieder raus :)

  • Ciao James C.

    Der Server könnte die Daten auslesen, die die Skripte mit ConsoleWrite() in die Konsole schreiben.

    Ja, ein erster kurzer Test verlief gut. Muss diesen Weg noch etwas ausloten, scheint aber die richtige Richtung zu sein.

    Danke.

  • Ciao veronesi

    Wenn Du auf dem Server mit RunWait arbeitest, dann kannst Du den Rückgabewert mit Exit zurückgeben.

    Gemäss Hilfe ist das auf einen Integer beschränkt, hatte ich schon entdeckt und genau deswegen verworfen. Habs jetzt doch noch getestet, einen String bringe ich so leider nicht rüber (wäre aber zu schön gewesen). Hilfetext ist also korrekt.

    Danke.

  • Das ist Richtig.
    Aber in der Regel reicht ja auch ein Integer Wert.
    Z.B. 1 = Erfolgreich / 0 = Fehler / < 0 = Fehlerwert

    Damit kannst Du schon viele Stati übermitteln.
    Ich dachte, dass Du das mit Rückgabewert haben möchtest!

  • Eine Lösung wäre, das deine verschiedenen Programme über TCP-Ports miteinander reden - Das Hauptprogramm lauscht auf einem Port, die Subprogramme melden dahin zurück
    (Siehe Hilfe zu TCPListen / TCPRecv / TCPAccept und die vielen Beispielprogramme über Netzwerk Chat Programme hier unter autoit.de)
    Du kannst ja auch lokal über diese Netzwerkports kommunizieren. Kann dann höchstens sein, das beim ersten Start deiner Programme die Firewall aufpoppt und fragt ob denn das so in Ordnung wäre.

    Alternative1: Wie oben beschrieben mit ConsoleWrite etc.
    Alternative2: Doch mit Dateien im Tempordner (SubScript bekommt Dateinamen als Paramenter, durch Returnwert weist ob es fertig ist)
    Alternative3: Im Prinzip das gleiche wie mit den Dateien, doch du nimmst Registry-Schlüssel

  • Zitat

    Aber in der Regel reicht ja auch ein Integer Wert.

    Naja, ich schrieb "und deren Ausgabe entgegen zu nehmen".

    Mit stdoutRead und ConsoleWrite klappt es wie gewünscht:

    server.au3

    [autoit]


    $foo = Run("AutoIt3.exe test.au3", "", @SW_MAXIMIZE, $STDIN_CHILD + $STDOUT_CHILD)
    While True
    $data &= StdoutRead($foo)
    If @error Then ExitLoop
    Sleep(25)
    WEnd
    MsgBox(0, "SERVER", $data)

    [/autoit]


    und test.au3

    [autoit]

    ConsoleWrite("TRANS-DATA")

    [/autoit]

    Danke euch beiden.

  • Zitat

    über TCP-Ports miteinander reden

    Das wäre noch eine Möglichkeit, bin aber nicht sicher, welche Komplexität ich mir damit einhandle, denn mein Server-Skript hat schon offene Sockets zur Kommunikation mit Clients, welche die zusätzlichen Skripte aufrufen (nicht unähnlich einem Web-Server, nur dass nicht nur statische HTML-Seiten benötigt werden, sondern ganze Funktionalitäten, welche ich nicht in das Server-Skript direkt einprogrammieren will, da sie zu oft ändern können).

    Zitat

    Alternative1: Wie oben beschrieben mit ConsoleWrite etc.
    Alternative2: Doch mit Dateien im Tempordner (SubScript bekommt Dateinamen als Paramenter, durch Returnwert weist ob es fertig ist)
    Alternative3: Im Prinzip das gleiche wie mit den Dateien, doch du nimmst Registry-Schlüssel


    2) möchte ich der Performance wegen vermeiden, ausserdem solls auf einem Mini-System mit Flashdisk laufen, da ist Speicherplatz ein kostbares Gut.
    3) da bin ich allergisch drauf, sorry, die Registry halte ich für ein komplettes Fehlkonstrukt von MS, da fummle ich nicht drin rum ausser es geht wirklich nicht anders.

    Von Konzept her ist Stdin/Stdout ja schon der richtige Weg, war einfach etwas überrascht, dass mir AutoIt nicht gleich die Parameterübergabe schon anbietet: $return = run("skript") wäre ja simpel, PID und Error hätte man z.B. zusammen mit dem Output in ein Array legen können.

    Danke auch dir fürs mitdenken. Kann man als gelöst markieren (kann/muss ich das selber?)

  • Danke auch dir fürs mitdenken. Kann man als gelöst markieren (kann/muss ich das selber?)


    Ja , musst den ersten Beitrag bearbeiten (Button rechts unten darunter) und dann die Auswahl ändern und wieder speichern.

    ^^ Und beim Thema Registry bin ich ganz anderer Meinung - ein großartiger Meilenstein von MS - und das ist auch gut so :)

    Aber die Diskussion darüber gehörte Wohl in den "Sonstiges" Bereich - und gewinnen kann die eh keiner :) Also jeder wie er es mag.

    PS: mit stdoutRead habe ich schon mal in Verbindung mit meinen VMware SRA für Datacore gearbeitet - aber das ich das so für den Austausch nehmen ist mir auch erst seit diesem Thread hier bewusst - wieder etwas gelernt!