从命令行运行Autoit并查看错误/结果

时间:2019-01-18 08:16:23

标签: autoit

我正在尝试从命令行运行一些autoit.au3脚本,并在那里查看结果。我在脚本中放置了ConsoleWrite,在脚本中也放置了Exit(1),但是运行脚本后,控制台中未显示任何内容。它只是在退出时停止脚本,而不会显示ConsoleWrite

我有使用命令:

"C:...(path to my AutoIt3.exe)" /ErrorStdOut "path_to_my_script.au3"'

我也尝试使用相同的命令运行script.exe,但结果类似(否)。当脚本失败(我不知道是否可能)时,我想在控制台和/或自定义错误消息中看到输出。

1 个答案:

答案 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
  1. 在代码中更正AutoIt.exe的路径。

  2. 编译为AutoIt代码以执行。这将是一个控制台程序 并根据consoleau3.exe伪指令被命名为#pragma compile

用法:

consoleau3 "path_to_my_script.au3"

可以添加脚本参数,即

consoleau3 "path_to_my_script.au3" arg1 arg2 arg3 ...