Hallo,
ich suche eine Möglichkeit, Text aus einer CMD auszulesen, welche aber NICHT durch AutoIt gestartet wurde.
WinGetText und Std...Read funktionieren im dem Fall irgendwie nicht (PID kann ich ja rausfinden, aber keine opt_flag setzen).
Hallo,
ich suche eine Möglichkeit, Text aus einer CMD auszulesen, welche aber NICHT durch AutoIt gestartet wurde.
WinGetText und Std...Read funktionieren im dem Fall irgendwie nicht (PID kann ich ja rausfinden, aber keine opt_flag setzen).
Nach meinem Verständnis ist das nicht möglich. Der aufrufende Prozeß muß die entsprechenden Flags (stdout, stderr) beim Aufruf setzen, damit diese Berücksichtigung finden.
Aber wieso kannst du den Aufruf nicht selbst vornehmen?
So geht das:
; Kompiliere dieses Skript zu "ConsoleRead.exe".
; Öffne ein Konsolenfenster und wechsle in das Verzeichnis, in dem ConsoleRead.exe ist.
; Tippt folgendes in die Befehlszeile:
; dir foo.bar | ConsoleRead.exe
;
; Wenn obige Zeile in einem Konsolenfenster aufgerufen wird, gibt der echo Befehl den Text
; "Hallo!" aus. Anstatt diesen anzuzeigen, bewirkt das "|" in dem Befehl, das der Text
; An den STDIN Stream des ConsoleRead.exe Prozesses weitergeleitet wird.
If Not @Compiled Then
MsgBox (0, "", "Dieses Skript muss kompiliert sein, um seine Funktionalität zu demonstrieren.")
Exit -1
EndIf
Local $data
While True
$data &= ConsoleRead ( )
If @error Then ExitLoop
Sleep (25)
WEnd
MsgBox (0, "", "Erhalten: " & @CRLF & @CRLF & $data)
Aber da muss man im CMD auch sagen das er es an ConsoleRead.exe senden soll, mit | ConsoleRead.exe am Ende dran hängen.
Aber da muss man im CMD auch sagen das er es an ConsoleRead.exe senden soll, mit | ConsoleRead.exe am Ende dran hängen.
Das ist, was ich meinte. Egal welche Verrenkungen man macht - letztendlich muß der aufrufende Prozeß in irgendeiner Form bekanntgeben, dass er Werte bereitstellt.
Hmm, mein Problem ist, dass ich mit einer CMD meine AutoIt-Datei aufrufe. Von daher geht es natürlich nicht, dass ich von AutoIt die cmd aufrufe.
Gäbs denn irgendwie noch ne andere Möglichkeit?
Also ich sag mal, die CMD-Datei liegt im Ordner, wo auch meine exe liegt. Der Name ist natürlich variabel, aber evtl. kann man so noch was rausfinden.
Wie wäre ein Start über Batch (Call) und da direkt die EXE, die dann sein Nötiges macht?
Wie wäre ein Start über Batch (Call) und da direkt die EXE, die dann sein Nötiges macht?
Alina, das Problem bleibt gleich: Die CMD wird ja aus einer fremden Anwendung heraus gestartet und diese Anwendung sollte dann Parameter für die Stream-Auswertung übergeben, damit die Auswertung möglich wird.
ok, vllt noch ne idee. weil der text in der cmd eigentlich nicht so wichtig ist. ich will am ende eigentlich nur wissen, welche cmd.exe meinen prozess angestossen hat.
das müsste doch möglich sein, oder? weil zB im Process Explorer (sysinternals taskmanager) ist ja auch sichtbar, welche prozesse unter einem anderen hängen.
$CmdLine
[/autoit]Wie wärs damit?
Ich versteh das nicht so ganz, also nochmal zum Mitschreiben!
cmd.exe startet deine *.exe, und woher/wie weis die cmd.exe wie deine *.exe heißt?
bzw warum startet sie denn deine *.exe überhaupt?
Zitatich will am ende eigentlich nur wissen, welche cmd.exe meinen prozess angestossen hat.
d.h. du willst die PID wissen oder wie?
[MSIE_newline_end ]
cmd.exe startet deine *.exe, und woher/wie weis die cmd.exe wie deine *.exe heißt?
bzw warum startet sie denn deine *.exe überhaupt?
Dann wär es ja einfach. Nein, eine Fremdanwendung startet in sich eine CMD - und auf diese wollte er Zugriff, was imho nicht machbar ist, da beim Aufruf der CMD die notwendigen Parameter übergeben werden müssen.
ok, also zum programm. es ist ein kommandozeilen-programm, welches mit bestimmten parametern aufgerufen werden kann, bzw. muss. um aber nicht immer wiederkehrende, gleiche befehle eingeben zu müssen, kann man natürlich auch, anstatt den befehl per hand über die cmd einzugeben, eine bat/cmd-datei verwenden.
diese enthällt dann den programmnamen gefolgt von den parametern. das ähnelt dann dem manuellen aufruf über die cmd. die bat/cmd-datei kann per doppelklick ausgeführt werden und für dann von der cmd.exe quasi verarbeitet. das fenster, was dabei aufpoppt, möchte ich gerne mit @sw_hide verstecken (da es mich optisch stört, denn es geht erst wieder weg, wenn das programm komplett zuende gelaufen ist).
was war denn mit meiner oben genannten idee, nicht den text aus der cmd zu lesen, sondern zu gucken, welche prozesse (prozessbäume) zusammen gehören?
Zitatok, vllt noch ne idee. weil der text in der cmd eigentlich nicht so wichtig ist. ich will am ende eigentlich nur wissen, welche cmd.exe meinen prozess angestossen hat.
das müsste doch möglich sein, oder? weil zB im Process Explorer (sysinternals taskmanager) ist ja auch sichtbar, welche prozesse unter einem anderen hängen.
Jetzt verstehe ich nur noch Bahnhof.
In Post 1 schreibst du
ZitatText aus einer CMD auszulesen, welche aber NICHT durch AutoIt gestartet wurde.
und jetzt startest du die CMD doch selber(ob AutoIt od. Batch ist doch da egal)?
Zitatdie cmd. die bat/cmd-datei kann per doppelklick ausgeführt werden
Also rufst du die CMD doch selbst auf (wenn auch über eine Batch). Dann kannst du doch auch den StdOut-Stream anfordern. Noch besser nicht die Batch nehmen sondern aus AutoIt aufrufen, das vereinfacht die Angelegenheit.
Ich hatte dich bisher so verstanden, dass du keinen Einfluß auf den CMD-Aufruf hast. Aber du bist nur zu faul dich von der Batch zu verabschieden, du Schlingel.
ich versteh auch nur noch bahnhof =)
also ich lege die cmd-datei an und starte diese auch (per hand), aber eben nicht durch autoit. und diese cmd startet dann meine exe-datei.
was kann man denn jetzt wie machen, damit ich weiss, welche cmd-instanz mein scrpt gestartet hat, um diese zu verstecken?