類似於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()
(記錄功能)。
我實際上需要在窗口上打印文本,除了重定向......兩者都可以在同一時間嗎? – Siva 2013-06-04 16:47:38
你是什麼意思? – Xenobiologist 2013-07-25 14:34:22
我希望將文本打印在屏幕上並重定向,以便autoit可以讀取和解析。 基本上,當我在監視器上時,我想查看即時發生的事情(使用腳本進度),而不是等到最後自動發出錯誤(如果有的話)! – Siva 2013-07-26 21:14:46