_RunWait

    • Offizieller Beitrag

    Hallo

    Die funktion ist warlich keine meisterleistung.. Habe sie nur gemacht weil ich sie sehr oft brauche! Und desswegen wollte ich sie euch nicht Vorenthalten:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    FileDelete(@ScriptDir&"\test.bat")
    FileWrite(@ScriptDir&"\test.bat","@echo off"&@CRLF&"echo Hallo, ich bin ein Test"&@CRLF&"whupsEinFalscherBefehl!")

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

    $aRunRead = _RunWait("test.bat", '', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD, 2)
    If @error = 1 Then Exit MsgBox(16,"","File does not exists!")
    $sMessage = "StdOut: "&@CRLF&$aRunRead[0]
    $sMessage &= @CRLF
    $sMessage &= "StdErr: "&@CRLF&$aRunRead[1]
    $sMessage &= @CRLF
    If @error = 2 Then $sMessage &= "============"&@CRLF&"Timeout reached!"
    MsgBox(0, "",$sMessage)

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

    ;===============================================================================
    ;
    ; Function Name: _RunWait
    ; Description:: Wartet bis eine Exe beendet, genauso wie RunWait (autoit) nur mit dem unterschied das die Exe ein Std I/O Stream ausgibt, und das es ein TimeOut gibt
    ; Parameter(s): $sExe: Der Name der Datei (EXE, BAT, COM, PIF), die Ausgeführt werden soll.
    ; $sWorkindir: [optional] Das Arbeitsverzeichnis.
    ; $sFlag: [optional] Das Flag wie das Programm gestartet werden soll (Siehe Run in der AutoIt Hilfe)
    ; $iIOFlag: [optional] Das Handle zu einen oder mehreren STD Input/Output streams des child prozesses. (siehe Run in der AutoIt Hilfe)
    ; $iTimeOut: [optional] Zeitbegrenzung in Sekunden! Danach wird das Programm automatisch geschlossen.(mit ProcessClose)
    ; Requirement(s): -
    ; Return Value(s): Beim Erfolg: gibt ein Array zurück:
    ; $aReturn[0] = StdOut Read
    ; $aReturn[1] = StdErr Read
    ; Beim Error:
    ; @error = 1: Run hat ein Fehler ausgeben (extended: non-zero int) --> Return: 0
    ; @error = 2: Timeout wurde erreicht --> Return: Array, wie beim Erfolg
    ; Author(s): GtaSpider
    ;
    ;===============================================================================
    ;

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

    Func _RunWait($sFilename, $sWorkingdir = "", $sFlag = "", $iIOFlag = "", $iTimeOut = 0)
    Local $aReturn[2]
    Local $pid = Run($sFilename, $sWorkingdir, $sFlag, $iIOFlag)
    If @error Then Return SetError(1,@error,0)
    Local $iPWC = ProcessWaitClose($pid,$iTimeOut)
    $aReturn[0] = StdoutRead($pid)
    $aReturn[1] = StderrRead($pid)
    If Not $iPWC Then
    ProcessClose($pid)
    SetError(2)
    EndIf
    Return $aReturn
    EndFunc ;==>_RunWait

    [/autoit]

    Mfg Spider

    Edit 20.02.2010: Mal eine neue Version veröffentlicht, jetzt mit ProcessWaitClose.
    Achtung, zwei Änderungen:
    Erstens: Funktion gibt jetzt ein Array zurück (siehe Beschreibung)
    Zweitens: TimeOut ist nicht mehr Millisekunden, sondern Sekunden

  • nicht schlecht spider ;)
    ich denke bei meinen späteren Scripten könnte ich sowas vll mal brauchen.. :klatschen:
    auch wenns sowas ähnliches in autoit gibt muss man das ja nicht unbedingt nutzen ;)

    • Offizieller Beitrag

    Hallo

    Danke snoozer! Naja ich brauchte das halt oft wegen dem StdOut read..und RunWait unterstüzt ja leider kein Std I/O stream :( naja und die timeout funktion brauch ich eigrntlich eher selten, aber ich meine damit das immerhin reinstellbar ist.. lieber zu viel als zu wenig ;)

    Mfg Spider

  • Wissen wir :)
    Wissen wir auch :)
    Das 3e macht mir doch ein bisschen Angst^^

    Und unsere Spinne ist kein Freak :P
    Nur interessiert ;)

    ps hallo ;)

    • Offizieller Beitrag

    Hallo!

    Cool^^ ich hab grade eben über deinem post, huggy mein 777sten post gemcaht.. und du dein 333sten^^ und beide mal wider durch Spam/Off Topic :D (meins is offtopic und deins is spam :keks: )

    @leviathan: du lachst.. aber ich musste ein freund meines vater W-Lan einrichten und dann kahm ich bei ihm an und er fragt erstmal: "Wo ist denn das W-Lan kabel?" :schild4:

    Mfg Spider

  • Hi,

    mir fiel auf, dass die Funktion _RunWait im Falle eines Timeouts, keinen Standard-Stream zurück gibt, was wohl daran liegt, dass der Prozess geschlossen wird bevor überhaupt ein StdRead ausgeführt wird. Daher mal hier, die von mir gefixede Variante:
    _RunWait.au3:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------
    UDF Name..........: _RunWait
    UDF Version.......: 1.0
    Change Date.......: 2008-07-27
    UDF Description...: Runs an external program and pauses script execution until the program finishes.

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

    Author(s).........: gtaspider <[email='gtaspider@autoit.de'][/email]>
    teh_hahn <[email='sPiTsHiT@gmx.de'][/email]>
    Company...........: none
    URL...............: http://www.autoit.de/

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

    Parameter(s)......: $s_filename - The name of the executable (EXE, BAT, COM, or PIF) to run.
    $s_workingdir - [optional] The working directory.
    $s_flag - [optional] The "show" flag of the executed program:
    @SW_HIDE = Hidden window
    @SW_MINIMIZE = Minimized window
    @SW_MAXIMIZE = Maximized window
    $_stdioflag - [optional] Provide a meaningful handle to one or more STD I/O streams of the child process.
    1 ($STDIN_CHILD) = Provide a handle to the child's STDIN stream
    2 ($STDOUT_CHILD) = Provide a handle to the child's STDOUT stream
    4 ($STDERR_CHILD) = Provide a handle to the child's STDERR stream
    $i_timeout - [optional] Specifies the timeout of the process in milliseconds.
    Return Value......: Success: Returns the STDOUT output
    Failure: Returns the STDOUT / STDERR output depending on @error
    When the function fails @error contains extended information:
    1 = The return value contains the STDERR output.
    2 = The application has a timeout and the return value contains the STDOUT output.
    3 = The application has a timeout and the return value contains the STDERR output.
    AutoIt Version....: 3.2.6.0
    Note(s)...........: none
    #ce ----------------------------------------------------------------------------
    Func _RunWait(Const $S_FILENAME, Const $S_WORKINGDIR = "", Const $S_FLAG = "", Const $_STDIOFLAG = "", Const $I_TIMEOUT = 0)
    Local Const $I_PID = Run($S_FILENAME, $S_WORKINGDIR, $S_FLAG, $_STDIOFLAG)

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

    If $I_TIMEOUT Then Local $d_timerinit = TimerInit()

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

    While ProcessExists($I_PID)
    If $I_TIMEOUT Then
    If TimerDiff($d_timerinit) >= $I_TIMEOUT Then ExitLoop
    EndIf
    WEnd

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

    If ProcessExists($I_PID) Then
    ProcessClose($I_PID)
    Local $s_stderr = StderrRead($I_PID)
    If $s_stderr Then Return (SetError(2, 0, $s_stderr))

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

    Return (SetError(3, 0, StdoutRead($I_PID)))
    EndIf

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

    Local $s_stderr = StderrRead($I_PID)
    If $s_stderr Then Return (SetError(1, 0, $s_stderr))

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

    Return (StdoutRead($I_PID))
    EndFunc ;==>_RunWait

    [/autoit]


    Example.au3:

    Spoiler anzeigen
    [autoit]

    #include "RunWait.au3"

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

    Local Const $i_pid = _RunWait(@ComSpec & " /c cd.exe BlaBlub12345", "", @SW_HIDE, 6, 0)
    If @error = 1 Then Exit(MsgBox(16, "Error 1", "Das Programm hat einen Error ausgegeben (StdErr):" & @CRLF & @CRLF & $i_pid))
    If @error = 2 Then Exit(MsgBox(16, "Error 2", "Das Programm hat ein Timeout mit Error Ausgabe (StdErr):" & @CRLF & @CRLF & $i_pid))
    If @error = 3 Then Exit(MsgBox(48, "Error 3", "Das Programm hat ein Timeout mit Standard Ausgabe (StdOut:)" & @CRLF & @CRLF & $i_pid))
    Exit(MsgBox(64, "Erfolg", $i_pid))

    [/autoit]

    2 Mal editiert, zuletzt von teh_hahn (28. August 2007 um 08:01)