AutoIt Script Info

  • Auf Anfrage von darius83 hier mal ein kleines Skript, das einem die in einem Skript verwendeten Includes, definierten Funktionen und Variablen (ordentlich) formatiert in die Konsole ausgibt:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    Local $File, $Script, $i, $j
    If $CmdLine[0] = 1 Then
    $Script = FileRead($CmdLine[1])
    Else
    $File = FileOpenDialog('', @WorkingDir, 'AutoIt v3 Script (*.au3)')
    If @error Then
    Exit
    EndIf
    $Script = FileRead($File)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('---------------------------------------' & @CRLF)
    ConsoleWrite('- AutoIt Script Info 1.2 by James1337 -' & @CRLF)
    ConsoleWrite('---------------------------------------' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Includes = _AutoIt3ScriptGetIncludes($Script)
    If Not @error Then
    _Sort($Includes)
    ConsoleWrite('++++++++++++++++++++++++++++++++++++++++' & @CRLF)
    ConsoleWrite('- Includes (' & UBound($Includes, 1) & '):' & @CRLF)
    For $i = 0 To UBound($Includes)-1 Step 1
    ConsoleWrite('+ ' & $Includes[$i] & @CRLF)
    Next
    ConsoleWrite('++++++++++++++++++++++++++++++++++++++++' & @CRLF & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $Functions = _AutoIt3ScriptGetFunctions($Script), $VariablesInFunction
    If Not @error Then
    _Sort($Functions)
    ConsoleWrite('++++++++++++++++++++++++++++++++++++++++' & @CRLF)
    ConsoleWrite('- Functions (' & UBound($Functions, 1) & '):' & @CRLF)
    For $i = 0 To UBound($Functions)-1 Step 1
    ConsoleWrite('+ ' & $Functions[$i] & @CRLF)
    $VariablesInFunction = _AutoIt3ScriptGetVariablesInFunction($Script, $Functions[$i])
    If Not @error Then
    _Sort($VariablesInFunction, True)
    ConsoleWrite('Variables (' & UBound($VariablesInFunction, 1) & '):' & @CRLF)
    For $j = 0 To UBound($VariablesInFunction)-1 Step 1
    ConsoleWrite(@TAB & $VariablesInFunction[$j] & @CRLF)
    Next
    If ($i < UBound($Functions)-1) Then
    ConsoleWrite(@CRLF)
    EndIf
    EndIf
    Next
    ConsoleWrite('++++++++++++++++++++++++++++++++++++++++' & @CRLF & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $Variables = _AutoIt3ScriptGetVariablesOutsideFunction($Script)
    If Not @error Then
    _Sort($Variables, True)
    ConsoleWrite('++++++++++++++++++++++++++++++++++++++++' & @CRLF)
    ConsoleWrite('- Variables (' & UBound($Variables, 1) & '):' & @CRLF)
    For $i = 0 To UBound($Variables)-1 Step 1
    ConsoleWrite('+ ' & $Variables[$i] & @CRLF)
    Next
    ConsoleWrite('++++++++++++++++++++++++++++++++++++++++' & @CRLF & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _Sort(ByRef $Array, $Cleanup=False)
    Local $i, $j, $1, $2
    For $i = 1 To UBound($Array, 1)-1 Step 1
    If $Array[$i] < $Array[$i-1] Then
    For $j = $i To 1 Step -1
    $1 = $Array[$j]
    $2 = $Array[$j-1]
    If $1 < $2 Then
    $Array[$j] = $2
    $Array[$j-1] = $1
    Else
    ExitLoop
    EndIf
    Next
    EndIf
    Next
    If $Cleanup Then
    Local $a2[1] = [$Array[0]], $u
    For $i = 1 To UBound($Array, 1)-1 Step 1
    If ($Array[$i] <> $Array[$i-1]) And ($Array[$i] <> '') Then
    $u = UBound($a2, 1)
    ReDim $a2[$u+1]
    $a2[$u] = $Array[$i]
    EndIf
    Next
    $Array = $a2
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; by James1337
    Func _AutoIt3ScriptGetIncludes($Code)
    Local $Includes = StringRegExp($Code, '(?i)(?:\#include [\<"\''])([\w\. ]{1,})(?:[\>"\''])', 3)
    If @error Then
    SetError(@error)
    Return 0
    EndIf
    Return $Includes
    EndFunc
    Func _AutoIt3ScriptGetFunctions($Code)
    Local $Functions = StringRegExp($Code, '(?i)(?:Func[\s]+)([\w]{1,})(?:[\s]*\()', 3)
    If @error Then
    SetError(@error)
    Return 0
    EndIf
    Return $Functions
    EndFunc
    Func _AutoIt3ScriptGetVariables($Code)
    Local $Variables = StringRegExp($Code, '(?:\$)([\w]{1,})(?:[\s\[\.\=\+\-\*\/\^\,\)])', 3)
    If @error Then
    SetError(@error)
    Return 0
    EndIf
    Return $Variables
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _AutoIt3ScriptGetVariablesInFunction($Code, $Function)
    $Code = StringRegExpReplace($Code, '(?i)\n[\s]*Func[\s]+' & $Function & '[\s]*\(', BinaryToString('0x0101010101'), 0)
    $Code = StringRegExpReplace($Code, '(?i)\n[\s]*EndFunc', BinaryToString('0x1010101010'), 0)
    Local $a = StringInStr($Code, BinaryToString('0x0101010101'), 2, 1)
    Local $b = StringInStr($Code, BinaryToString('0x1010101010'), 2, 1, $a)
    If Not(($a > 0) And ($b > $a)) Then
    SetError(1337)
    Return 0
    EndIf
    $Function = StringMid($Code, $a, $b-$a+5)
    Local $Variables = _AutoIt3ScriptGetVariables($Function)
    SetError(@error)
    Return $Variables
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _AutoIt3ScriptGetVariablesOutsideFunction($Code)
    Local $Functions = _AutoIt3ScriptGetFunctions($Code), $i, $a, $b
    If Not @error Then
    For $i = 0 To UBound($Functions)-1 Step 1
    $Code = StringRegExpReplace($Code, '(?i)\n[\s]*Func[\s]+' & $Functions[$i] & '[\s]*\(', BinaryToString('0x0101010101'), 0)
    $Code = StringRegExpReplace($Code, '(?i)\n[\s]*EndFunc', BinaryToString('0x1010101010'), 0)
    $a = StringInStr($Code, BinaryToString('0x0101010101'), 2, 1)
    $b = StringInStr($Code, BinaryToString('0x1010101010'), 2, 1, $a)
    If (($a > 0) And ($b > $a)) Then
    $Code = StringReplace($Code, StringMid($Code, $a, $b-$a+5), '', 0, 1)
    EndIf
    Next
    EndIf
    Local $Variables = _AutoIt3ScriptGetVariables($Code)
    SetError(@error)
    Return $Variables
    EndFunc

    [/autoit]

    MfG James

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    7 Mal editiert, zuletzt von James (30. August 2014 um 23:35)

  • Schaut schon recht interessant aus!
    Könntest du vielleicht bei den Variablen noch auslesen, wie oft jede einzelne im Script vorkommt?

    UNPLEASANT SPOILER

    You just lost the game!

  • Ich hab den Code mal in ne GUI gepackt... Is zwar nich so ganz schön der Code aber funktioniert XD
    Vieleicht hat ja noch jemand ne elegantere Lösung als GUI löschen und neu erstellen :)

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $File, $Script, $i, $j
    If $CmdLine[0] = 1 Then
    $Script = FileRead( $CmdLine[1] )
    $date = FileGetTime( $CmdLine[1], 0, 1 )
    Else
    $File = FileOpenDialog( '', @WorkingDir, 'AutoIt v3 Script (*.au3)' )
    If @error Then
    Exit
    EndIf
    $Script = FileRead( $File )
    $date = FileGetTime( $File, 0, 1 )
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $Form1
    Func _CreateGUI()
    $Form1 = GUICreate("AutoIt Script Info 1.2 by James1337", 251, 651, 923, 17, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
    $TreeView1 = GUICtrlCreateTreeView(8, 8, 234, 634, BitOR($GUI_SS_DEFAULT_TREEVIEW,$TVS_SINGLEEXPAND))
    Local $Includes = _AutoIt3ScriptGetIncludes($Script)
    If Not @error Then
    _Sort($Includes)
    $TreeView1_0 = GUICtrlCreateTreeViewItem("Includes (" & UBound($Includes, 1) & "):", $TreeView1)
    For $i = 0 To UBound($Includes)-1 Step 1
    GUICtrlCreateTreeViewItem($Includes[$i], $TreeView1_0)
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $Functions = _AutoIt3ScriptGetFunctions($Script), $VariablesInFunction, $Variables
    If Not @error Then
    _Sort($Functions)
    $TreeView1_1 = GUICtrlCreateTreeViewItem('Functions (' & UBound($Functions, 1) & '):', $TreeView1)
    Local $TreeView1_2[UBound($Functions, 1)]
    For $i = 0 To UBound($Functions)-1 Step 1
    $TreeView1_2[$i] = GUICtrlCreateTreeViewItem($Functions[$i], $TreeView1_1)
    $VariablesInFunction = _AutoIt3ScriptGetVariablesInFunction($Script, $Functions[$i])
    If Not @error Then
    _Sort($VariablesInFunction, True)
    If ($i = 0) Then
    $Variables = $VariablesInFunction
    Else
    $Variables = _Join($Variables, $VariablesInFunction)
    EndIf
    If UBound($VariablesInFunction, 1) Then
    GUICtrlSetData ( $TreeView1_2[$i], $Functions[$i] & " (" & UBound($VariablesInFunction, 1) & "):" )
    EndIf
    For $j = 0 To UBound($VariablesInFunction)-1 Step 1
    GUICtrlCreateTreeViewItem($VariablesInFunction[$j], $TreeView1_2[$i])
    Next
    If ($i < UBound($Functions)-1) Then
    EndIf
    EndIf
    Next
    EndIf
    $VariablesInFunction = $Variables

    [/autoit] [autoit][/autoit] [autoit]

    $Variables = _AutoIt3ScriptGetVariables($Script)
    If Not @error Then
    _Sort($Variables, True)
    $Variables = _Delete($Variables, $VariablesInFunction)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("Variables (" & UBound($Variables, 1) & "):", $TreeView1)
    For $i = 0 To UBound($Variables)-1 Step 1
    GUICtrlCreateTreeViewItem($Variables[$i], $TreeView1_3)
    Next
    EndIf
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    GUISetState(@SW_SHOW)
    EndFunc ;==> _CreateGUI()

    [/autoit] [autoit][/autoit] [autoit]

    _CreateGUI()
    While 1
    Sleep(100)
    If FileGetTime( $File, 0, 1) <> $date Then
    $date = FileGetTime( $File, 0, 1)
    GUIDelete($Form1)
    _CreateGUI()
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Form1Close()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; Function Name: _Sort
    ; Function Description: simple function to sort the elements of an array (and to delete duplicate values)
    ; Function Author: ChristophX86
    Func _Sort(ByRef $Array, $Cleanup=False)
    Local $i, $j, $1, $2
    For $i = 1 To UBound($Array, 1)-1 Step 1
    If $Array[$i] < $Array[$i-1] Then
    For $j = $i To 1 Step -1
    $1 = $Array[$j]
    $2 = $Array[$j-1]
    If $1 < $2 Then
    $Array[$j] = $2
    $Array[$j-1] = $1
    Else
    ExitLoop
    EndIf
    Next
    EndIf
    Next
    If $Cleanup Then
    Local $a2[1] = [$Array[0]], $u
    For $i = 1 To UBound($Array, 1)-1 Step 1
    If ($Array[$i] <> $Array[$i-1]) And ($Array[$i] <> '') Then
    $u = UBound($a2, 1)
    ReDim $a2[$u+1]
    $a2[$u] = $Array[$i]
    EndIf
    Next
    $Array = $a2
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Join($Array1, $Array2)
    Local $u1 = UBound($Array1, 1), $u2 = UBound($Array2, 1), $i
    ReDim $Array1[$u1+$u2]
    For $i = $u1+1 To ($u1+$u2-1) Step 1
    $Array1[$i] = $Array2[$i-$u1]
    Next
    Return $Array1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Delete($Array1, $Array2)
    Local $i, $j, $f, $Array[1] = [''], $c = 0
    For $i = 0 To UBound($Array1, 1)-1 Step 1
    $f = False
    For $j = 0 To UBound($Array2, 1)-1 Step 1
    If ($Array2[$j] == $Array1[$i]) Then
    $f = True
    ExitLoop
    EndIf
    Next
    If (Not $f) Then
    $Array[$c] = $Array1[$i]
    If ($i < UBound($Array1, 1)-1) Then
    $c += 1
    ReDim $Array[$c+1]
    EndIf
    EndIf
    Next
    Return $Array
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; by James1337
    Func _AutoIt3ScriptGetIncludes($Code)
    Local $Includes = StringRegExp($Code, '(?i)(?:\#include [\<\"\''])([\w\. ]{1,})(?:[\>\"\''])', 3)
    If @error Then
    SetError(@error)
    Return 0
    EndIf
    Return $Includes
    EndFunc
    Func _AutoIt3ScriptGetFunctions($Code)
    Local $Functions = StringRegExp($Code, '(?i)(?:Func[\s]+)([\w]{1,})(?:[\s]*\()', 3)
    If @error Then
    SetError(@error)
    Return 0
    EndIf
    Return $Functions
    EndFunc
    Func _AutoIt3ScriptGetVariables($Code)
    Local $Variables = StringRegExp($Code, '(?:\$)([\w]{1,})(?:[\s\[\.\=\+\-\*\/\^\,\)])', 3)
    If @error Then
    SetError(@error)
    Return 0
    EndIf
    Return $Variables
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _AutoIt3ScriptGetVariablesInFunction($Code, $Function)
    $Code = StringRegExpReplace($Code, '(?i)Func[\s]+' & $Function & '[\s]*\(', BinaryToString('0x0101010101010101'), 0)
    $Code = StringRegExpReplace($Code, '(?i)[\s]+EndFunc', BinaryToString('0x1010101010101010'), 0)
    Local $a = StringInStr($Code, BinaryToString('0x0101010101010101'), 2, 1)
    Local $b = StringInStr($Code, BinaryToString('0x1010101010101010'), 2, 1, $a)
    If Not(($a > 0) And ($b > $a)) Then
    SetError(1337)
    Return 0
    EndIf
    $Function = StringMid($Code, $a+8, $b-$a-9)
    Local $Variables = _AutoIt3ScriptGetVariables($Function)
    SetError(@error)
    Return $Variables
    EndFunc

    [/autoit]

    7 Mal editiert, zuletzt von darius83 (3. Januar 2012 um 22:13)

  • So... Version 1.1 ist fertig, und ich bin endlich _ArrayUnique losgeworden.

    Und morgen mach ich wirklich mal einen billigen Obfuscator und bau das selbst mal in einen GUI.

  • it works :)

    Wäre es vielleicht möglich das man die Variablen innerhalb der Funktionen/Global anzeigt?

    Wies nun ist weiß ich ja nicht wo ich welche variablen zugriff habe.

  • Möglich ist grundsätzlich ersteinmal alles.
    Wenn bei Variablen immer Global/Local steht wäre das sogar (fast) einfach, und innerhalb der Funktionen... mal sehen... ich versuchs morgen mal.

  • Wäre es vielleicht möglich das man die Variablen innerhalb der Funktionen/Global anzeigt?


    So, die erste Hälfte hab ich jetzt schon mal gemacht:

    Spoiler anzeigen
  • Dann hab ich hier auch schonmal das Grundgerüst für die neue GUI

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 251, 651, 923, 17, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
    $TreeView1 = GUICtrlCreateTreeView(8, 8, 234, 634, BitOR($GUI_SS_DEFAULT_TREEVIEW,$TVS_SINGLEEXPAND))
    $TreeView1_0 = GUICtrlCreateTreeViewItem("Includes", $TreeView1)
    GUICtrlCreateTreeViewItem("Include1", $TreeView1_0)
    GUICtrlCreateTreeViewItem("Include2", $TreeView1_0)
    $TreeView1_1 = GUICtrlCreateTreeViewItem("Global Variables", $TreeView1)
    GUICtrlCreateTreeViewItem("Variable1", $TreeView1_1)
    GUICtrlCreateTreeViewItem("Variable2", $TreeView1_1)
    $TreeView1_2 = GUICtrlCreateTreeViewItem("Functions", $TreeView1)
    $TreeView1_3 = GUICtrlCreateTreeViewItem("Function1", $TreeView1_2)
    GUICtrlCreateTreeViewItem("Variable1", $TreeView1_3)
    GUICtrlCreateTreeViewItem("Variable2", $TreeView1_3)
    $TreeView1_4 = GUICtrlCreateTreeViewItem("Function2", $TreeView1_2)
    GUICtrlCreateTreeViewItem("Variable1", $TreeView1_4)
    GUICtrlCreateTreeViewItem("Variable2", $TreeView1_4)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Form1Close()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Einmal editiert, zuletzt von darius83 (3. Januar 2012 um 21:26)

  • Version 1.2 ist jetzt auch fertig.
    - es werden immernoch keine Includes verwendet
    - man sieht sofort wie viele Includes, Funktionen und Variablen verwendet werden
    - die Variablen werden den Funktionen zugeordnet
    - die Variablen, die bei den Funktionen stehen, stehen *nicht* am Ende

    Spoiler anzeigen
  • Hab dann auch mal die GUI dazu gebastelt und im Post oben aktualisiert... Das SingleExpand in der TreeView ist ein wenig merkwürdig zu handhaben... Hab keine Ahnung woran das liegt ?(

    2 Mal editiert, zuletzt von darius83 (3. Januar 2012 um 22:15)

  • super Sache.

    Allerdings Bug gefunden:
    wenn ich eine globale Variable in einer Funktion nutze, wird diese Variable unter der Funktion aufgeführt und nicht also globale Variable
    Weiß jetzt nichts obs daran(^^) liegt, aber ich hab ungefähr 50 global variablen, allerdings werden nur 7 aufgeführt

  • Stimmt, das ist aber weniger ein Bug, als einfach nur ein Fehler in meinem doch sehr einfach gehaltenen Skript.
    Wenn jemand einen Vorschlag hat, wie man das am einfachsten lösen kann, nur her damit...

    Edit:
    Lösung gefunden, ich baus demnächst mal ein.

  • Allerdings Bug gefunden:
    wenn ich eine globale Variable in einer Funktion nutze, wird diese Variable unter der Funktion aufgeführt und nicht also globale Variable
    Weiß jetzt nichts obs daran(^^) liegt, aber ich hab ungefähr 50 global variablen, allerdings werden nur 7 aufgeführt


    Jetzt nicht mehr... ;)

  • BugFix :
    Danke, das mach ich demnächst mal, mittlerweile läuft das Ganze ja (wenn auch recht umständlich).

    Falls noch irgendwer Verbesserungsvorschläge oder sonstiges hat, nur her damit.
    Ich werde zwar in Zukunft um einiges weniger Zeit haben, werde aber versuchen das Skript weiter zu verbessern.