![]() |
TDosCommand - Problem mit diversen Befehlen
Hallo liebe DP,
ich nutze die Komponente TDosCommand. Die letze Bearbeitung dieser Version war am 05-11-2009 (hoffe, dass dies die aktuelle Version ist). Hier mal mein Quellcode:
Delphi-Quellcode:
Alles funktioniert auch wunderbar nur bei bestimmten Befehlen bekomme ich die Ausgabe nicht direkt übermittelt sondern erst beim Beenden des Programms.
procedure TForm1.FormCreate(Sender: TObject);
begin cmd := TDoscommand.Create(self); cmd.OnNewLine := cmdNewLine; cmd.OnTerminated := cmdTerminated; cmd.CommandLine := 'cmd'; cmd.Execute; end; procedure TForm1.Button1Click(Sender: TObject); begin cmd.SendLine(edit1.Text,true); end; procedure TForm1.cmdNewLine(Sender: TObject; NewLine: string; OutputType: TOutputType); begin memo1.Lines.Append(Newline); end; procedure TForm1.cmdTerminated(Sender: TObject); begin cmd.Stop; end; Ein Beispiel ist hier die beim System mitgelieferte ftp.exe. Starte ich diese und sende dann beispielsweise den Befehl "?" dann erscheint nur der Satz "Befehle können abgekürzt werden. Befehle sind:". Die Befehlsliste (die eigentlich kommen müsste) erscheint erst nach Beenden der Exe über den "Quit"-Befehl. Gibt es irgendeine Möglichkeit das zu beheben? Übrigens: Nutze ich den Code
Delphi-Quellcode:
an der entsprechenden Stelle so ergibt sich das gleiche Bild.
cmd.CommandLine := 'ftp';
cmd.Execute; Ebenso bei
Delphi-Quellcode:
cmd.OutputLines := memo1.Lines;
Vielen Dank im Voraus! |
AW: TDosCommand - Problem mit diversen Befehlen
der "ftp"-Befehl ist doch - alleinstehend und ohne Parameter ausgeführt - ein interaktives Kommando.
Wenn du beim Aufruf keinerlei Parameter mitschickst, geht der Befehl in den interaktiven Modus und wartet auf Eingaben (teste es mal in der manuellen Konsole...). Das wird dein Problem sein :-) Befehle, die selbstständig etwas ausführen und sich dann beenden, siehst du im TDOSCommand Output sofort, nachdem sie sich beendet haben, allerdings beendet sich der ftp-befehl ja nicht, da er auf Eingaben wartet. Beim Beenden deines Programms wird der FTP-Befehl aber, kurz bevor sich dein eigenes Programm schliesst, auch abgeschossen und du siehst noch den Output des "sterbenden" Prozesses, bzw. was er bis zum "Abschuss" ausgegeben hat. Was willst du überhaupt mit dem FTP-Befehl machen? Wenn du etwas hoch / runterladen willst etc, kannst du den Befehl ja vom Start weg mit den nötigen Parametern ausführen, damit er sich auch wieder ohne interaktive Eingabe selbst beendet. Ich würde dein Programm so umschreiben, dass er das gewünschte gleich an die ftp schickt, wenn sie gestartet wird. Inwiefern das ganze noch möglich wäre, über TDosCommand Inputs bei einem laufenden Befehl, weiss ich nicht bzw. keine Ahnung, ob das überhaupt möglich ist. Da kann vielleicht jemand anderes helfen :-D |
AW: TDosCommand - Problem mit diversen Befehlen
Zitat:
kann es sein, dass FTP einige Ausgaben auf der ErrorConsole als ErrorMessage ausgibt und diese vonTDosCommand nicht erfasst wird. Grüße Klaus |
AW: TDosCommand - Problem mit diversen Befehlen
Zitat:
Desweiteren reagiert die Konsole ja auch auf meine Eingaben. Vll noch mal als Beispiel: Ich sende den Befehl "ftp". (an die CMD) In der Console würde jetzt soetwas stehen wie "ftp>", um weitere Befehle entgegenzunehmen. Das klappt quasi auch mit TDosCommand. Nun sende ich ein "?". In der Console stände jetzt die gesamte Befehlsliste. TDosCommand schickt aber nur die erste Zeile zurück. Sende ich ein "quit", was die ftp.exe beendet, so schickt TDosCommand mir die fehlenden Zeilen vom "?"-Befehl. Zitat:
Zitat:
|
AW: TDosCommand - Problem mit diversen Befehlen
Entschuldige, wenn ich eine unproduktive Zwischenfrage stelle:
Ich habe nur eine Version von 2003 (2.1) und finde via Google nur noch älteres. Woher gibt es eine Version von TDosCommand von 2009? |
AW: TDosCommand - Problem mit diversen Befehlen
.. habe es mal gerade zu Fuß getestet:
ftp 2> test.out ? Ausgabe kommt auf den Standardoutput. ftp 1> test.out ? Ausgabe ist in der Datei. Eine Vermutung habe ich ich noch, tritt das Problem vielleicht immer dann auf wenn die Rückgabe mehrzeilig ist? Grüße Klaus |
AW: TDosCommand - Problem mit diversen Befehlen
Das kann sein. Also ich habe gerade mal ein bisschen rumprobiert. Sendet man z.B. den "open"-Befehl an die FTP.exe dann erscheint ganz richtig das "Zu" in dem Ausgabememo. Oder bei anderen Befehlen ein "Nicht verbunden.".
Ich habe mir mal eben ein Test-Konsolenprogramm geschrieben, welches einen mehrzeiligen Output generiert.
Delphi-Quellcode:
Dabei wird nach Aufruf keine der Zeilen direkt angezeigt. Ich kann zwar an entsprechender Stelle eine Eingabe übergeben, doch die Ausgabe erfolgt erst nach Beenden des Befehls.
var AInput : string;
begin writeln('Auf Eingabe warten'); readln(AInput); writeln('Hier'); writeln('kommt'); writeln('die Eingabe:' + AInput); end. Verwendet man statt mehreren WrieLn() einen Zeilenumbruch erhält man das gleiche Ergebnis. Vielleicht sollte man die Frage anders stellen. Ist es überhaupt möglich mit TDosCommand interaktive Befehle (Programme) auszuführen und deren Ausgabe auszuwerten? |
AW: TDosCommand - Problem mit diversen Befehlen
Zitat:
![]() |
AW: TDosCommand - Problem mit diversen Befehlen
Danke für den Link, aber das ist die version 2.0 von 2002 (auch wenn der Archiv-Name etwas anderes behauptet). Zumindest wenn man der Historie in der Unit glauben darf. Evtl auch angepasst ohne die Historie zu aktualisieren?
|
AW: TDosCommand - Problem mit diversen Befehlen
Also, ich finde da ne Menge Sachen, die Sirius dabei gemacht hat ( 2009 )
|
AW: TDosCommand - Problem mit diversen Befehlen
Ok, es ist die Version ohne 2009 im Archivnamen, die dann angepasst und neuer ist (Hatte zuerst die von Jaenicke runtergeladen, die identisch zur Version auf der HP ist). Da steht dann allerdings einiges an Änderungen drin.
Gut, sorry nochmal für's halbe OT... aber wer das Problem des TS nachvollziehen will, sollte ja auch die gleiche Version benutzen. ;) |
AW: TDosCommand - Problem mit diversen Befehlen
Zitat:
Zitat:
Na zumindest so ähnlich, siehe ![]() Zitat:
Ich habe schon damals einiges versucht um diese Sachen zu bekommen. Die Pipes sagen einfach nix und tun so als würde auch nix passieren. Auch andere Sachen ( ![]() Ich habe sowieso letztens noch ein paar Erweiterungen in TDosCommand geschrieben, die ich brauchte (Umgebungsvariablen und CurrentDirectory setzen; ein kleines MemLeak ausmertzen und dann dachte ich noch so an dies und das, achja und Unicode - wobei ich letzteres nicht selber brauche und auch nicht testen kann und nur hoffe, dass es wie widestring/char reagiert). Achso, und wenn du willst, dass dein Consolenprogramm den output gleich an den Elternprozess ()Also TDosCommand) weitergibt musst du die Funktion "flush(output)" nach jeder Textausgabe aufrufen. Delphi speichert die Ausgabe intern in einem Buffer. WriteFile ruft Delphi ersta uf, wenn die Funktion flush aufgerufen wird, oder wenn mehr als (bei mir:siehe system.TTextRec.Buffer) 128 Bytes ausgegeben wurden. Ist also etwas Delphieigenes (wie von microsoft oben beschrieben). |
AW: TDosCommand - Problem mit diversen Befehlen
Hallo sirius,
erstmal vielen Dank für deine ausführliche Antwort. Das hilft mir schonmal ein Stückchen weiter. Zitat:
![]() [ADD] Im Projektordner der Version 2 Beta ist ein Ordner namens ConsoleHook, in dem sich vermutlich alles notwendige befindet. Nun ist nur noch die Frage, ob und wie sich das nach Delphi übersetzen lässt.:? |
AW: TDosCommand - Problem mit diversen Befehlen
Das Projekt kannte ich jetzt nicht (oder vielleicht doch, ...weis nicht).
Dieses schleust Code in den anderen Prozess rein. Ich würde es als hacken bezeichnen. Sowas ist zwar schön, wenn man es privat macht, aber ich würde ein Programm, welches auf derartige Tricks zurückgreift, nicht verkaufen wollen. Deswegen hat sowas im ursprünglichen TDosCommand nichts zu suchen. Aber ich kann mal sehen, ob ich eine Art TDosCommandEx baue. Das Prinzip in dem Projekt ist mir durchaus bewusst, und ich könnte es auch schreiben (am besten sogar ohne zusätzliche DLL). Nur einwas ist merkwürdig....siehe weiter unten Das ganze geht etwa folgendermaßen:
Was mich allerdings noch wundert ist folgendes: Wenn ich in Delphi ein ConsolenProgramm schreibe, dann hält Delphi unter bestimmten Umständen den Text zurück und schreibt ihn nicht gleich raus. Wenn die Console sichtbar ist, macht er es, wenn nicht, dann anscheinend nicht. Und das umgeht dieses Projekt irgendwie. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz