AutoIt3.exe - это программа с графическим интерфейсом. Поэтому потоки STD программы с графическим интерфейсом не выводятся на консоль по умолчанию.
Аргумент /ErrorStdOut
перенаправляет сообщения об ошибках в консоль вместо Msgbox.
Этот аргумент не разрешает печать на консоли.
Командная строка :
Чтобы напечатать из командной строки, вы можете передать more
, т.е.
"C:...(path to my AutoIt3.exe)" /ErrorStdOut "path_to_my_script.au3" 2>&1|more
more
читает из потока Stdin и печатает на консоль.
Я намеренно добавил 2>&1
, чтобы поток Stderr был объединен с
Stdout, чтобы вы печатали объединенные потоки.
Если вы не хотите ошибок, то вы можете перенаправить поток Stderr на нуль, т.е.
заменить 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 ...