Dos (CMD) Box auslesen zum 1000sten

  • Mahlzeit,

    vorab -ja ich habe gesucht - nein ich verstehe es nicht.

    Nun denn.

    Ich öfnne ein EXE die in einem dos Fensterläuft, via run. Nur leider kann im run Befehl nicht der Aufruf zur Exe stehen sondern seinerseits ein Aufruf zu einer Hilfsverknüpfung. (Das muss so sein!) Das funktioniert auch.

    Das Fenster öffnet, der Name des Fensters 'Test' ist immer der gleiche, soweit alles ok. Nun versuche ich den Inhalt des Fensters zu lesen. Dieser Inhalt ist keine Ausgabe im Sinne von C:\Dir *.* sondern ein Menü. Die Startseite eines Programmes. Dort steht dann Hauptmenü Stammdaten uvam. Es ist aber kopierbarer Text. Mit Maus und Notepad++ läßt sich der Fensterinhalt kopieren und darstellen.

    Diesen Fenstrinhalt möchte ich auslesen:

    Local $iPID = WinGetHandle ('Test','')

    MsgBox (0,'pid', $iPID) ---> 0x008F0920Local $sOutput = StdoutRead($iPID)

    MsgBox (0,'$sOutput', $sOutput) ---> leer

    Local $aArray = StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@CRLF)), @CRLF)

    _ArrayDisplay($aArray) --> [0] = 1 [1] = ''

    Was mache ich da falsch? Alles?


    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Oscar ,

    freundlicherweise heisen die Prozesse alle ntvdem.exe da 16 bit Subsystem. Und dummerweise laufen da auch noch mehrere, gibt es eine Lösung die Prozesse am Fensternamen festzumachen?


    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • freundlicherweise heisen die Prozesse alle ntvdem.exe da 16 bit Subsystem.

    ntvdem.exe ist doch : https://de.wikipedia.org/wiki/Virtual_DOS_Machine

    Du startest aus AutoIt also die DOS-VM, und die führt dann Dein eigentliches Programm aus, korrekt ?

    Dazu ein Auszug aus der Hilfe von ProcessList :

    Diese Funktion zeigt keine Prozesse von alten 16-Bit Programmen die unter der Windowseigenen "Windows NT Virtual DOS Machine" (NTVDM) ausgeführt werden. Solche Prozesse sind an einem führenden Leerzeichen im Taskmanager erkennbar.

    Wäre der Einsatz von DOSBox eine mögliche Alternative (wird im Wiki-Text auch erwähnt) ?

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • gibt es eine Lösung die Prozesse am Fensternamen festzumachen?

    Du könntest es mal mit WinGetProcess versuchen.

    Diese Funktion soll die PID auch über den Fenstertitel ermitteln können. Ob das aber bei Fenstern funktioniert, die in der DOS-VM laufen kann ich nicht sagen :/.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ja und nein,

    vom prinzip läuft in 3-6 Fenstern eine Alte unverzichtbare Dos software. Vom Prinzip wird diese Software via Batch/CMD gestartet. Dass dabei wiederum eine 16 bit Umgebung ins Spiel kommt, war mir bis vor einigen Stunden nicht klar, wozu auch - läuft. Aber eben als ntvdem. Damit sind diese alle gleich und so nicht zu identifizieren.

    Ja einen Programminstanz rufe ich per Autoit auf, das funktioniert auch, Auch das Fenstermanagment (Position, aktiv usw geht, via Fensternamen. Um den Status des Programmes festzustellen, möchte ich nun den Fensterinhalt auslesen, daran scheitere ich kläglich grrr...

    Prozesslist, listet die Prozesse auch auf, aber eben im Zweifel auch schon mal 6 gleiche.

    Ich hoffe das ist halbwegs verständlich?

    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Musashi ,

    so z.Z. nur ein ntvdm am laufen zu Testzwecken. Sowohl mit WinGetProcess als auch mit ProcessList bekomme ich die gleiche ID.

    Also machen wir mal via WinGetProcess weiter.... DANKE :)

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • okay, das mit der PID funktioniert nun, aber mein Fensterinhalt wird immer noch nicht gelesen? Was mache ich noch falsch?

    Local $iPID = WinGetProcess ("Testl")

    MsgBox (0,'pid', $iPID)

    $sOutput = StdoutRead($iPID)

    MsgBox (0,'$sOutput', $sOutput)

    Local $aArray = StringSplit(StringTrimRight(StringStripCR($sOutput), StringLen(@CRLF)), @CRLF)

    _ArrayDisplay($aArray)

    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Was jetzt kommt, ist Kaffeesatzleserei vom Übelsten :P :

    Nun versuche ich den Inhalt des Fensters zu lesen. Dieser Inhalt ist keine Ausgabe im Sinne von C:\Dir *.* sondern ein Menü. Die Startseite eines Programmes. Dort steht dann Hauptmenü Stammdaten uvam.

    Ich vermute, dass das Programm nichts in den Konsolenstream schreibt - also anders, als z.B. bei dem erwähnten Dir *.* .

    Nebenbei : Kannst Du einen Screenshot des Menüs posten (sensible Inhalte wenn nötig 'schwärzen) ?

    Es ist aber kopierbarer Text. Mit Maus und Notepad++ läßt sich der Fensterinhalt kopieren und darstellen.

    Hast Du mal versucht, mittels des Befehls Send ein {PRINTSCREEN} an das Menü zu schicken, bzw.

    die Tastenfolgen für 'alles markieren' -> 'kopieren' usw. auszuführen ?

    Eventuell läßt sich das Ergebnis dann auch in eine Datei pipen oder in das Clipboard schreiben :/.

    Sorry, aber mangels Testumfeld bleibt es beim Raten.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hmm das scheitert daran, dass Send nur für das aktive Fenster gilt und ich das Fenster nicht aktiv bekomme?

    Du hast recht, es ist Kaffesatzlesen. Aber vielleicht kommen wir mit folgendem Beispiel weiter:

    Öffne ein cmd Fenster, gib ein C: return ein, gefolgt von einem Dir *.*. Nun hast Du ein CMD Fenster mit dem Dir von C:.

    So nun lass das Fenster stehen, öffne ein Autoit Scribt und versuche den Inhalt des Eingabefensters auszulesen.

    Local $sText = WinGetTitle ("Eingabe")

    Local $iPID = WinGetText ($sText)

    MsgBox (0,'pid', $iPID)

    bringt z.B. kein Ergebnis

    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Peter,

    hier kann ich vielleicht auch mit meinen Erfahrungen etwas beitragen....

    Ich nutze allerdings vDos, weil die DosBox eher für Spiele und schon gar nicht für alte Datenbanken geeignet ist. (Stichwort Record Locking)

    https://vdos.info/download.html

    Auch nutze ich eine ältere Version (2016.06.01), weil ich nach einem Update mal Probleme hatte - nach dem Prinzipt 'Never touch....' ist auch die brandneue Version erstmal nichts für mich.

    Da ich mit vDos unser altes Programm auch mehrfach an einem PC öffne, hatte ich das Problem die Fenster nicht mehr auseinander halten zu können, wenn eines der DOS-Programme mal abstürzt. Glücklicherweise ist das selten und deshalb setzte ich die Funktion auch nicht mehr ein - und finde sie auch gerade nicht auf die Schnelle.

    Aber meine Lösung war, dass ich per AutoIt das Dos-Programm (via vDos) aufrufe und sofort die PID nutze und den Fensternamen um die PID erweitere. Damit hatte ich immer eindeutige Fensternamen.

    Du hast geschrieben, dass du den Programmaufruf über einen Link machen musst. Evtl. geht das aber mit vDos auch ohne Link. Hier kannst du Unterverzeichnisse anlegen mit verschiedenen config bzw. autoexec Dateien (die allerdings die Endung TXT haben bei vDos) und dann beim Aufruf in Ausführen in... einfach das Unterverzeichnis angeben. vDos ist nur einmal installiert. (siehe Bild).

    Vielleicht findest du hier einen Ansatz für dich.

    Viele Grüße
    Carsten

  • Öffne ein cmd Fenster, gib ein C: return ein, gefolgt von einem Dir *.*. Nun hast Du ein CMD Fenster mit dem Dir von C:.

    So nun lass das Fenster stehen, öffne ein Autoit Script und versuche den Inhalt des Eingabefensters auszulesen.

    Hier eine etwas wilde Automatisierung mittels Send :P :

    EDIT :

    Aufgrund der Beschränkungen der MsgBox wird ggf. nicht der gesamte Inhalt der Zwischenablage angezeigt. Man kann aber mittels ConsoleWrite den Inhalt in der SciTE-Konsole anzeigen lassen, oder z.B. in Notepad++ einfügen.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (2. Juni 2019 um 00:44) aus folgendem Grund: Ergänzung

  • Wow - ziemlich pfiffig :)

    bei dem vDos-Fenster genügt allerdings folgendes - alles markieren, in Zwischenablage.

    Aber sogar die Werte welche oben aus dem Fenster geschoben wurden sind dann mit drin.

    Code
    Local $iSleepTime = 400  ; später 10 ausreichend
    
    Send("^a")
    Sleep($iSleepTime)
    Send("^c")
    Sleep($iSleepTime)
    
    
    MsgBox(0,'Konsoleninhalt : ', ClipGet())
    Exit

    Vielleicht kann ich das auch mal gebrauchen - ich habe immerhin auch noch DOS-Anwendungen. Daher schon mal im voraus: vielen Dank


    Carsten

  • Wow - ziemlich pfiffig :)

    Danke, aber das ist doch eher eine rustikale Lösung und muss ggf. an die jeweilige Windowsversion angepasst werden ;). Wenn man den Sleepfaktor z.B. auf 1000 setzt (1 Sek.) dann sieht man, welche der einzelnen Menüpunkte ausgewählt werden.

    bei dem vDos-Fenster genügt allerdings folgendes - alles markieren, in Zwischenablage.

    Aber sogar die Werte welche oben aus dem Fenster geschoben wurden sind dann mit drin.

    Die CMD wurde bzgl. Hotkey-Unterstützung immer mal wieder erweitert.

    Bei Windows 7 sind z.B. einige Hotkeys (meines Wissens) nicht verfügbar, da ist die obige Lösung ein brauchbarer Ersatz. Wieviele der Daten, die aus dem Fenster geschoben wurden, mitgenommen werden, hängt von der eingestellten Puffergröße ab (kann man für die CMD setzen - Default Win 7 sind 300 Zeilen :/)).

    Für mich sind DOS-Kompatibilitäten im Grunde nur für alte Lieblingsspiele von Bedeutung :rock:.

    Ich weiß aber, dass es in vielen Firmen noch diese 'unverzichtbaren' DOS-Programme gibt, häufig bei Maschinensteuerungen. Deine Anmerkung zu DOSBox und Datenbanken ist daher gerechtfertigt.

    Aber meine Lösung war, dass ich per AutoIt das Dos-Programm (via vDos) aufrufe und sofort die PID nutze und den Fensternamen um die PID erweitere. Damit hatte ich immer eindeutige Fensternamen.

    Die Umbennung des Fensters mit WinSetTitle wäre ggf. auch für Peter eine Möglichkeit !

    Hmm das scheitert daran, dass Send nur für das aktive Fenster gilt und ich das Fenster nicht aktiv bekomme ?

    Nun, zumindest in meinem Beispiel geht das mit WinActivate.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (2. Juni 2019 um 17:30)

  • Guten Morgen,

    lieben Dank an Carsten und Musashi.

    Ich versuche mal einen Zwischenstand zu erzeugen:

    1) PID erkennung erledigt --> funktioniert

    2) vDos leider nicht möglich Programm läuft (leider) darunter nicht - daran arbeite ich schon seit "Jahren" erfolglos.

    3) Das mit dem kopieren des Dosfenster via Tastatur ---> bringt mich auf die Idee das gleich mit der Maus zu machen via Maussteuerung.

    Da aber stellt sich die Frage - was kopieren wir da eigentlich? Den Bildschirmspeicher? Könnten wir da nicht gleich diesen auslesen?

    Idee dazu?

    Danke

    Peter

    Ps.: Die Anwendung ist etwas zeitkritisch und der auslese Vorgang wiederholt sich einige male, deshalb möchte ich von Steuern /Curser Maus absehen....

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Cartsen,

    in der Tat - das war mir nicht klar. Das probiere ich mal aus. Viel Spaß am Baggersee :)

    Wie weit zur nächsten Fahre?


    Gruß aus - ja woher?

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hi Peter !

    Mal 'back to the roots' :P :

    Dort steht dann Hauptmenü Stammdaten uvam. Es ist aber kopierbarer Text. Mit Maus und Notepad++ läßt sich der Fensterinhalt kopieren und darstellen.

    Diesen Fensterinhalt möchte ich auslesen.

    Gehen wir von dem Testfall aus, bei dem nur eine Instanz des Programmes in einer CMD läuft. Dem Problem, dass das Programm mehrfach gestartet wird können wir uns später widmen (ein Ansatz wäre das von Carsten erwähnte Umbennen des jeweiligen Konsolenfensters).

    Kernfrage : Funktioniert mein Beispiel mit der Automatisierung der Konsole, d.h. bekommst Du damit den Inhalt des Hauptmenüs zu fassen ?

    Aufgrund von Beschränkungen der MsgBox wird ggf. nicht der gesamte Inhalt der Zwischenablage angezeigt. Man kann den Inhalt aber z.B. in Notepad++ einfügen oder in eine Datei schreiben.Bei Win 7 ist der Puffer standardmäßg auf 300 Zeilen begrenzt, aber das lässt sich auch ändern sofern erforderlich.

    3) Das mit dem Kopieren des Dosfenster via Tastatur ---> bringt mich auf die Idee das gleich mit der Maus zu machen via Maussteuerung.

    P.S: .: Die Anwendung ist etwas zeitkritisch und der Auslesevorgang wiederholt sich einige Male, deshalb möchte ich von Steuern/Cursor Maus absehen ...

    - Welchen Vorteil siehst Du in der Automatisierung über eine Maussteuerung ?

    Falls sich die Menüpunkte der CMD (je nach Windowsversion) unterscheiden sollten, kannst Du einfach eine Weiche für die Tastatursteuerung einbauen. Mauspositionen sind nerviger anzupassen !

    - Was genau bedeutet '... einige Male' ?

    Wenn Du die Sleeptime auf 2 (ms) setzt, dann geht das sehr schnell (30 ms).

    Da stellt sich aber die Frage - was kopieren wir da eigentlich ? Den Bildschirmspeicher ? Könnten wir da nicht gleich diesen auslesen ?

    Wir kopieren den Bildschirmpuffer der CMD-Konsole.

    Google mal nach "CMD Screenbuffer", "Redirection to file" etc. - da gibt es haufenweise Vorschläge, die mal bei den einen funktionieren, bei anderen wieder nicht . Manche alten DOS-Programme schreiben z.B. in STDOUT, andere in STDERR usw.

    Ich denke, beim Betrieb alter DOS-Programme kann man kleinere Abstriche in Kauf nehmen ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (5. Juni 2019 um 17:05)

  • ICh muss das gerade ein wenig nach hinten schieben - sorry....

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich muss das gerade ein wenig nach hinten schieben - sorry....

    Kein Problem, lass' Dir Zeit ;). Ich habe eh soweit alles gesagt, was mir momentan dazu einfällt.

    Wir können ja weitertesten sobald Du wieder mehr 'Luft' hast.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (6. Juni 2019 um 15:37) aus folgendem Grund: Tippfehler