Maciejjy
Maciejjy

Reputation: 147

Running Autoit from command line and see errors/results

I am trying to run some autoit.au3 script from command line and see results there. I have put some ConsoleWrite inside script and also Exit(1) but after I run script nothing is shown in console. It just stop script on Exit and ConsoleWrite is not displayed.

I have use command:

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

Also I have tried to run script.exe with this same command but with similar (no) result. I would like to see output in console and/or custom error messages when script fail (I don't know if that is possible).

Upvotes: 1

Views: 3410

Answers (1)

michael_heath
michael_heath

Reputation: 5372

AutoIt3.exe is a GUI program. So the STD streams of a GUI program are not printed at a console by default.

The /ErrorStdOut argument redirects errors messages to Console instead of a Msgbox. This argument does not enable print at the Console.

Command Prompt:

To print at a Command Prompt, you could pipe to more, i.e.

"C:...(path to my AutoIt3.exe)" /ErrorStdOut "path_to_my_script.au3" 2>&1|more

more reads from the Stdin stream and prints to Console. I intentionly added 2>&1 so the Stderr stream is merged with Stdout so you get the merged streams printed. If you do not want the errors, then you can redirect the Stderr stream to nul i.e. replace 2>&1 with 2>nul.

If you used a for loop at a Command Prompt, it would be i.e.

for /f "delims=" %A in ('"C:...(path to my AutoIt3.exe)" /ErrorStdOut test1.au3') do echo %A

If you use the for loop in batch-file, use %%A instead of %A. To also capture the Stderr, insert 2^>&1 into the for command or to ignore, insert 2^>nulinto the for command i.e.

for /f "delims=" %A in ('2^>nul "C:...(path to my AutoIt3.exe)" /ErrorStdOut test1.au3') do echo %A

The previous methods will not get the Exitcode.

AutoIt code:

An AutoIt script can get the Stdout and the Exitcode.

#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. Correct the path to AutoIt.exe in the code.

  2. Compile to AutoIt code to executable. It will be a Console program and will be named consoleau3.exe as to the #pragma compile directives.

Usage:

consoleau3 "path_to_my_script.au3"

Script arguments can be added i.e.

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

Upvotes: 1

Related Questions