Beiträge von Musashi

    Könnte es eventuell sein, dass er gar nicht Multiprocessing/Threading meint sondern einfach nur die Auslagerung von Code in mehrere Dateien (wie alpines schon andeutete)?


    Sezer - falls es so sein sollte: >>#Include<<

    Ergänzend zu der Auslagerung von Code in Includes gibt es, zur Förderung der Übersichtlichkeit bei großen Skripten, auch noch das sog. code-folding ( Sezer : falls Du das nicht kennen solltest) :

    https://www.autoitscript.com/f…4-scite-and-code-folding/

    https://www.autoitscript.com/f…cite-fold-within-regions/


    Gruß Musashi

    Hi Peter !

    Ich möchte Dich natürlich nicht beleidigen indem ich Dir Links präsentiere, die Du wahrscheinlich schon selbst gefunden hast - bin aber 1. kein "LDAP-Fachmann" und 2. muss ich gleich los ;)


    von water :

    https://www.autoitscript.com/w…e_Directory_UDF_-_General

    EDIT : Peter S. Taler - genauer :

    https://www.autoitscript.com/w…tory_UDF_-_GetObjectsInOU


    https://www.autoitscript.com/f…indComment&comment=206892

    https://www.ip-insider.de/was-…access-protocol-a-581204/

    und wie üblich Wikipedia :P


    Gruß Musashi

    Kleine Erweiterung zu alpines Antwort :


    Was Du brauchst ist etwas wie :

    $s_Line = StdoutRead($iPID);, False, False)

    $iError = @error

    $iExtended = @extended

    If $iExtended > 0 Then $sOEM &= $s_Line

    ...


    Auch Funktionen, die lt. Hilfe kein @error, @extended selbst setzen, reseten diese aber !


    Gruß Musashi

    Hi krone !


    Da Du gerade online bist, eine schnelle Frage :

    Startest Du die AltEXE über DOSBox und arbeitest Du dann innerhalb der .exe die ganzen DOS-Dateien ab, oder : Startest Du die AltEXE mit der jeweilgen DOS-Datei als Übergabeparameter ?

    Beschreibe bitte mal den Arbeitsablauf etwas genauer !


    Gruß Musashi

    Bei der Exe-Datei handelt es sich, wie bereits von euch erkannt, um eine Uralt-DOS.EXE.

    Beim einfachen Ausführen erscheint die von Musashi gesendete Fehlermeldung. Der Hinweis von AutoIt 3.0 wäre schonmal ein neuer Ansatz. Diesen werde ich mal nachgehen. Danke!

    Da die besagte Fehlermeldung auftaucht, arbeitest Du offenbar an einem 64-Bit Windows.

    Ich denke, dass Dir eine ältere Version von AutoIt nicht weiterhilft, da OS=64-Bit den Start der .exe verhindert (ungetestet) -> der Run-Befehl von AutoIt beinhaltet ja keine DOS-Emulation.


    Daher würde ich dem Vorschlag von alpines mit NTVDM (siehe Beitrag #8) den Vorzug geben !


    Hättest Du ggf. Lust (bzw. die Erlaubnis) mal eine der 'DOS-Dateien' zu posten ?

    Da nur Koordinaten enthalten sind, wäre das unkritisch und man könnte sich die Daten per Hex-Editor

    ansehen. (Nebenbei : Geht es um die Steuerung einer CNC-Maschine o.Ä. ? )


    Gruß Musashi

    Hab ich was bei deinem Post übersehen oder hast du dich bei meinem verlesen?

    Der Klarheit halber:

    32-Bit + 16-Bit OK,

    64-Bit + 16 Bit nur mit NTVDM (>Win10 ?).

    Nein, Du hast nichts übersehen, ich habe mich nur unklar ausgedrückt :Face:.

    Na ja, mal abwarten was krone von sich gibt.


    Gruß Musashi

    Ich glaub mich dunkel daran zu erinnern, dass 16-Bit Anwendungen auf 32-Bit Windows unterstützt werden, allerdings auf 64-Bit nicht.

    Möglich, ggf. aber auch nur bis XP :/. Bei Win 7 64-Bit meldet Run jedenfalls :


    Mal abwarten, ob krone etwas zur Natur der auszuwertenden 'DOS-Dateien' sagen kann/möchte.

    Vielleicht ist ein neues Auswertungsprogramm in AutoIt ja weniger aufwändig als gedacht.

    Allerdings gibt es für Windows 10 x64 was das nennt sich NTVDM

    Das könnte krone ggf. weiterhelfen.


    EDIT :

    Na dann ab ins Archiv, AutoIt v3.0 war meines Wissens noch für 16Bit ausgelegt. ;)

    Ich habe auf der Abseite noch einen alten PC mit Win 98 stehen - der würde es sicher auch tun :P


    Gruß Musashi

    Es ergibt doch keinen Sinn, an eine "DOS-Box" mühselig etwas mit Send zu übertragen.

    Eine Exe lässt sich im Hintergrund mit Run ausführen und die Ergebnisse können mit StdoutRead ausgelesen werden. StdinWrite erlaubt direktes Schreiben in die Konsole.

    Im Prinzip hast Du natürlich völlig recht !

    Hier scheint es sich aber um eine Uralt-DOS.EXE (16-Bit) zu handeln, die man mit Run nicht ausführen kann ! Ich kenne das von alten DOS-Spielen aus den 1990ern. Auch dort muss man den Umweg über einen DOS-Emulator (hier also DOSBox) gehen.


    ControlSend scheint, im Gegensatz zu Send, nicht zu funktionieren, weil die DOSBox-Konsole als eine Art Childprozess der Box ausgeführt wird. Vermutlich gibt es bzgl. der Handles Probleme (ungetestet). Send sendet hingegen einfach an das aktive Fenster - ich habe das jetzt aber nicht im Detail analysiert;).


    krone könnte die DOSBox-Fenster leicht manuell minimieren, das wäre beim Einsatz eines derart alten Programmes sicher zumutbar.


    Gruß Musashi

    Mit Hilfe der DOSBOX rufe ich eine EXE-Datei auf, die mir durch entsprechende Eingaben Werte aus DOS-Dateien ausliest. Diese Werte benötige ich für eine Weiterverarbeitung, aber ohne die EXE-Datei komme ich nicht and die Werte heran

    Ich würde an Deiner Stelle einen anderen, stabileren Ansatz prüfen, d.h. mit AutoIt ein neues Auswertungsprogramm erstellen (als Ersatz für die .EXE-Datei). Diese ist vermutlich 'zig Jahre alt, Quellcode gibt es nicht mehr (Programmierer nicht mehr greifbar) und sie läuft nicht unter Windows (daher ja die DOSBox).


    Könntest Du, ohne Geheimnisse zu offenbaren, beschreiben, um was für 'DOS-Dateien' es sich handelt ? :

    - Format ?

    - welche Daten enthalten sie (gibt es ggf. eine Schnittstellenbeschreibung) ?

    usw.


    Gruß Musashi

    Kann mir jemand sagen, wo mein Fehler liegt und wennmöglich auch weiterhelfen?

    Wenn Du statt ControlSend den Befehl Send verwendest, dann geht es :

    Code
    1. Run("C:\Program Files\DOSBox-0.74-2\DOSBox.exe")
    2. Sleep(1000)
    3. Local $sTitle2 = WinGetTitle("[ACTIVE]")
    4. Local $hWnd2 = WinGetHandle($sTitle2)
    5. Send("12345")
    6. Sleep(3000)
    7. WinClose($sTitle2)


    EDIT (Nachtrag) :

    Im Grunde kannst Du sogar auf die Zeile Local $hWnd2 = WinGetHandle($sTitle2) verzichten, da Send an das aktuell aktive Fenster sendet. Weitere Infos : siehe Hilfe zu Send, z.B. Send("dir {ENTER}")


    Gruß Musashi

    Da wäre es fast einfacher, vorher alle Strings rauszuparsen.

    Diese Vermutung drängt sich mir auch auf !


    Andy hat es vor kurzem in einem Beitrag treffend ausgedrückt :

    Regex "Multipattern" möglich?

    Zitat

    Ich zumindest nutze RegExe dann, wenn der Aufwand, ein String"problem" abzuwickeln, mit den Standard-Stringfunktionen deutlich aufwendiger abzuwickeln wäre, bzw. es per Regex deutlich einfacher (auch zu debuggen) ist.

    Wobei ich persönlich auch keine Skrupel habe, unterschiedlichste RegEx- und Stringfunktionen so zu mischen, dass es passt. Nirgendwo steht geschrieben, dass RegExe Einzeiler sein müssen, obwohl viele "Profis" das so verstehen (wollen).

    Gruß Musashi

    --> Zitat Musashi : "Diese Punkte würden mich interessieren, gerne vorab auch als Konversation."


    Bitte ausschließlich als Konversation. Wir hatten diesbezüglich lang und breit bei der Einführung der Regeln diskutiert. Und es gibt keinen Anlass zum Hinterfragen der Regeln.

    Selbstverständlich ausschließlich als Konversation ;)!


    Mir ist bewusst, dass das Erstellen der Forumsregeln ein längerer, und mitunter sicher auch nerviger Prozess war. Da ich zudem hinter den Regeln stehe, sehe ich keinen Grund diese zu hinterfragen.

    Mich interessiert lediglich Yjuq 's persönliche Meinung !


    Gruß Musashi

    Hallo Yjuq !


    Da Du ein Zitat von mir genommen hast, antworte ich mal ;):

    In weiten Teilen gebe ich Dir durchaus recht ! Wie sich ein Einsteiger dem Thema AutoIt nähert, ist letztlich ihre/seine Sache und wohl auch dem Zufall geschuldet.

    Ich kann die Skepsis bei den "eingesessenen Hasen" durchaus verstehen, allerdings muss man auch bedenken dass Menschen, die noch nie was programmiert haben, gar nicht mit den Begrifflichkeiten und Möglichkeiten vertraut sind.

    Trotz der gewissen Skepsis wurden SchlafMoon aber weiterführende Hinweise gegeben :

    Die Func pause() ist z.B. eine Endlosschleife. Dort kommst Du nur 'raus, wenn Du das Skript z.B. über das Menü -> [Tools] -> Stop Executing abbrichst.

    EDIT : Ach ja, und natürlich "Willkommen im Forum" ^^

    Dein "Problem" besteht aktuell darin, dass du aus deiner starten() Funktion gar nicht mehr raus kommst. Dort fehlt eine Bedingung für ein ExitLoop. Genauso ... in der Pause() Funktion.

    -> Die Beispielskripte der AutoIt-Hilfe liefern viel Nützliches, was man zum Einstieg braucht (selbst für ControlSend ;)) usw.

    Und ganz ehrlich? Die meisten Infos die man aus dem Forum bekommt (auch bei Anwendungen wo es laut Forenregeln legitim ist) können sowieso für Game-Bots genutzt werden.

    Völlig klar !

    Es liegt in der Natur der Sache, dass derselbe Quellcode sowohl für 'gute' als auch 'schlechte' Zwecke eingesetzt werden kann. Insofern spiegeln die Forenregeln mehr einen moralischen Anspruch wider, denn ein Mittel zur Verhinderung von Bots. Wer dies beabsichtigt, wird zwei recht naheliegende Suchbegriffe bei Google eingeben und bekommt haufenweise Tipps, inkl. YouTube-Tutorials.

    Zumal ich sowieso dafür bin, die Forenregeln nochmal in ein zwei Punkten zu überdenken. Das ist aber ein anderes Thema.

    Diese Punkte würden mich interessieren, gerne vorab auch als Konversation.


    Gruß Musashi

    Ich denke mein Fehler liegt hier irgendwo

    Könntest Du Dir in Zukunft bitte mal angewöhnen, ein lauffähiges (Teil-)Skript zu posten, welches den Fehler/das Problem reproduzierbar darstellt !

    Gut, in diesem Fall hast Du es selbst gefunden. Wie aber soll man Dir helfen, wenn man nur dieses aussagearme Codefragment (s.o.) zur Verfügung hätte ?? ;)


    EDIT : alpines war schneller - zwei Dumme, ein Gedanke:P.


    Gruß Musashi

    Und wo soll das am Ende Anwendung finden, bestimmt nicht in Npp ?

    Ich teile diese Skepsis, was den eigentlichen Zweck des Skriptes angeht ;) !

    Ich probiere wie gesagt nur 'rum ich versuche mich in AutoIt zu verbessern und das ist halt meine erste GUI mit Buttons usw.

    Für den Einstieg in GUIs, Buttons etc. gibt es sinnvollere Anwendungsfälle als Zeichenfolgen an eine Fremdsoftware (Stichwort : BOT) zu senden.

    Ein Beispiel für ControlSend findest Du übrigens in der Hilfe.

    Dein "Problem" besteht aktuell darin, dass du aus deiner starten() Funktion gar nicht mehr raus kommst. Dort fehlt eine Bedingung für ein ExitLoop. Genauso sieht es in der Pause() Funktion aus.

    Damit ist alles gesagt - es fehlen die Abbruchbedingungen.

    Folge : Die While-Schleifen laufen endlos und das Skript muss manuell terminiert werden.


    Gruß Musashi

    ... aber sobald ich Stop drücke oder versuche die Gui zu schließen geht das nicht.

    Beschreibe bitte mal mit einigen Sätzen was Du überhaupt beabsichtigst.

    Die Func pause() ist z.B. eine Endlosschleife. Dort kommst Du nur 'raus, wenn Du das Skript z.B. über das Menü -> [Tools] -> Stop Executing abbrichst.


    EDIT : Ach ja, und natürlich "Willkommen im Forum" ^^


    Gruß Musashi

    Ein Frage an alpines , wenn ich die Globale Variable in der Funktion so deklariere wie ich es in der

    auskommentierten Zeile stehen habe, sollte es aber doch auch machbar sein ohne Probleme oder nicht?

    Bei meiner Variante wird die Globale Variable nur dann deklariert wenn sie noch nicht exisitert,

    die Deklarierung wird also maximal einmal durchgeführt.

    Es geht nicht darum zu prüfen, ob eine globale Variable bereits deklariert wurde. Die globale Variable $g_sString2 ist erst global verfügbar, nachdem Du eine Funktion aufrufst. Kommentiere in dem Skript mal _DeclareVars() ein und aus :

    Gruß Musashi

    Interprozesskommunikation ist das Stichwort.

    Sehe ich auch so, z.B. :

    kommunikation zwischen Scripten


    Sofern das Ganze nicht zeitkritisch ist, könnte man alternativ die Daten auch mittels einer 'Zwischendatei' austauschen. Hier wäre .ini aber ungeeignet - schaue Dir mal _FileWriteFromArray und _FileReadToArray an. Die Übertragung von Daten per Kommandozeilenparameter (Stichwort CMDLine) fällt bei Dir wohl weg, da Du die Limits (Anzahl/Länge der Parameter) wahrscheinlich überschreitest.


    Gruß Musashi

    gibts einen Befehl, der NUR zahlen oder NUR Buchstaben herausfiltert ?

    So etwas in der Art :

    Gruß Musashi

    ich habe dein Script bearbeitet und getestet.

    Es funktioniert. Was mir noch fehlen würde wäre ein Aktualisieren (also neu einlesen des Pfades)


    Edit: Beim Programmstart sind noch keine Dateien vorhanden. Das Script gibt eine Fehlermeldung aus. Es soll aber eine leere Filelist anzeigen und nachdem Dateien im Ursprungspfad vorhanden sind über den Aktualisieren Button erscheinen.

    Ich habe mein Basisskript mal nach Deinen Wünschen erweitert.

    Neu :

    -> 'Aktualisieren' - Button ==> akt. Fileliste des Quellordners wird eingelesen

    -> Fehlermeldung wird beim Programmstart nur ausgegeben, falls der Quellordner nicht existiert.

    -> ist der Quellordner vorhanden aber leer, dann -> 'Aktualisieren' , sobald was drin ist.



    ->Verschieben starten ==> noch nicht realisiert

    Hier musst Du Dir nur noch die Zielpfade 'zusammenbasteln' und einbauen. Das hatten wir aber bereits alles ausführlich im Thread : Kopiertool

    besprochen - solltest Du also selbst hinbekommen :P

    Wie Du Dich wahrscheinlich erinnern kannst, war Dein Ausgangsskript damals bereits, nennen wir es mal freundlich, ziemlich verfrickelt ;). Wir haben es nur weitergeführt, da Du auf dieser Basis lernen und selbst entwickeln wolltest. Die fehlenden Elemente jetzt einfach per Copy&Paste in das neue Design zu übernehmen ist keine gute Idee. Du hast z.B. Global-Deklarationen in eine Funktion kopiert, und Deine _filemove Funktion wird so auch nicht funktionieren, da sie die Checked-Flags der FileList gar nicht berücksichtigt. Ich würde Dir raten, hier noch etwas Arbeit 'reinzustecken.


    Gruß Musashi