Search code examples
autoit

Conditional include of file


I'd like to include certain script only if it's present. Unfortunately #include is processed before the execution, so I can't make it conditional like this:

If FileExists(@ScriptDir & "\common.au3") Then
   #include "common.au3"
EndIf

I tried to use Execute to evaluate the read file in place via Execute(ReadFile(...)). But that seems to only process single statements - I couldn't declare multiple functions for example.

Is there a different way to conditionally include another file?


Solution

  • Probably not a good design choice but if you really need to do somethin like this, try #OnAutoItStartRegister:

    #OnAutoItStartRegister "_OnAutoItStart_CreateIncludes"
    #include "include_collection.au3"
    
    
    If IsDeclared("iExample_Common") Then
        MsgBox(64, "", "Common.au3 exists")
    Else
        MsgBox(16, "", "Common.au3 wasnt included")
    EndIf
    
    MsgBox(0, "", "Your Script here")
    
    
    
    
    Func _OnAutoItStart_CreateIncludes()
        If StringInStr($CmdLineRaw, '-_OnAutoItStart_CreateIncludes', 1) Then Return
    
    
        If FileExists(@ScriptDir & "\common.au3") And Not StringInStr(FileRead("include_collection.au3"), '#include "common.au3"') Then
            FileWrite("include_collection.au3", '#include "common.au3"')
        EndIf
    
    
        $iPID = Run('"' & @AutoItExe & '" ' & $CmdLineRaw & ' -_OnAutoItStart_CreateIncludes', @WorkingDir, Default, 2)
        While ProcessExists($iPID)
            ConsoleWrite(StdoutRead($iPID))
            Sleep(10)
        WEnd
        Exit
    EndFunc   ;==>_OnAutoItStart_CreateIncludes
    

    Create an additional empty file "include_collection.au3" as well. In this example, I created "commons.au3" containing a statement "$iExample_commons = 1234'.

    Note: Once the file is included this way, it should not be deleted otherwise your script will fail again. This could probably be overcome too but at some point it will become very messy.

    Maybe it's a better Idea to wrap a launcher around your application which will add/remove include lines before startup as needed.