Batch in Autoit übersetzen

  • Hallo,

    ein etwas peinliches Thema, aber ich steh irgendwie total auf dem Schlauch.

    Ich hab folgende batch Datei:

    Code
    echo standby 0 | cec-client.exe -s

    Und möchte diesen Aufruf in einem autoit Skript direkt verwenden.
    Leider klappt das nicht wie gewünscht.

    cec-client.exe ist ein wrapper um die libcec.dll um Hdmi-cec Befehl vom PC aus zu versenden:
    http://libcec.pulse-eight.com/

    Die Batch-Zeile hab ich hier abgeschrieben: http://forums.pulse-eight.com/yaf_postst617_…mmand-line.aspx
    "standy 0" ist Teil des Befehls und muss irgendwie an den cec-client übergeben werden. Nur ist mir die Syntax nicht klar.

    Vielleicht kann jemand der fit in Sachen batch und cmdline ist kurz drüberschauen?

    Gruß & danke Nuts

    Einmal editiert, zuletzt von nuts (8. November 2012 um 15:09)

  • Zwei Möglichkeiten:

    1.: Über Batch gehen. Soll heißen: Die Befehlszeile in eine *.bat-Datei schreiben und diese ausführen. Nicht zu empfehlen, denke ich.

    2.: Über Run/ShellExecute ausführen. Sähe so aus (ECHO muss nicht ausgeführt werden):

    [autoit]


    Run("cec-client.exe -s")
    ShellExecute("cec-client.exe", "-s")

    [/autoit]

    lg chess

  • [autoit]

    Run("cec-client.exe standby 0 -s")

    [/autoit]


    oder

    [autoit]

    Run(@ComSpec & "/c echo standby 0 | cec-client -s")

    [/autoit]


    funktioniert eines der beiden?

    EDIT: Mann, schon wieder zu langsam ;)

    Gruss Shadowigor

  • Wenn meine 2. Variante nicht funktioniert, liegt es vermutlich an deiner Batch-Zeile. Das sollte ihre 1-zu-1 Übersetzung sein. Bekommst du einen Fehler? Liegt die exe vielleicht in einem anderen Ordner?

    EDIT: Korrektur:

    [autoit]

    Run(@ComSpec & " /c echo standby 0 | cec-client -s")

    [/autoit]


    Leerzeichen vergessen :whistling:

  • Ein Befehl hinter ECHO wird aber nicht ausgeführt, sondern als Text ausgegeben. So habe ich es zumindest in Erinnerung.
    Oder verstehe ich hier gerade was falsch?

    lg chess

  • Das '|' ist eine Pipe und schreibt den StdOut des ersten Programm in den StdIn des 2. statt auf den schirm. Die ausgabe wird dadurch "umgelenkt". Man könnte es natürlich auch mit StdinWrite versuchen.

  • Die Batch funktioniert natürlich.
    Batch, cec-client und autoit Skript liegen im gleichen Ordner.

    Mit Variante 2:

    [autoit]

    Run(@ComSpec & "/c echo standby 0 | cec-client.exe -s")

    [/autoit]


    Wird die Run Funktion auch mit einem Fehler (@error=1) verlassen.

  • Wenn meine 2. Variante nicht funktioniert, liegt es vermutlich an deiner Batch-Zeile. Das sollte ihre 1-zu-1 Übersetzung sein. Bekommst du einen Fehler? Liegt die exe vielleicht in einem anderen Ordner?

    EDIT: Korrektur:

    [autoit]

    Run(@ComSpec & " /c echo standby 0 | cec-client -s")

    [/autoit]


    Leerzeichen vergessen :whistling:

    Danke schön.
    So funktionierts. :thumbup:

    Edit\
    Das mit den Pipes war mir komplett neu.
    Denke jetzt ist es auch klar was da passiert. :thumbup:

  • So und jetzt nochmal richtig. :D

    [autoit]


    #include <constants.au3>

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

    Global $path ="C:\Program Files\Pulse-Eight\USB-CEC Adapter\cec-client.exe -s"
    Global $run=run($path, "", @SW_HIDE, $STDIN_CHILD)

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

    StdinWrite($run, "standby 0")
    StdinWrite($run)

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

    Danke nochmal für den Hinweis Shadowigor!