Запустите Autoit из командной строки и посмотрите ошибки / результаты - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь запустить какой-нибудь скрипт autoit.au3 из командной строки и посмотреть результаты там. Я вставил ConsoleWrite в скрипт, а также Exit(1), но после запуска скрипта в консоли ничего не отображается. Он просто останавливает скрипт при выходе и ConsoleWrite не отображается.

У меня есть команда use:

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

Также я попытался запустить script.exe с помощью этой же команды, но с похожим (нет) результатом. Я хотел бы видеть вывод в консоли и / или в пользовательских сообщениях об ошибках, когда сценарий не выполняется (я не знаю, возможно ли это).

1 Ответ

0 голосов
/ 18 января 2019

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
  1. Исправьте путь к AutoIt.exe в коде.

  2. Скомпилировать в код AutoIt исполняемый файл. Это будет консольная программа и будет назван consoleau3.exe в соответствии с директивами #pragma compile.

Использование:

consoleau3 "path_to_my_script.au3"

Могут быть добавлены аргументы скрипта, т.е.

consoleau3 "path_to_my_script.au3" arg1 arg2 arg3 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...