2013-05-09 50 views
5

我有以下代碼來捕獲和處理運行命令輸出。 如何修改它,使運行命令窗口顯示輸出並同時輸出記錄?用@SW_SHOW(或等價物)代替@SW_HIDE只顯示一個空白的命令窗口。同時捕獲並顯示STDOUT

類似於linux tee命令,它在打印標準輸出時記錄到文件。

$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) 

回答

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 

也許這可以幫助你。

+1

我實際上需要在窗口上打印文本,除了重定向......兩者都可以在同一時間嗎? – Siva 2013-06-04 16:47:38

+0

你是什麼意思? – Xenobiologist 2013-07-25 14:34:22

+1

我希望將文本打印在屏幕上並重定向,以便autoit可以讀取和解析。 基本上,當我在監視器上時,我想查看即時發生的事情(使用腳本進度),而不是等到最後自動發出錯誤(如果有的話)! – Siva 2013-07-26 21:14:46

0

類似於linux tee命令,它在打印STDOUT時記錄到文件。

Redirecting STDOUT使接收方(腳本)負責顯示和記錄。按照documentation

StdoutRead()不會阻塞,它會立即返回。爲了獲得所有數據,必須在循環中調用它。

實施例

#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 

返回STDOUT(和STDERR)執行完成,而寫執行期間安慰。根據需要替換MsgBox()(記錄功能)。