2010-07-22 9 views
10

Ich kann einen Befehlszeilenprozess mit process.start() ausführen. Ich kann Eingabe mit Standardeingabe bereitstellen. Wenn der Prozess danach erneut Benutzereingaben verlangt, wie kann mein Programm die Eingabe an diese EXE weitergeben?Führen Sie interaktive Befehlszeile exe mit C#

+0

Sie könnten sich für [diesen Beitrag] interessieren (http://www.codeducky.org/process-handling-net) deckt viele der Feinheiten der Arbeit mit. NET-Prozesse, insbesondere rund um das Arbeiten mit Eingabe und Ausgabe – ChaseMedallion

Antwort

10

Es gibt eine example here, die ähnlich klingt, was Sie brauchen, mit Process.StandardInput und StreamWriter .

 Process sortProcess; 
     sortProcess = new Process(); 
     sortProcess.StartInfo.FileName = "Sort.exe"; 

     // Set UseShellExecute to false for redirection. 
     sortProcess.StartInfo.UseShellExecute = false; 

     // Redirect the standard output of the sort command. 
     // This stream is read asynchronously using an event handler. 
     sortProcess.StartInfo.RedirectStandardOutput = true; 
     sortOutput = new StringBuilder(""); 

     // Set our event handler to asynchronously read the sort output. 
     sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler); 

     // Redirect standard input as well. This stream 
     // is used synchronously. 
     sortProcess.StartInfo.RedirectStandardInput = true; 
     sortProcess.Start(); 

     // Use a stream writer to synchronously write the sort input. 
     StreamWriter sortStreamWriter = sortProcess.StandardInput; 

     // Start the asynchronous read of the sort output stream. 
     sortProcess.BeginOutputReadLine(); 
     Console.WriteLine("Ready to sort up to 50 lines of text"); 
     String inputText; 
     int numInputLines = 0; 
     do 
     { 
      Console.WriteLine("Enter a text line (or press the Enter key to stop):"); 

      inputText = Console.ReadLine(); 
      if (!String.IsNullOrEmpty(inputText)) 
      { 
       numInputLines ++; 
       sortStreamWriter.WriteLine(inputText); 
      } 
     } 

Hoffnung, die

+0

danke nochmal. aber das ist spezifisch für sort.exe ich miere exe zur Laufzeit für jeden Benutzer. Ich weiß nicht, welches Programm er tippen wird. – rajshades

+0

Ich denke, Sie können "cmd.exe" anstelle der ausführbaren Datei verwenden, die sie ausgewählt haben. Es ist ein hack, aber es könnte die Arbeit erledigt –

+0

Liebe robert können Sie erklären, wie Sie cmd.exe für mein Problem verwenden – rajshades

2

Wenn ich richtig verstanden habe, denke ich, dass Sie in der Lage sein sollten, dies zu tun, indem Sie die Standardeingabe/-ausgabe mit RedirectStandardOutput und RedirectStandardInput umleiten.

Das WinSCP-Projekt verfügt über ein C# -Probe für die Kommunikation auf diese Weise. Sie können es hier finden: SFTP file transfers in .NET (obwohl diese Probe nur die Ausgabe sammelt, ohne sie überhaupt verwendet wird, aber die Technik sollte gleich sein.)

+0

Danke für Ihre Antwort. Ich versuchte es. aber der Prozess, der Benutzereingaben erfordert, ist nicht vordefiniert. Das Szenario ist wie 1. Ich möchte Online Compliler für C# 2. Ich kann das Programm mit Code dom n creatae exe 3. Jetzt möchte ich diese exe durch c laufen lassen # 4. Benutzer kann jede Art von schreiben Programm, das Benutzereingaben in Diff-Phase benötigt. hoffe, dass du das ganze Szenario verstanden hast – rajshades

+0

@rajshades: Ich hätte gedacht, dass das ähnlich wäre, nur dass, anstatt alle Befehle auf einmal zu senden, du einen Befehl eingibst, die Ausgabe liest, den nächsten Befehl sendest usw. Obwohl ich das nicht getestet habe. Als allgemeine Anmerkung, wenn Sie die exe erstellen, können Sie nicht versuchen, es besser zu kommunizieren (WCF, TCP/IP sockects, name pipes usw.)? –

1

hilft Sie wollen IPC nachschlagen. Wie Robert oben gezeigt hat, wird Ihnen die Klasse Process in .NET helfen. Aber speziell für Ihr Problem (wissen, wann man Daten schreibt): Sie können nicht. Nicht generisch.

Wenn Sie die erforderliche Eingabe (z. B. "yyy") kennen, können Sie sie im STDIN des erstellten Prozesses angeben. Sie müssen nicht auf das Programm warten, um diese Information anzufordern: Es wird gerade von STDIN lesen, wenn es Daten will.

Wenn Sie die Programmausgaben verarbeiten müssen, um zu entscheiden, was in STDIN geschrieben werden soll, lesen Sie die Prozesse . Sie könnten jedoch Probleme mit dem Spülen haben, obwohl ...

Verwandte Themen