Fehlercode aus Batch auslesen

  • Hallo, bin absoluter Newbie was AutoIt betrifft!

    Ich möchte gerne wissen, ob es möglich ist, einen Error-Code aus einer Batch-Datei per AutoIt auszulesen - hier das kleine Skript:

    Die Variable $PW für das Passwort wird oben deklariert ("anwender123") und per "net user" für den Benutzer "anwender" geändert.

    Als nächstes wird die Eingabeaufforderung geöffnet, die wiederum eine neue mit diesem Benutzer startet.

    Als Passwort habe ich unten extra ein anderes gewählt ("anwender321"), damit in der Batch ein Fehler entsteht! ;)

    Nun zu meiner Frage:

    Kann ich mit "@error" oder einem anderen Befehl den in der Batch enstandenen Fehler "feststellen" und im Falle eines Fehlers in AutoIt implementieren?

    Tut mir leid, falls meine Ausdrucksweise vllt. nicht ganz "fachmännisch" ist - bitte nur um Hilfe! :)

    LG Stefan

    Einmal editiert, zuletzt von Bitnugger (15. Oktober 2021 um 22:30) aus folgendem Grund: Script in Code-Tags gesetzt

  • Kann ich mit "@error" oder einem anderen Befehl den in der Batch enstandenen Fehler "feststellen" und im Falle eines Fehlers in AutoIt implementieren?

    Ja, das kannst du, dazu musst du dem Befehl Run('CMD.exe') ein paar mehr Parametern mitgeben.

    Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))

    Schau dir dazu auch mal die Funktion StderrRead an...

    Ja, und herzlich Willkommen hier im Forum!

    PS: Setze deine Scripte demnächst bitte in Code-Tags, damit man sie besser lesen kann. Das ist im Forumseditor das dritte Symbol von rechts: </> - wenn du anschließend auf Quellcode klickst, kannst du die Syntax-Hervorhebung noch auf AutoIt umstellen, weil die Automatische Erkennung anscheinend nicht funktioniert. -- Ich war mal so frei und habe deinen ersten Beitrag in Code-Tags gesetzt.

  • Schaust du hier: Run , @ComSpec

    1. Parameter

    @ComSpec wird im Normalfall zu "C:\Windows\System32\cmd.exe" (64bit) oder "C:\Windows\SysWOW64\cmd.exe" (32bit) aufgelöst. Damit stellst du sicher, dass der im System voreingestellte Interpreter aufgerufen wird. Man kann natürlich auch einfach "cmd.exe" schreiben... aber mit dem Marko ist es sicherer. @ComSpec (cmd.exe) wird benötigt, wenn CMD-interne Befehle (z.B. echo) oder eine Batch-Datei ausgeführt werden soll, oder wenn eine Pipe (z.B. dir c:|clip) oder Umleitung (z.B. dir c: >m:\c-dir.txt) benötigt wird. Um z.B. einfach nur den Windows-Explorer zu starten, reicht ein Run("explorer.exe")

    /c

    gibt an, dass die CMD.exe nach Ausführung des Befehls beendet werden soll. Mit /k würde das CMD-Fenster offen bleiben.

    'commandName'

    ist ja eigentlich selbsterklärend... ist der Befehl, der in der CMD ausgeführt werden soll... das könnte z.B. 'dir c:' sein.

    2. Parameter

    ""

    Hier kannst du das Arbeisverzeichnis angeben. Das wirkt dann wie ein CD "Balbla...".

    3. Parameter

    @SW_HIDE (CMD-Fenster wird nicht angezeigt) oder @SW_SHOW (CMD-Fenster wird angezeigt)... es gibt noch andere Werte für @SW_* -ist aber hier nicht relevant.

    4. Parameter

    opt_flag

    BitOR($STDERR_CHILD, $STDOUT_CHILD)

    Stellt ein Handle zum *-Stream des Child-Fensters bereit. Hier in unserem Fall also für StderrRead und StdoutRead. Dadurch kannst du dann die Ausgaben des Progamms im CMD-Fenster auslesen.

    Anstelle von BitOR könnte man hier auch einfach ein + nehmen... mit BitOR ist aber sicherer.

    Relevante Themen: ConsoleRead, ProcessClose, RunAs, RunAsWait, RunWait, ShellExecute, ShellExecuteWait, StderrRead, StdinWrite, StdioClose, StdoutRead

    Die Konstanten $STDERR_CHILD, $STDOUT_CHILD sind in AutoItConstants.au3 definiert.

    Hier ein Bsp.:

    2 Mal editiert, zuletzt von Bitnugger (16. Oktober 2021 um 22:35) aus folgendem Grund: Bsp. etwas erweitert.