Laden...

cmd.exe synchron steuern

Erstellt von Exxon vor 15 Jahren Letzter Beitrag vor 13 Jahren 4.724 Views
E
Exxon Themenstarter:in
24 Beiträge seit 2007
vor 15 Jahren
cmd.exe synchron steuern

Hallo!

Ich möchte eine Consolen Anwendung von meiner C# Anwendung aus steuern - was ansich kein Problem darstellt. Aber ich möchte die Daten synchron empfangen, leider habe ich keine Möglichkeit gefunden, dass der Prozess den Ende eines Blocks erkennt lediglich wenn die Consolenanwendung geschloßen wird. Gibt es eine Möglichkeit dies zu realisieren zB dass erkannt wird wann die Console auf eine Eingabe wartet?

Ich habe bereits einiges im Internet und hier recherchiert, bin leider auf keine für mich mögliche Lösung gestossen, denn ich möchte es nicht asynchron realisieren!

lg

Gelöschter Account
vor 15 Jahren
Process.WaitForInputIdle();
E
Exxon Themenstarter:in
24 Beiträge seit 2007
vor 15 Jahren

Danke für deine schnelle Antwort, das habe ich auch schon probiert, leider ohne Erfolg

WaitForInputIdle failed. This could be because the process does not have a graphical interface.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Exxon,

ich denke, das kann man bei Konsolenanwendungen nicht erkennen.

herbivore

E
Exxon Themenstarter:in
24 Beiträge seit 2007
vor 15 Jahren

und wie kann ich das sonst realisieren ?(

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Exxon,

naja, wenn es keine Lösung gibt, und so sieht es aus, gar nicht.

herbivore

E
Exxon Themenstarter:in
24 Beiträge seit 2007
vor 15 Jahren

:8 naja trozdem danke für eure hilfe!

lg

C
16 Beiträge seit 2010
vor 13 Jahren

Hi erstmal
Gibt es dafür tatsächlich keine Lösung?
Ich suche nun schon seit geschlagenen vier Stunden nach einer Lösung und nun muss ich erfahren das es unmöglich sei?
Könnte man vielleicht jede frisch ausgegebene Zeile nach bestimmten Satzteilen durchsuchen und so erkennen ob z.B. eine Eingabe erwartet wird?
Und wenn ja wie ließe sich so etwas realisieren.

X
1.177 Beiträge seit 2006
vor 13 Jahren

huhu,

ja, aber den Ausgabestream einer Konsolenanwendung zu durchsuchen um zu erkennen wann eine neue Eingabe erforderlich ist, war ja nicht das Anfangsproblem.

Wenn du das ganze nicht synchron, sondern asynchron erledigen kannst, dann sie dir mal die Events von Process an.

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

C
16 Beiträge seit 2010
vor 13 Jahren

Entschuldigung wenn ich irgentwie zu blöd dafür bin aber mir ist aufgefallen das ich nicht während ein Prozess in z.B. einer Konsole läuft die Ausgaben auslesen, geschweige denn mit WriteLine etwas in die Fragestellungen des Programms schreiben kann.
Oder stelle ich mich einfach nur zu blöd an?
Hier ist mal mein code vielleicht könnt ihr mir helfen und erklären was ich ändern muss damit es funktioniert.

        public bool CreateKey()
        {

            if (!File.Exists(_GpgPath))
            {
                throw new Exception("Cannot find GPG software.");
            }
            ProcessStartInfo cmd = new ProcessStartInfo(_GpgPath, "--gen-key");
            cmd.CreateNoWindow = false;
            cmd.UseShellExecute = false;
            cmd.RedirectStandardInput = true;
            cmd.RedirectStandardOutput = true;
            cmd.RedirectStandardError = true;
            
            cmd.WorkingDirectory = _GpgPath.Remove(13);

            Process Say = new Process();
            
            Say.OutputDataReceived +=  new DataReceivedEventHandler(p_OutputDataReceived);

            Say.StartInfo = cmd;
            Say.Start();
            
            Say.BeginOutputReadLine();                        
            return true;
        }

        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data.ToString() != "")
            MessageBox.Show(e.Data);
        }

Ja das ist GnuPG was ich da aufrufe:)

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo CamelxDD,

oftmals erfolgt die Ausgabe gepuffert, so dass man tatsächlich erst später (manchmal erst, wenn der anderen Prozess beendet wurde) an die ausgegebenen Daten kommt.

herbivore

C
16 Beiträge seit 2010
vor 13 Jahren

Danke für die Antwort.
Das heißt also das mit dem Console mit C# steuern kann ich vergessen?

Ist es sonst noch anders zu realisieren?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo CamelxDD,

das hat nichts mit C# zu tun, sondern hängt grundsätzlich mit der Konsole bzw. den Konsolenprogrammen zusammen.

Ausgeschlossen ist ja nur das synchrone Steuern, also Ausgaben lesen und erst wenn die erfolgt sind, Eingaben zu schreiben. Wie man überhaupt kommuniziert, wurde schon oft besprochen. Dazu solltest du also wirklich mehr als genug finden.

herbivore

C
16 Beiträge seit 2010
vor 13 Jahren

sry Ich finde aber irgentwie nichts zum kommunizieren.
Und wenn:

Ausgeschlossen ist ja nur das synchrone Steuern

es hier NUR heißt was bleibt mir denn noch als Alternative??
Vielleicht könnte mir jemand nen paar links posten.
Danke für die Antworten

Gelöschter Account
vor 13 Jahren

es hier NUR heißt was bleibt mir denn noch als Alternative??

Asynchron oder du bringst das konsolenprogramm dazu dir explizit zuzuhören... z.b. über remoting.

C
16 Beiträge seit 2010
vor 13 Jahren

Ich dachte BeginOutputReadLine ist bereits asynchron.
So steht es doch in der Dokumentation:

BeginOutputReadLine Begins asynchronous read operations on the redirected StandardOutput stream of the application.

oder?

Danke für den Tipp ich werde mir das mal durchlesen.
... ok ich hab keine ahnung wie ich das auf die konsole anwenden kann.
wisst ihr wo ich gute referenzen oder beispiele finde.