2013-05-09 26 views
5

Mam następujący kod do przechwytywania i przetwarzania danych wyjściowych polecenia Uruchom. Jak zmodyfikować to tak, że okno polecenia Uruchom wyświetla dane wyjściowe i jednocześnie dane wyjściowe są rejestrowane? Zastąpienie @SW_HIDE za pomocą @SW_SHOW (lub odpowiednika) po prostu pokazuje puste okno poleceń.Przechwytywanie i wyświetlanie STDOUT w tym samym czasie

Coś podobnego do polecenia linux tee, które loguje się do pliku podczas drukowania 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) 

Odpowiedz

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 

Może to pomoże Ci się.

+1

Potrzebuję, aby tekst do wydrukowania na oknie oprócz przekierowania ... może być jednocześnie możliwy? – Siva

+0

Co przez to rozumiesz? – Xenobiologist

+1

Chcę, aby tekst został wydrukowany na ekranie, a także przekierowany, tak aby autoit mógł czytać i parsować. zasadniczo, gdy jestem na monitorze, chcę zobaczyć, co się dzieje natychmiast (z postępem skryptów) zamiast czekać na końcu, aby autoit rzucił błąd, jeśli w ogóle jakiś! – Siva

0

Coś podobnego do polecenia linux tee, które loguje się do pliku podczas drukowania STDOUT.

Redirecting STDOUT powoduje, że strona odbiorcza (skrypt) jest odpowiedzialna za wyświetlanie i logowanie. Jak na documentation:

StdoutRead() nie blokuje, to natychmiast powróci. Aby uzyskać wszystkie dane, należy je wywołać w pętli.

Przykład:

#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 

Zwraca STDOUT (i stderr) po wykonanie kończy, pisząc do konsoli podczas wykonania. Wymień MsgBox() zgodnie z wymaganiami (funkcja logowania).

Powiązane problemy