Jump to content

Graceful exit of Autoit scripts


Go to solution Solved by kylomas,

Recommended Posts

Hi,

I'm not sure if this comes under "exception handling" but results when I searched for exception handling were a whole lot different, so i thought I'll start a new thread.

I have 50+ scripts and I would like to run them in sequence. Lets assume I use a shell script to run them. Assuming script 25 fails. (By fail, i mean a condition where some control has changed and the script cannot find a certain element and so the script just gets stuck), how do I get script 25 to gracefully exit and let script 26 run?

Or as an alternative, can i have a global time out which tells AutoIt,wait for a maximum of 2 minutes before giving up?

Any help is much appreciated!

 

Link to comment
Share on other sites

Hey FireFox,

Thank you for your reply! Yeah, thats one possibility, but each script has 100s of code with numerous functions and to check each one could be time consuming. But well, if there is no other option then :)

I was hoping for a more global option that can be set. (like WinWaitDelay).

Btw, I was wondering why does the script freeze when it is unable to perform an operation - say if a button is not present and the script tries to click it. Can it throw an exception saying "hey no button found". Any ideas as to making a global change?

Link to comment
Share on other sites

  • Solution

tester123,

Not sure what you mean by "gracefully".  If you just want to cancel the script based on a timeout and run the next script then the following might be useful to you. 

The script sets up a test envorinment:

   @scriptdirtest scripts*.au3

       

        Several scripts that will run for varying lengths of time.

        One of the scripts is setup to exceed the 120 second timeout limit.

   @scriptdirtest scriptsrun_log.txt

        Logging mechanism used for testing.

The driver (shell) portion of the script  works off a timer and the PID.  Scripts are run using "autoit3.exe scriptname".  The scriptnames are fed to the driver from the array created at the top of the script.

You may be able to use this as a model to set something up for your environment.

#include <array.au3>
#include <date.au3>

; Hammer and Tongues Method

;----------------------------------------------------------------------------------------------------------------------------------
;
;  Create Test Environment
;
;----------------------------------------------------------------------------------------------------------------------------------

local $aScripts[50] =   ['Script1.au3', _
                        'Script2.au3', _
                        'Script3.au3', _
                        'Script4.au3', _
                        'Script5.au3', _
                        'Script6.au3', _
                        'Script7.au3', _
                        'Script8.au3', _
                        'Script9.au3', _
                        'Script10.au3', _
                        'Script11.au3', _
                        'Script With Timeout Problem.au3', _
                        'Script21.au3', _
                        'Script22.au3', _
                        'Script23.au3', _
                        'Script24.au3', _
                        'Script25.au3', _
                        'Script26.au3', _
                        'Script27.au3', _
                        'Script28.au3', _
                        'Script29.au3']

local $ret = 0, $test_path = '\Script Test'
if fileexists(@scriptdir & $test_path) then filedelete(@scriptdir & $test_path)
$ret = DirCreate(@scriptdir & $test_path)
if $ret <> 1 then
    ConsoleWrite('DirCreate for test script directory failed...exiting...' & @LF)
    Exit
endif

local $str = ''

l('Generating Scripts')

for $1 = 0 to ubound($aScripts) - 1

    if $aScripts[$1] = '' then exitloop

    $str = '#include <date.au3>' & @lf

    if $aScripts[$1] = 'Script With Timeout Problem.au3' then
        $str &= 'sleep(999999)' & @lf
    else
        $str &= 'local $sleep_time = random(1,10,1) * 1000' & @lf
        $str &= 'l("Script = " & @scriptname & " running for " & $sleep_time/1000 & " seconds")' & @lf
        $str &= 'sleep($sleep_time)' & @lf
    endif
    $str &= 'func l($str)' & @lf
    $str &= '   local $hfl = fileopen(@scriptdir & "\run_log.txt",1)' & @lf
    $str &= '   filewrite($hfl,stringformat("%-20s    %-100s",_now(),$str) & @lf)' & @lf
    $str &= '   fileclose($hfl)' & @lf
    $str &= '   $hfl = 0' & @lf
    $str &= 'endfunc' & @lf

    $ret= filewrite(@scriptdir & $test_path & '\' & $aScripts[$1],$str)
    if $ret <> 1 then
        ConsoleWrite('File write for script = ' & @scriptdir & $test_path & '\' & $aScripts[$1] & @LF)
        Exit
    endif

next

func l($str)

    local $hfl = fileopen(@scriptdir & $test_path & '\run_log.txt',1) ; append
    filewrite($hfl,stringformat('%-20s    %-100s',_now(),$str) & @lf)
    fileclose($hfl)
    $hfl = 0

endfunc

;----------------------------------------------------------------------------------------------------------------------------------
;
;  Driver Script to run test scripts in order with a timeout value.
;
;----------------------------------------------------------------------------------------------------------------------------------

local $timeout = 120 ;  seconds
local $st, $pid

l('Start Driver Script.  Options:')
l(@tab & 'Timeout Value = ' & $timeout)

for $1 = 0 to ubound($aScripts) - 1

    if $aScripts[$1] = '' then exitloop

    l('')
    l('Starting script = ' & $aScripts[$1])

    $pid = run('autoit3.exe ' & @scriptdir & '"' & $test_path & '"' & '\' & '"' & $aScripts[$1] & '"')
    ConsoleWrite($pid & @LF)

    $st = timerinit()

    while int(timerdiff($st)/1000) < 120
        sleep(250)
        if not processexists($pid) then exitloop
    WEnd

    if not processexists($pid) then
        l('Script ' & $aScripts[$1] & ' ended normally')
    Else
        l('Cancelling script = ' & $aScripts[$1] & ' due to timeout')
        processclose($pid)
    EndIf

next

As to why your scripts might freeze.  As suggested, you need to interogate return codes for all functions.   Whenever you are doing something to a window you first need to verify it's presence and state.

I don't know of any global value that can be set to indicate "my script is fucking up".  The driver script above has no idea what the driven script is doing, only that it has exceeded a timeout value and the process id still exists.

Good Luck,

kylomas

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...