1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Denkanstoß gesucht.

    • BugFix
    • 2. Juli 2021 um 10:26

    _FileListToArray bietet auch die Rückgabe des kpl. Pfades an. Das vereinfacht das Skript dann etwas und Nutzung von Arrays macht es übersichtlicher (und bei großer Anzahl auch kürzer):

    AutoIt
    #include <File.au3>
    
    Global $prog = "C:\Program Files (x86)\PDF24\pdf24-DocTool.exe"
    Global $aPathSource[] = ["\\path\to\1", "\\path\to\2", "\\path\to\3"]
    Global $outpath = "\\path\to\output"
    Global $aFileSource[UBound($aPathSource)] ; gleiche Größe wie Array mit Ordnern
    Global $aTmp
    For $i = 0 To UBound($aPathSource) -1
        $aTmp = _FileListToArray($aPathSource[$i], '*.pdf', 1, True)
        $aFileSource[$i] = $aTmp[1]
    Next
    Global $outputname = InputBox('PDF Join', 'Bitte Dateinamen angeben')
    Global $sCmd = StringFormat('%s -join -profile default/best -outputFile "%s\%s.pdf" "%s" "%s" "%s"', $prog, $outpath, $outputname, _
                                $aFileSource[0], $aFileSource[1], $aFileSource[2])
    Run($sCmd, '', @SW_HIDE) ; evtl. WorkingDir-Angabe erforderlich
    For $i = 0 To UBound($aFileSource) -1
        FileDelete($aFileSource[$i])
    Next
    Alles anzeigen
  • Denkanstoß gesucht.

    • BugFix
    • 2. Juli 2021 um 10:12

    OK, probier mal (ungetestet):

    AutoIt
    #include <File.au3>
    
    ;~ set prog="C:\Program Files (x86)\PDF24\pdf24-DocTool.exe"
    Global $prog = "C:\Program Files (x86)\PDF24\pdf24-DocTool.exe"
    
    ;~ set path1="\\path\to\1"
    Global $path1 = "\\path\to\1"
    
    ;~ set path2="\\path\to\2"
    Global $path2 = "\\path\to\2"
    
    ;~ set path3="\\path\to\3"
    Global $path3 = "\\path\to\3"
    
    ;~ set outpath="\\path\to\output"
    Global $outpath = "\\path\to\output"
    
    ;~ For /F "delims=" %%i in ('dir /B %path1%') do set Datei1=%%~i
    ;~ Echo %Datei1%
    Global $aFile1 = _FileListToArray($path1, '*.pdf', 1) ; $FLTA_FILES (1) = Return files only
    ConsoleWrite($aFile1[1] & @CRLF)
        
    ;~ For /F "delims=" %%i in ('dir /B %path2%') do set Datei2=%%~i
    ;~ Echo %Datei2%
    Global $aFile2 = _FileListToArray($path2, '*.pdf', 1) ; $FLTA_FILES (1) = Return files only
    ConsoleWrite($aFile2[1] & @CRLF)
    
    
    ;~ For /F "delims=" %%i in ('dir /B %path3%') do set Datei3=%%~i
    ;~ Echo %Datei3%
    Global $aFile3 = _FileListToArray($path3, '*.pdf', 1) ; $FLTA_FILES (1) = Return files only
    ConsoleWrite($aFile3[1] & @CRLF)
    
    ;~ set /p outputname= Bitte Dateinamen angeben:
    Global $outputname = InputBox('PDF Join', 'Bitte Dateinamen angeben')
    
    ;~ %prog% -join -profile default/best -outputFile "%outpath%\%outputname%.pdf" "%path1%\%Datei1%" "%path2%\%Datei2%" "%path3%\%Datei3%"
    Global $sCmd = StringFormat('%s -join -profile default/best -outputFile "%s\%s.pdf" "%s\%s" "%s\%s" "%s\%s"', $prog, $outpath, $outputname, _
                                $path1, $aFile1[1], $path2, $aFile2[1], $path3, $aFile3[1])
    Run($sCmd, '', @SW_HIDE) ; evtl. WorkingDir-Angabe erforderlich
    
    ;~ del "%path1%\%Datei1%" "%path2%\%Datei2%" "%path3%\%Datei3%"
    FileDelete($path1 & '\' & $aFile1[1])
    FileDelete($path2 & '\' & $aFile2[1])
    FileDelete($path2 & '\' & $aFile3[1])
    Alles anzeigen

    EDIT:

    War ein fehler beim FileDelete & Include ergänzt

  • Denkanstoß gesucht.

    • BugFix
    • 2. Juli 2021 um 10:00
    Zitat von dgi

    Aus 3 Verzeichnissen die dort liegenden PDF Dateien einlesen (Pfad und Name) und jeweils in eine Variable speichern
    Aus den 3 Variablen den Befehl für die Doc-Tools.exe zusammenbauen und eine zusammengefügte PDF erzeugen
    Den vorher abgefragten Namen für die Ausgabe PDF nutzen um die PDF zu speichern
    Die Dateien aus den 3 Verzeichnissen löschen

    Ist in jedem Ordner NUR EINE Datei

    oder

    DIESELBE ANZAHL DATEIEN, die dann in der vorhandenen Reihenfolge jeweils mit Join verknüpft werden sollen?

    (Batch ist nicht mein Spezialgebiet)

  • Denkanstoß gesucht.

    • BugFix
    • 2. Juli 2021 um 09:20
    Zitat von dgi

    Ich möchte eine Batchdatei ausführen und einen Parameter an diese Batchdatei übergeben. Der Parameter soll in einem Popup eingegeben werden, dann in eine Variable gespeichert und die Batch übergeben werden.

    Ich freue mich auf Denkanstöße.

    1. $varInput = Inputbox(...) öffnet dir einen Dialog zum Eingeben von Werten

    2. Fehlerprüfung ob $varInput gültige Werte enthält

    3. wenn 2. JA: Aufruf Batch mit dem Parameter meine.bat & " " & $varInput (Befehl Run())

    In der Batch ist der Parameter über die %1 zu verwenden.

    ABER

    Viel besser wäre doch alles in AutoIt auszuführen.

  • Prozess überwachen bei False ein Batch ausführen

    • BugFix
    • 25. Juni 2021 um 11:44
    Zitat von bytesinner

    : Wie vermutete gibt es Probleme mit den Instance, mal geht es mal nicht das je nach Verbindung die zuletzt verwendet wurde, ändert sich die Instance von 1 bis 3, warum keine Ahnung.

    Dann hast du sicher andere Elemente im Fenster (Registerkarte), die du abfragen kannst. Dann in Abhängigkeit davon ändert sich ja die Instance.

  • Prozess überwachen bei False ein Batch ausführen

    • BugFix
    • 22. Juni 2021 um 20:54
    Zitat von bytesinner

    Mit Control bin ich dran aber komm mit den ersten Befehl in die nur teilweise zum Erfolg, wenn ich z.B ControlSend($hWnd, "", "[CLASS:TEdit; INSTANCE:1]", "Wartung Teststadt") verwende Funktioniert es erst mal aber nur solange im Anmelde Bildschirm vom Hauptraum nur das eine Edit Fenster existiert, ansonsten wird es zu Instance:2,

    Bei Edits solltest du auch mit ControlSetText arbeiten können, aber egal, wenns funktioniert.

    Es kann ein weiteres Edit auftauchen? Was ist der Auslöser? Das könnte man aber überwachen, Ctrl sind auch Fenster und lassen sich mit der WinAPI EnumChild Funktion in ihrem Fenster identifizieren.

  • Prozess überwachen bei False ein Batch ausführen

    • BugFix
    • 22. Juni 2021 um 12:37

    OK, im Detail hatte ich dein Skript noch nicht angeschaut. Deshalb mal meine Ansicht von dem was es tut:

    - #23 Start einer Endlosschleife

    - ff. Start "InteliMonitor.exe" (warum wird die zurückgelieferte PID nicht aufgefangen?)

    - Fenster aktivieren, maximieren (warum wird Fensterhandle nicht aufgefangen?)

    - Pixelsearch um festzustellen ob es geklappt hat?!! - Völlig sinnfrei, denn: wenn PID und Fensterhandle da sind, war die Aktion erfolgreich, zur Sicherheit könnte man das Fenster noch OnTop setzen.

    - ClipPut ---> na da wäre doch erstmal zu prüfen, ob das Eingabefeld überhaupt den Fokus hat (Ausnahme, ist das erste Control und hat automatisch den Fokus)

    - mehrere Send-Operationen zum Ausfüllen, letztes ENTER startet vermutlich

    - #42 aber was soll das ExitLoop hier? - Richtig: Es sagt dir, das alles, was vorher ablief ÜBERHAUPT NICHT in eine Schleife gehört, ist doch ein stinknormaler Programmablauf OHNE Wiederholungen!

    - Daraus resultiert, dass du nun NIEMALS auf die Schleife zur Prozessüberwachung gelangen kannst, du gehst ja vorher aus dem Ablauf raus!

    Also:

    Die äußere Schleife muss weg! (somit auch das ExitLoop in Zeile 42 und das folgende Sleep

    Ich habe mal den entsprechenden Teil geändert:

    AutoIt
                ; ...
                ; ...
                ; ...
                For $i = 0 To _FileCountLines($datei)
                    $text = FileReadLine($datei, $i)
                    If StringInStr($text, $suchen) <> 0 Then
                        _FileWriteToLine($datei, $i, $def, 1)
                    ElseIf StringInStr($text, $suchen2) <> 0 Then
                        _FileWriteToLine($datei, $i, $def2, 1)
                    EndIf
                Next
                $PID = Run("C:\Program Files (x86)\ComAp PC Suite\InteliMonitor\InteliMonitor.exe")
                WinActivate("InteliMonitor")
                $hWnd = WinWaitActive("InteliMonitor", '', 3) ; 3 Sekunden max. warten
                If $hWnd = 0 Then
                    ConsoleWrite("Fail!" & @CRLF)
                Else
                    WinSetState($hWnd, "", @SW_MAXIMIZE)
                    WinSetOnTop($hWnd, '', 1)  ; sicherheitshalber, damit die Send-Befehle auch ankommen
                    ClipPut("Wartung Teststadt2")
                    Send("^v")
                    Sleep(500)
                    Send("{TAB 5}")
                    Sleep(2000)
                    Send("{ENTER}")
                    Sleep(2000)
                    Send("{ENTER}")
                    While ProcessExists($PID)
                        Sleep(10)
                    WEnd
                    Run(@ScriptDir & "\bat files\Teststadt2\Disconnect.bat")
                EndIf
    Alles anzeigen


    EDIT:

    Hast du überhaupt mal probiert mit dem AutoIt Window Info Tool die Controls abzufragen. Dann könntest du evtl. Send ersetzen durch die Control - Befehle.

  • Prozess überwachen bei False ein Batch ausführen

    • BugFix
    • 22. Juni 2021 um 11:31
    Zitat von bytesinner

    ich sollte ein bestimmten Prozess dauerhaft Überwachen solange er ausgeführt wird und nach beenden ein Batch ausführen

    Ich würde einfach den Aufruf für diesen Prozess covern in einem RunWait. Dann kannst du den Aufruf der Folgeoperationen direkt skripten, da diese erst ausgeführt werden, wenn der mit RunWait gestartete Prozess beendet ist.

  • Wochentag- Feiertagsermittlung

    • BugFix
    • 17. Juni 2021 um 21:01

    ;)

    Ja, ich hatte damals das Bsp. einfach vorn drangeklatscht. Da muss natürlich das Include davor stehen.

  • autoit script immer laufen lassen?

    • BugFix
    • 17. Juni 2021 um 10:11
    Zitat von Racer

    Man(n) kann ein AutoIT-Programm als echtes Services laufen lassen?

    Ja, mache ich schon seit vielen Jahren. Wenn es kompiliert ist kannst du es wie jede andere exe als Service registrieren.

    Zitat von Racer

    Ich kenne nur srvany (uraltes MS-Tool) mit dem selbsterstellte ausführbare Programm die keine Userinteraktion haben als Service laufen lassen kann!

    Ob du zum Registrieren Windows Boardmittel (srvany wurde denke ich abgelöst von sc.exe), andere 3rdParty Tools oder PowerShell verwendest ist wohl egal.

    Zitat von Racer

    Um bei der ursprüngliche Frage auch was beizutragen: Als "Autostart" würde ich es nicht eintragen - hier gibt es massive Sicherheitslücken. Selbst als Task im Userkontext kann man mit Boardmittel das Kennwort des Users herausfinden.

    So, wie ich die Fragestellung verstanden habe, geht es hier nicht um Sicherheitsaspekte (nur lokaler PC), sondern um die Frage des Wie.

  • Wochentag- Feiertagsermittlung

    • BugFix
    • 17. Juni 2021 um 08:57
    Zitat von Tweaky

    Deine Feiertag UDF läuft nicht mehr. Schau sie dir bei Gelegenheit mal an

    Da sie bei mir unverändert läuft: In welcher Umgebung (was hat sich geändert - Windows Version?) und mit welchen Fehlermeldungen?

  • Virtuelle Webcam

    • BugFix
    • 15. Juni 2021 um 15:51

    Ich verstehe nicht, was du willst. Wenn du in der "virtuellen Kamera" nur die Zeit anzeigen willst, dann ist das eine Uhr und hat mit Kamera überhaupt nichts zu tun.

  • autoit script immer laufen lassen?

    • BugFix
    • 15. Juni 2021 um 10:22

    Dazu hat Windows die Aufgabenplanung erfunden. Ist die einfachste Lösung.

    Alternativ kannst du dein Skript auch als Dienst installieren. Wie das geht findest du definitiv im englischen Forum, wurde aber sicher hier auch behandelt - bemühe mal die Suche.

  • _WinAPI_CopyFileEx - bei Aufruf aus GUI muss diese den Fokus behalten

    • BugFix
    • 10. Juni 2021 um 09:19
    Zitat von UEZ

    probiere es doch mal mit "Volatile"

    Schau an, das Keyword ist noch nie auf meinem Schirm aufgetaucht. (Was auch bedeutet, dass ich einigen Lua-Skripten meine Pattern für Funktionsdeklarationen mal anpassen sollte)

    So "flüchtig" betrachtet klingt das schon mal ganz gut - werde es testen.

    Danke fürs Suchen.

  • _WinAPI_CopyFileEx - bei Aufruf aus GUI muss diese den Fokus behalten

    • BugFix
    • 9. Juni 2021 um 18:36
    Zitat von UEZ

    Falls mir noch was einfällt, melde ich mich.

    Danke für die Mühe.

  • Makro zur Anzeige des aktuellen "Include" und der aktuellen Function

    • BugFix
    • 8. Juni 2021 um 14:52

    So, hier eine besser zu händelnde Variante, Lua-basiert. Die erfüllt deine Wünsche vollständig. :P

    SciTE - Debug Function Call (in au3 Datei)

  • SciTE - Debug Function Call (in au3 Datei)

    • BugFix
    • 8. Juni 2021 um 14:50

    Angeregt durch diese Anfrage habe ich nach einer möglichst komfortablen Lösung gesucht.

    Herausgekommen ist: DebugFuncCallSC.lua und DebugFuncCallSC.au3

    Code
    - "DebugFuncCallSC.lua" muss in "SciTEStartup.lua" geladen sein
    
    - Anwendung
        Direkt in die Zeile nach einem Funktionsaufruf wird eingefügt: "_DebugFC_Set(@ScriptLineNumber)"
        Sollte die Folgezeile eine Fehlerauswertung enthalten, dann in die nächste Zeile einfügen. Das Skript prüft ob in der Zeile ein "@error"
        zu finden ist, und wertet dann die davor liegende Zeile aus.
        Nun sind die Informationen für
            "File"    Name der Datei, die die Funktionsdeklaration enthält (Include, aktuelle Datei oder "Native")
            "Func"    Name der aufgerufenen Funktion
            "Line"    Zeile des Funktionsaufrufs
        gespeichert bis zum nächsten Aufruf von "_DebugFC_Set()".
    
        Ausgewertet wird dann mit:  "$tDebug = _DebugFC_Get()"
        "$tDebug" enthält die oben bereits benannten Inhalte in den Feldern
            .File
            .Func
            .Line
        Bsp.:
            $result = _EineFunktion('bla', $a)    ; Aufruf in Zeile #25, Datei aus UserInclude "_MyUDF.au3"
            $iErr = @error
            _DebugFC_Set(@ScriptLineNumber)
    
            $tDebug = _DebugFC_Get()
            ConsoleWrite($tDebug.File & '|' & $tDebug.Func & '(' & $tDebug.Line & ')' & @TAB & ($iErr ? 'FEHLER' : 'OK') & @CRLF)
            ;==================================================================================================================
            OUTPUT:
            _MyUDF.au3 | _EineFunktion() (25)    OK
    Alles anzeigen

    Das Lua-Skript liest den Funktionsnamen aus, prüft ob diese Funktion im aktuellen Skript oder in einem der vorhandenen Includes deklariert wurde (falls nicht ist es eine native Funktion) und ermittelt die Zeile in der der Befehlsaufruf steht. Alles wird dann in eine temporäre Datei geschrieben.

    Das AutoIt-Skript schubst das Lua-Skript an ( mit _DebugFC_Set() ), liest die Ergebnisse aus der temp. Datei und bereitet sie auf ( mit _DebugFC_Get() ).

    WICHTIG!

    Damit das korrekte Include gefunden wird, muss auch das Include eingebunden sein, das die aufgerufene Funktion tatsächlich enthält. Ein rekursives Suchen (Include im Include) wird nicht durchgeführt.!

    Code: DebugFuncCallSC.lua
     -- TIME_STAMP   2021-06-08 13:41:48   v 0.1
    -- coding:utf-8
    
    --[[
    
    - Skript in "SciTEStartup.lua" starten
    - zugehöriges AutoItSkript "DebugFuncCallSC.au3" als Include
    
    ]]
    
    
    
    DebugFC = {}
    
    -----------------------------------------------------------------------------------------------------------------------------------------------------
    DebugFC.IsComment = function(self, _pos) local tComment = {1,2} if tComment[editor.StyleAt[_pos]] == nil then return false else return true end end
    
    DebugFC.InSense = function(self, _s) _s = _s:gsub("%a", function(_c) return string.format("[%s%s]", _c:upper(),_c:lower()) end) return _s end
    
    DebugFC.FileExists = function(self, _path) local fh = io.open(_path) if fh ~= nil then fh:close() return true else return false end end
    -----------------------------------------------------------------------------------------------------------------------------------------------------
    -- OK
    DebugFC.IncludeExistsInFolder = function(self, _incl)
        -- OpenPath (Pfade für Includes) abfragen
        local sOpen, tOpen = props['openpath.$(au3)'], {}
        for w in sOpen:gmatch("([^;]+)") do table.insert(tOpen, w) end
        -- Prüfen ob Include ohne Voranstellen von Ordner existiert (Include im Skriptdir oder kompletter Pfad im Include)
        if self:FileExists(_incl) then
            -- Ordnertrennzeichen im Pfad? ( "\" oder "/" )
            local p = _incl:find('\\[^\\]+$')
            if not p then p = _incl:find('/[^/]+$') end
            if p then
                return _incl:sub(1, p-1), _incl:sub(p+1)   -- Pfad, Dateiname.ext
            else
                return props['FileDir'], _incl
            end
        end
        -- in den gefundenen OpenPath nach Include suchen
        if #tOpen > 0 then
            for i=1, #tOpen do
                if self:FileExists(tOpen[i]..'\\'.._incl) then return tOpen[i], _incl end
            end
        end
        return nil, nil
    end
    
    -- OK
    DebugFC.DeclaredFuncsInEditor = function(self)
        local pattFunc = '('..self:InSense('func')..'%s+[%w_]+%s-%b())'
        local pattFuncName = '('..self:InSense('func')..'%s+)([%w_]+)(%s-%b())'
        local tFunc, e, n, sFunc, a = {}, 1, 0, ''
        local s = editor:GetText()
        while e do
            a, e, fname = s:find(pattFunc, e)
            if a and not self:IsComment(a) then
                _, _, _, fname = fname:find(pattFuncName)
                table.insert(tFunc, fname)
                n = n +1
            end
        end
        if n == 0 then return nil else return tFunc end
    end
    
    -- OK
    DebugFC.DeclaredFuncsInFile = function(self, _file)
        local pattFunc = '('..self:InSense('func')..'%s+[%w_]+%s-%b())'
        local pattFuncName = '('..self:InSense('func')..'%s+)([%w_]+)(%s-%b())'
        local tFunc, e, n, sFunc, s, a = {}, 1, 0, ''
        local fh = io.open(_file)
        if fh then s = fh:read('*a') fh:close() end
        if s ~= nil then
            while e do
                a, e, fname = s:find(pattFunc, e)
                if a then
                    _, _, _, fname = fname:find(pattFuncName)
                    table.insert(tFunc, fname)
                    n = n +1
                end
            end
        end
        if n == 0 then return nil else return tFunc end
    end
    
    -- OK
    DebugFC.GetIncludes = function(self)
        local text = editor:GetText()
        local tIncl, incl = {}, ''
        for _, incl in text:gmatch("[\n]?(#"..self:InSense('include').."%s-<([%w%s_.:\\/]+)>)") do table.insert(tIncl,incl) end            -- #include <abc.au3> --> abc.au3
        for _, _, incl in text:gmatch("[\n]?(#"..self:InSense('include').."%s-([\"'])([%w%s_.:\\/]+)%2)") do table.insert(tIncl,incl) end  -- #include 'abc.au3' or #include "abc.au3" --> abc.au3
        return tIncl
    end
    
    -- OK
    DebugFC.WhereDeclared = function(self, _f)
        -- im Skript deklarierte Funktionen - Rückgabe aktueller Skriptname
        local tCurrent = self:DeclaredFuncsInEditor()
        if tCurrent ~= nil then
            for i=1, #tCurrent do
                if tCurrent[i]:upper() == _f:upper() then
                    return props['FileNameExt']
                end
            end
        end
    
        -- in Includes deklarierte Funktionen - Rückgabe Includename
        local tIncluded, tFuncs = self:GetIncludes()
        if #tIncluded > 0 then
            for i=1, #tIncluded do
                local folder, file = self:IncludeExistsInFolder(tIncluded[i])
                if folder ~= nil then
                    -- Funktionsdeklarationen aus Includedateien ermitteln
                    tFuncs = self:DeclaredFuncsInFile(folder..'\\'..file)
                    if tFuncs ~= nil then
                        for j=1, #tFuncs do
                            if tFuncs[j]:upper() == _f:upper() then
                                return tIncluded[i]
                            end
                        end
                    end
                end
            end
        end
    
        -- nicht deklariert: nativ
        return 'Native'
    end
    
    
    -- In 1.te oder 2.te (ermöglicht vorheriges Abfangen von @error) Zeile unter Funktionsaufruf muss gesetzt werden: _DebugFC_Set(ScriptLineNumber)
    -- Wenn in der 1.ten Zeile vor "_DebugFC_Set" ein "@error" gefunden wird, verwendet das Skript die 2.te Zeile davor
    DebugFC.FuncFromLine = function(self, _line)
        -- _line ist @ScriptLineNumber, steht 1 Zeile unter dem gefragten Funktionsaufruf, ist 1-basiert -> für 0-basiert: -2
        _line = _line -2
        local line = editor:GetLine(_line)
        if line:find(self:InSense('@error')) then
            _line = _line -1
            line = editor:GetLine(_line)
            _line = _line +1
        end
        local sfunc = line:match('([%w_]+)(%s-%b())')
        local swrite, fh = ''
        if sfunc ~= nil then
            swrite = swrite..self:WhereDeclared(sfunc)..'\r\n'..sfunc..'()'..'\r\n'.._line..'\r\n'
            fh = io.open(os.getenv('TEMP')..'\\DebugFuncCall.result','w+') 
            fh:write(swrite)
            fh:close()
        end
    end
    
    -- Gibt die zuletzt gespeicherten Werte aus über: _DebugFC_Get()
    --[[ Bsp.
    $result = _EineFunktion('bla', $a)    ; Aufruf in Zeile #25, Datei aus UserInclude "_MyUDF.au3"
    $iErr = @error
    _DebugFC_Set(ScriptLineNumber)
    
    $tDebug = _DebugFC_Get()
    ConsoleWrite($tDebug.File & '|' & $tDebug.Func & '(' & $tDebug.Line & ')' & @TAB & ($iErr ? 'FEHLER' : 'OK') & @CRLF)
    
    ;==================================================================================================================
    #cs OUTPUT
    _MyUDF.au3 | _EineFunktion() (25)    OK
    #ce
    ]]
    Alles anzeigen
    AutoIt: DebugFuncCallSC.au3
    ;-- TIME_STAMP   2021-06-08 14:21:38   v 0.1
    
    #cs
    - "DebugFuncCallSC.lua" muss in "SciTEStartup.lua" geladen sein
    
    - Anwendung
        Direkt in die Zeile nach einem Funktionsaufruf wird eingefügt: "_DebugFC_Set(@ScriptLineNumber)"
        Sollte die Folgezeile eine Fehlerauswertung enthalten, dann in die nächste Zeile einfügen. Das Skript prüft ob in der Zeile ein "@error"
        zu finden ist, und wertet dann die davor liegende Zeile aus.
        Nun sind die Informationen für
            "File"     Name der Datei, die die Funktionsdeklaration enthält (Include, aktuelle Datei oder "Native")
            "Func"    Name der aufgerufenen Funktion
            "Line"    Zeile des Funktionsaufrufs
        gespeichert bis zum nächsten Aufruf von "_DebugFC_Set()".
    
        Ausgewertet wird dann mit:  "$tDebug = _DebugFC_Get()"
        "$tDebug" enthält die oben bereits benannten Inhalte in den Feldern
            .File
            .Func
            .Line
        Bsp.:
            $result = _EineFunktion('bla', $a)    ; Aufruf in Zeile #25, Datei aus UserInclude "_MyUDF.au3"
            $iErr = @error
            _DebugFC_Set(@ScriptLineNumber)
    
            $tDebug = _DebugFC_Get()
            ConsoleWrite($tDebug.File & '|' & $tDebug.Func & '(' & $tDebug.Line & ')' & @TAB & ($iErr ? 'FEHLER' : 'OK') & @CRLF)
            ;==================================================================================================================
            OUTPUT:
            _MyUDF.au3 | _EineFunktion() (25)    OK
    
    #ce
    
    
    
    Global $g_SciTECmd
    
    Func _DebugFC_Set($_lineNumber)
        _ScI_Dostring("DebugFC:FuncFromLine(_1)", $_lineNumber)
    EndFunc
    
    Func _DebugFC_Get()
        Local $sRead = FileRead(@TempDir & '\DebugFuncCall.result')
        Local $aSplit = StringSplit($sRead, @CRLF, 1)
        If $aSplit[0] < 3 Then Return
        Local $sFile = StringStripWS($aSplit[1], 2)
        Local $sFunc = StringStripWS($aSplit[2], 2)
        Local $sLine = StringStripWS($aSplit[3], 2)
        Local $iLen1 = StringLen($sFile)
        Local $iLen2 = StringLen($sFunc)
        Local $iLen3 = StringLen($sLine)
        Local $tGet = DllStructCreate( _
                    'char File[' & ($iLen1 = 0 ? 1 : $iLen1) & '];' & _
                    'char Func[' & ($iLen2 = 0 ? 1 : $iLen2) & '];' & _
                    'char Line[' & ($iLen3 = 0 ? 1 : $iLen3) & ']')
        $tGet.File = $sFile
        $tGet.Func = $sFunc
        $tGet.Line = $sLine
        Return $tGet
    EndFunc
    
    
    ;===============================================================================
    ; Function Name....: _ScI_Dostring
    ; Description......: Einen Luastring mit/ohne Parameter aufrufen OHNE ein Ergebnis zu erhalten
    ;                  : Parameter im Lua-String (max. 10) sind in der Form "_1", "_2", .., "_n" zu benennen.
    ; Parameter(s).....: $_sLua      - der Lua-String
    ;                  : $p1          - [optional] Parameter1 für den Lua-String ("_1")
    ;                  : ...            bis
    ;                  : $p10         - [optional] Parameter10 für den Lua-String ("_10")
    ; Return Value(s)..: keine
    ; Author(s)........: BugFix ( bugfix@autoit.de )
    ;-------------------------------------------------------------------------------
    ; Bsp.:
    ; ohne Parameter:
    ;   _ScI_Dostring("print('Hallo Welt!')")
    ;
    ; mit Parameter:
    ;   _ScI_Dostring("editor:SetSelection(_1,_2)", 4, 14)
    ;===============================================================================
    Func _ScI_Dostring($_sLuastring, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
        Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10], $index = 0
        While $aParamCall[$index] <> Null
            $_sLuastring = StringRegExpReplace($_sLuastring, '_\d+', $aParamCall[$index], 1)
            $index += 1
        WEnd
        SendSciTE_Command("extender:dostring do " & $_sLuastring & " end")
    EndFunc
    
    ; by BugFix
    Func _GetHwndDirectorExtension()
        Local $hActive = WinGetHandle('[ACTIVE]')
        Local $PIDActive = WinGetProcess($hActive)
        Local $aExtension = WinList("DirectorExtension")
        Local $PIDExt
        For $i = 1 To $aExtension[0][0]
            $PIDExt = WinGetProcess($aExtension[$i][1])
            If $PIDExt = $PIDActive Then Return $aExtension[$i][1]
        Next
    EndFunc
    
    ; by Jos
    Func SendSciTE_Command($_sCmd, $Wait_For_Return_Info=0)
        Local $WM_COPYDATA = 74
        Local $WM_GETTEXT = 0x000D
        Local $WM_GETTEXTLENGTH = 0x000E224
        Local Const $SCI_GETLINE = 2153
        Local $Scite_hwnd = _GetHwndDirectorExtension()          ; Get SciTE DIrector Handle
        Local $My_Hwnd = GUICreate("AutoIt3-SciTE interface")    ; Create GUI to receive SciTE info
        Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2))    ; Convert my Gui Handle to decimal
        $_sCmd = ":" & $My_Dec_Hwnd & ":" & $_sCmd               ; Add dec my gui handle to commandline to tell SciTE where to send the return info
        Local $CmdStruct = DllStructCreate('Char[' & StringLen($_sCmd) + 1 & ']')
        DllStructSetData($CmdStruct, 1, $_sCmd)
        Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
        DllStructSetData($COPYDATA, 1, 1)
        DllStructSetData($COPYDATA, 2, StringLen($_sCmd) + 1)
        DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
        $g_SciTECmd = ''
        DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
                'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
                'Ptr', DllStructGetPtr($COPYDATA))
        GUIDelete($My_Hwnd)
        If $Wait_For_Return_Info Then
            Local $n = 0
            While $g_SciTECmd = '' Or $n < 10
                Sleep(20)
                $n += 1
            WEnd
        EndIf
        Return $g_SciTECmd
    EndFunc   ;==>SendSciTE_Command
    
    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
        Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
        Local $SciTECmdLen = DllStructGetData($COPYDATA, 2)
        Local $CmdStruct = DllStructCreate('Char[' & $SciTECmdLen+1 & ']',DllStructGetData($COPYDATA, 3))
        $g_SciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $SciTECmdLen)
    EndFunc   ;==>MY_WM_COPYDATA
    Alles anzeigen

    Dateien

    DebugFuncCallSC.lua 5,64 kB – 590 Downloads DebugFuncCallSC.au3 5,59 kB – 594 Downloads
  • _WinAPI_CopyFileEx - bei Aufruf aus GUI muss diese den Fokus behalten

    • BugFix
    • 8. Juni 2021 um 09:31

    Ich habe nahezu identisch zum Hilfebeispiel die Funktion _WinAPI_CopyFileEx verwendet.

    In einer GUI werden Quelle und Ziel gewählt, die Progressbar ist in die Statusbar der GUI eingebettet.

    Soweit ist das alles funktionsfähig (es werden Dateien 1 - 2 GB Größe kopiert).

    Wenn jedoch die GUI den Fokus verliert, hängt sich die Anwendung auf.

    Hier mal ein (so nicht lauffähiger) Ausschnitt des Skriptes mit den wesentlichen Inhalten für die Kopierfunktion:

    AutoIt
    Global $hProgressProc = DllCallbackRegister('_ProgressProc', 'bool', 'uint64;uint64;uint64;uint64;dword;dword;handle;handle;ptr')
    
    Global $INI = _ScriptNameINI(False)
    If Not FileExists($INI) Then Exit MsgBox(16, 'FEHLER', 'Die Datei ' & @CRLF & '"' & $INI & '"' & @CRLF & 'ist nicht im Programmordner!')
    
    Global $sourcePC = IniRead($INI, 'copy', 'source_pc', '\\Server\GDILine\Factur')
    Global $targetUSB = StringLeft(@ScriptDir, 3)
    
    Global $sourceUSB = $targetUSB
    Global $targetVM = IniRead($INI, 'copy', 'target_vmshare', 'C:\VM_Share')
    
    Global $sTitle = 'GDI.GDB - CopyTool'
    Global $hGui = GUICreate($sTitle, 600, 175)
    GUISetBkColor(0xFFFFFF)
    Global $tGroup = _GuiCtrlGroup_Create($hGui, 'Kopieren Datenbank Datei', 15, 15, 570, 125, 0x000080, 0x33A644, -1, BitOR($_GROUPTEXT_RIGHT, $_GROUPTEXT_ITALIC))
    GUICtrlCreateLabel('Bitte den Kopiervorgang auswählen!', 25, 30)
    Global $rPC2USB = GUICtrlCreateRadio(' Kopiere vom PC auf USB-Stick', 25, 50)
    GUICtrlSetState(-1, $GUI_CHECKED)
    Global $rUSB2Share = GUICtrlCreateRadio(' Kopiere vom USB-Stick auf Share des Virtual-PC', 25, 75)
    Global $btRun = GUICtrlCreateButton('Starte Kopiervorgang', 390, 70, 185, 25)
    Global $lbComplete = GUICtrlCreateLabel('', 25, 105, 550, 20) ;  ERFOLG
    GUICtrlSetColor(-1, 0x0000FF)
    
    Global $hStatus = _GUICtrlStatusBar_Create ($hGUI)
    _GUICtrlStatusBar_SetMinHeight($hStatus, 20)
    Global $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
    GUICtrlSetColor(-1, 0x008B00) ; grün
    _GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress))
    
    GUISetState(@SW_SHOW)
    
    Global $tFile, $source, $target
    
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $btRun
                If BitAND(GUICtrlRead($rPC2USB), $GUI_CHECKED) Then
                    $source = $sourcePC
                    $target = $targetUSB
                Else
                    $source = $sourceUSB
                    $target = $targetVM
                EndIf
                $tFile = _GDInewestFile($source) ; die neueste Datei im Quellordner suchen
                If @error Then
                    MsgBox(16, 'FEHLER', $tFile)
                Else
                    GUICtrlSetState($btRun, $GUI_DISABLE)
                    GUICtrlSetData($lbComplete, 'Kopiere: GDI.GDB vom "' & $tFile.Date & '"')
                    _Copy_w_Progress($tFile.Path & $tFile.File, StringRegExpReplace($target, '(\\)*$', '') & '\' & $tFile.File)
                EndIf
    
        EndSwitch
    WEnd
    
    
    Func _Copy_w_Progress($_source, $_destination)
        If Not _WinAPI_CopyFileEx($_source, $_destination, 0, DllCallbackGetPtr($hProgressProc)) Then
            _WinAPI_ShowLastError('Beim Kopieren der Datei "' & $_source & '" ist ein Fehler aufgetreten.')
            _ProgressSetData()
            WinSetTitle($hGUI, '', $sTitle)
            GUICtrlSetData($lbComplete, '')
            GUICtrlSetState($btRun, $GUI_ENABLE)
        EndIf
    EndFunc
    
    Func _ProgressProc($iTotalFileSize, $iTotalBytesTransferred, $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData)
        #forceref $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData
        Local $iPercent = Round($iTotalBytesTransferred / $iTotalFileSize * 100)
        _ProgressSetData($iPercent, $iTotalBytesTransferred, $iTotalFileSize, $lbComplete)
        Sleep(10)
        Return $PROGRESS_CONTINUE
    EndFunc
    
    
    Func _ProgressSetData($_i=-1, $_BytesTrans=0, $_BytesTotal=0, $_idMsg=Null)
        GUICtrlSetData($idProgress, ($_i = -1 ? 0 : $_i))
        Local $sPercent
        Switch $_i
            Case 100
                $sPercent = '     [ Vollständig ]'
                If $_idMsg <> Null Then GUICtrlSetData($_idMsg, 'Kopiervorgang abgeschlossen.')
                AdlibRegister('_ResetProgess', 750)
            Case -1
                $sPercent = ''
            Case Else
                $sPercent = StringFormat('     [ %s von %s - %d %% ]', _FormatByte($_BytesTrans, '', False, 1), _FormatByte($_BytesTotal, '', False, 1), $_i)
        EndSwitch
        WinSetTitle($hGUI, '', StringFormat('%s%s', $sTitle, $sPercent) )
    EndFunc
    
    
    Func _ResetProgess()
        AdlibUnRegister('_ResetProgess')
        _ProgressSetData()
        GUICtrlSetState($btRun, $GUI_ENABLE)
    EndFunc
    
    
    Func _Exit()
        DllCallbackFree($hProgressProc)
    EndFunc
    
    ; ...
    ; folgend: Funktionen für INI-Name, Ermittlung neueste Datei, Formatierung Byte
    Alles anzeigen

    Ich kann mir keinen Zusammenhang zwischen aktiver GUI und Funktionsfähigkeit der Kopierfunktion herleiten.

    Hat jemand eine Idee?

  • Makro zur Anzeige des aktuellen "Include" und der aktuellen Function

    • BugFix
    • 7. Juni 2021 um 18:55

    Vielleicht ist der Ansatz zum Abfragen von Funktionsname und Zeile des Aufrufs für dich interessant.

    AutoIt: DebugFuncCall.au3
    ;-- TIME_STAMP   2021-06-07 21:58:19   v 0.2
    
    Global $g_bDEBUG_CALL = False
    Global $g_iDEBUG_LINE = 0
    Global $g_iDEBUG_FUNC = ''
    Global $g_iDEBUG_ERR = 0
    Global $g_iDEBUG_EXT = 0
    Global $g_vDEBUG_RET = ''
    
    
    Func _Debug_Start()
        $g_bDEBUG_CALL = True
    EndFunc
    
    
    Func _Debug_Stop()
        $g_bDEBUG_CALL = False
    EndFunc
    
    
    ;---------------------------------------------------------------------------------------------------
    ; Gibt Werte der zuletzt mit _Debug_CallFunc() aufgerufenen Funktion zurück
    ; Parameter:
    ;    $_sStringFormat        Formatstring ohne Variablen
    ;    $_p1 .. $_p6        Die im Formatstring verwendeten Variablen in der dort genutzten Reihenfolge
    ;                         Verfügbare Variablen als String übergeben:
    ;                         "line"    Zeile des Funktionsaufrufes
    ;                         "func"    Funktionsname
    ;                         "err"    Fehlerwert des Funktionsaufrufs
    ;                         "ext"    Erweiterter Returnwert des Funktionsaufrufs
    ;                         "ret"    Returnwert des Funktionsaufrufs
    ;                         "time"    Aktuelle Zeit als "hh:mm:ss"
    ; Bsp:
    ;    _Debug_Output('Aufgerufen: %s in Zeile: %d mit Fehlerwert: %d', "func", "line", "err")
    ;---------------------------------------------------------------------------------------------------
    Func _Debug_Output($_sStringFormat, $_p1, $_p2='', $_p3='', $_p4='', $_p5='', $_p6='')
        If Not $g_bDEBUG_CALL Then Return ConsoleWrite('!> Debug nicht gestartet!' & @CRLF)
        Local Static $oAssign = ObjCreate('Scripting.Dictionary')
        $oAssign.Item("line") = $g_iDEBUG_LINE
        $oAssign.Item("func") = $g_iDEBUG_FUNC
        $oAssign.Item("err") = $g_iDEBUG_ERR
        $oAssign.Item("ext") = $g_iDEBUG_EXT
        $oAssign.Item("ret") = $g_vDEBUG_RET
        $oAssign.Item("time") = StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC)
        Local $aArg[] = ['CallArgArray', $_sStringFormat, $_p1, $_p2, $_p3, $_p4, $_p5, $_p6]
        For $i = 2 To UBound($aArg) -1
            If $aArg[$i] <> '' Then
                $aArg[$i] = $oAssign.Item($aArg[$i])
            Else
                ReDim $aArg[$i]
                ExitLoop
            EndIf
        Next
        ConsoleWrite(Call('StringFormat', $aArg) & @CRLF)
    EndFunc
    
    
    ;---------------------------------------------------------------------------------------------------
    ; Funktionsaufruf in die Debugfunktion packen
    ; Parameter:
    ;    $_iLine            MUSS @ScriptLineNumber sein!
    ;    $_sFunc            Name der Funktion als String
    ;    $_p1 .. $_p10    optionale Parameter für die aufgerufene Funktion
    ; Return:            Returnwert, @error und @extended der aufgerufenen Funktion
    ;---------------------------------------------------------------------------------------------------
    Func _Debug_CallFunc($_iLine, $_sFunc, $_p1=Null, $_p2=Null, $_p3=Null, $_p4=Null, $_p5=Null, $_p6=Null, $_p7=Null, $_p8=Null, $_p9=Null, $_p10=Null)
        Local $vRet, $iErr, $iExt
        Local $aArg[] = ['CallArgArray', $_p1, $_p2, $_p3, $_p4, $_p5, $_p6, $_p7, $_p8, $_p9, $_p10]
        If $_p1 = Null Then
            $vRet = Call($_sFunc)
            $iErr = @error
            $iExt = @extended
        Else
            For $i = 2 To UBound($aArg) -1
                If $aArg[$i] = Null Then
                    ReDim $aArg[$i]
                    ExitLoop
                EndIf
            Next
            $vRet = Call($_sFunc, $aArg)
            $iErr = @error
            $iExt = @extended
        EndIf
        If $g_bDEBUG_CALL Then
             $g_iDEBUG_FUNC = $_sFunc
             $g_iDEBUG_LINE = $_iLine
             $g_iDEBUG_ERR = $iErr
             $g_iDEBUG_EXT = $iExt
             $g_vDEBUG_RET = $vRet
        EndIf
        Return SetError($iErr, $iExt, $vRet)
    EndFunc
    Alles anzeigen
    AutoIt: Beispiel
    #include 'DebugFuncCall.au3'
    
    ; Debug aktivieren
    _Debug_Start()
    
    
    ; Aufruf von: ConsoleWrite('Hallo Welt!' & @CRLF) mit Debugfunktion
    _Debug_CallFunc(@ScriptLineNumber, 'ConsoleWrite', 'Hallo Welt!' & @CRLF)
    
    ; Ausgabe Debug
    _Debug_Output('Aufgerufen: %s() in Zeile: [%d] mit Fehlerwert: %d', "func", "line", "err")
    
    ; andere Ausgabe zu selbem Aufruf (da noch kein weiterer Aufruf erfolgte)
    _Debug_Output('[%s] Funktion: %s(), Zeile: %d, Return: %d, Fehler: %d', "time", "func", "line", "ret", "err")
    
    ; Debug beenden
    _Debug_Stop()
    
    ; Die in Debug eingebetteten Funktionen funktionieren weiterhin
    ; Aufruf von: ConsoleWrite('Aufruf ohne DEBUG!' & @CRLF) mit Debugfunktion
    _Debug_CallFunc(@ScriptLineNumber, 'ConsoleWrite', 'Aufruf ohne DEBUG!' & @CRLF)
    
    ; Ausgabe Debug jetzt ohne Wirkung
    _Debug_Output('Aufgerufen: %s() in Zeile: [%d] mit Fehlerwert: %d', "func", "line", "err")
    Alles anzeigen
  • Makro zur Anzeige des aktuellen "Include" und der aktuellen Function

    • BugFix
    • 7. Juni 2021 um 10:41
    Zitat von HansJ54

    anzuzeigen in welchem Include und in welcher Function sich das Programm gerade befindet?

    Für AutoIt ist mir da nichts Natives bekannt.

    Du suchst sowas, wie in Lua:

    Code
    local ct = require 'CommonTools'  -- ein Include
    
    local callme = function() -- nur Debugzeile
        print(string.format('%s\t|\t%s\t(%d)', debug.getinfo(1).short_src, debug.getinfo(1,"n").name, debug.getinfo(2).currentline))
    end
    
    
    callme() -- Aufruf aus aktueller Datei "debug_test.lua"
    
    ct:OSTime()  -- Aufruf der includierten Funktion des Includes "CommonTools.lua" (enthält identische Debugzeile)

    OUTPUT:

    Code
    C:\CODE\Lua\debug_test.lua     |    callme    (8)
    C:\Code\Lua\CommonTools.lua    |    OSTime    (10)

    Die Debug-Bibliothek muss in der Programmsource (nicht im Skript) verankert sein. Sowas ist wohl leider für AutoIt nie entwickelt worden.

    Um da mittels Skript zuzugreifen müsste man wohl so einiges im Ablauf umleiten und verbiegen. Ist wohl auch einer der Gründe, warum sich bisher keine Debug-UDF wirklich etablieren konnte.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™