2013-05-09 11 views
5

Ho il seguente codice per acquisire ed elaborare l'output del comando Esegui. Come posso modificarlo in modo tale che la finestra di comando Esegui venga visualizzata e allo stesso tempo venga registrata l'uscita? La sostituzione di @SW_HIDE con @SW_SHOW (o l'equivalente) mostra solo una finestra di comando vuota.Catturare e visualizzare STDOUT allo stesso tempo

Qualcosa di simile al comando linux tee che registra su file mentre stampa STDOUT.

$CurrentPID = Run(@ComSpec & ' /c ' & $CurrentLogCmd, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) 

If Not ProcessWaitClose($CurrentPID,60) Then 
    WriteLog("[Warning] Timed-out.Finding date in current hour raw log -" & $CurrentLogFileName) 
    $F_LogWarningExist = 1 
    Return $C_SUCCESS ; Take chances and proceed with parsing raw logs 
EndIf 

$CurrentOutput = StdoutRead($CurrentPID) 

risposta

3
ConsoleWrite(_getDOSOutput('ipconfig /all') & @CRLF) 

Func _getDOSOutput($command) 
    Local $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2 + 4) 
    While 1 
      $text &= StdoutRead($Pid, False, False) 
      If @error Then ExitLoop 
      Sleep(10) 
    WEnd 
    Return StringStripWS($text, 7) 
EndFunc ;==>_getDOSOutput 

Forse questo ti aiuta.

+1

In realtà ho bisogno che il testo da stampare sulla finestra in aggiunta al reindirizzamento ... sia possibile allo stesso tempo possibile? – Siva

+0

Cosa intendi con questo? – Xenobiologist

+1

Desidero che il testo sia stampato sullo schermo e che venga rediretto in modo che l'autoit possa leggere e analizzare. fondamentalmente quando sono sul monitor voglio vedere cosa sta succedendo all'istante (con lo sviluppo degli script) piuttosto che aspettare alla fine che l'autoit lanci un errore se non del tutto! – Siva

0

Qualcosa di simile al comando linux tee che registra su file mentre stampa STDOUT.

Redirecting STDOUT rende la parte ricevente (lo script) responsabile della visualizzazione e della registrazione. Come da documentation:

StdoutRead() non blocca, verrà restituito immediatamente. Per ottenere tutti i dati, deve essere chiamato in un ciclo.

Esempio:

#AutoIt3Wrapper_Change2CUI=Y 

#include <Constants.au3> 
#include <MsgBoxConstants.au3> 

Global Enum $EXIT_OK, _ 
      $EXIT_NOCOMPILE, _ 
      $EXIT_ABORT 

Global Const $g_sPromptError = 'Compile this script and run resulting executable instead.', _ 
      $g_sPromptInput = 'Enter a command:', _ 
      $g_sInputDefault = 'ping localhost -n 10' 

Global  $g_sCMD = '', _ 
      $g_sSTD = '' 

Main() 

Func Main() 

    If Not @Compiled Then 

     MsgBox($MB_OK + $MB_ICONERROR, @ScriptName, $g_sPromptError) 
     Exit $EXIT_NOCOMPILE 

    EndIf 

    $g_sCMD = InputBox(@ScriptName, $g_sPromptInput, $g_sInputDefault) 
    If @error Then Exit $EXIT_ABORT 

    $g_sSTD = _getCmdStd($g_sCMD) 
    MsgBox($MB_OK + $MB_ICONINFORMATION, $g_sCMD, $g_sSTD) 

    Exit $EXIT_OK 
EndFunc 

Func _getCmdStd(Const $sCMD, Const $sDir = '', Const $iType = $STDERR_MERGED, Const $bShow = False, Const $iDelay = 100) 
    Local  $sTMP = '' 
    Local  $sSTD = '' 
    Local  $sCOM = @ComSpec & ' /c ' & $sCMD 
    Local Const $iWin = $bShow ? @SW_SHOW : @SW_HIDE 
    Local Const $iPID = Run($sCOM, $sDir, $iWin, $iType) 

    While True 

     $sTMP = StdoutRead($iPID, False, False) 

     If @error Then 

      ExitLoop 1 

     ElseIf $sTMP Then 

      $sTMP = StringReplace($sTMP, @CR & @CR, '') 
      $sSTD &= $sTMP 

      ConsoleWrite($sTMP) 

     EndIf 

     Sleep($iDelay) 

    WEnd 

    Return SetError(@error, @extended, $sSTD) 
EndFunc 

Restituisce STDOUT (e STDERR) dopo l'esecuzione viene completata, durante la scrittura di consolare durante esecuzione. Sostituire MsgBox() come richiesto (funzione di registrazione).