Beiträge von BugFix

    _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):

    OK, probier mal (ungetestet):


    EDIT:

    War ein fehler beim FileDelete & Include ergänzt

    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)

    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.

    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.

    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:



    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.

    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.

    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.

    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.

    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.

    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.

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

    Herausgekommen ist: DebugFuncCallSC.lua und DebugFuncCallSC.au3

    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.!



    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:

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

    Hat jemand eine Idee?

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



    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.