我正在尝试从命令行运行一些autoit.au3
脚本,并在那里查看结果。我在脚本中放置了ConsoleWrite
,在脚本中也放置了Exit(1)
,但是运行脚本后,控制台中未显示任何内容。它只是在退出时停止脚本,而不会显示ConsoleWrite
。
我有使用命令:
"C:...(path to my AutoIt3.exe)" /ErrorStdOut "path_to_my_script.au3"'
我也尝试使用相同的命令运行script.exe
,但结果类似(否)。当脚本失败(我不知道是否可能)时,我想在控制台和/或自定义错误消息中看到输出。
答案 0 :(得分:0)
AutoIt3.exe是一个GUI程序。因此,默认情况下,不会在控制台上打印GUI程序的STD流。
/ErrorStdOut
参数将错误消息重定向到控制台而不是Msgbox。
此参数不会在控制台上启用打印。
命令提示符:
要在命令提示符下打印,您可以通过管道传输到more
,即
"C:...(path to my AutoIt3.exe)" /ErrorStdOut "path_to_my_script.au3" 2>&1|more
more
从Stdin流中读取并打印到控制台。
我故意添加了2>&1
,以便将Stderr流与
标准输出,以便您打印合并的流。
如果您不希望出现错误,则可以将Stderr流重定向到nul,即
将2>&1
替换为2>nul
。
如果在命令提示符处使用了for
循环,则为
for /f "delims=" %A in ('"C:...(path to my AutoIt3.exe)" /ErrorStdOut test1.au3') do echo %A
如果在批处理文件中使用for
循环,请使用%%A
而不是%A
。要同时捕获Stderr,请将2^>&1
插入到for
命令中,或者忽略,将2^>nul
插入到for
命令中,即
for /f "delims=" %A in ('2^>nul "C:...(path to my AutoIt3.exe)" /ErrorStdOut test1.au3') do echo %A
以前的方法不会获取退出代码。
AutoIt代码:
AutoIt脚本可以获取标准输出和退出代码。
#pragma compile(Out, 'consoleau3.exe')
#pragma compile(Console, True)
$sAutoit = 'C:...(path to my AutoIt3.exe)'
$iPid = Run('"' & $sAutoit & '" /ErrorStdout ' & $CMDLINERAW, '', @SW_SHOW, 2) ; 2 = Get Stdout stream.
If @error Then Exit
; Open process handle.
$hPid = _ProcessOpenHandle($iPid)
; Get Stdout stream and then print to Console.
$sStdout = ''
Do
Sleep(10)
If $sStdout Then ConsoleWrite($sStdout & @CRLF)
$sStdout = StdoutRead($iPid)
Until @error
; Require process to be closed before calling _ProcessGetExitCode()
ProcessWaitClose($iPid)
; Get exitcode of process.
$iExitcode = _ProcessGetExitCode($hPid)
; Close process handle.
_ProcessCloseHandle($hPid)
Exit $iExitcode
Func _ProcessOpenHandle($iPID)
; Get the process handle of the process to query\n Return: Success Handle as array. Failure 0
Local Const $PROCESS_QUERY_INFORMATION = 0x400
Local $hPID = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'int', $PROCESS_QUERY_INFORMATION, 'int', 0, 'int', $iPID)
If @error Then Return SetError(@error, @extended, 0)
Return $hPID[0]
EndFunc
Func _ProcessGetExitcode($hPID)
; Get exitcode of the closed process\n Return: Success Exitcode as integer. Failure 0
Local $vPlaceholder
$hPID = DllCall('kernel32.dll', 'ptr', 'GetExitCodeProcess', 'ptr', $hPID, 'int*', $vPlaceholder)
If @error Then Return SetError(@error, @extended, 0)
Return $hPID[2]
EndFunc
Func _ProcessCloseHandle($hPID)
; Close the handle of a process\n Return: Success 1. Failure 0
DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $hPID)
If @error Then Return SetError(@error, @extended, 0)
Return 1
EndFunc
在代码中更正AutoIt.exe的路径。
编译为AutoIt代码以执行。这将是一个控制台程序
并根据consoleau3.exe
伪指令被命名为#pragma compile
。
用法:
consoleau3 "path_to_my_script.au3"
可以添加脚本参数,即
consoleau3 "path_to_my_script.au3" arg1 arg2 arg3 ...