2011-01-14 15 views
0

Ich baue eine kleine Konsole-Anwendung, die manchmal die Windows-Befehlszeile verwendet, um einen Befehl zu senden und dann empfangen und die Ausgabe anzuzeigen.Kann nicht lesen Ausgabe von Konsole Befehl von Code ausgeführt

Das Öffnen einer neuen Befehlszeileninstanz war einfach. Das Senden von Befehlen aus meiner Anwendung erforderte ein wenig Suchen, aber es funktionierte. Jedoch kann ich nicht in der Lage sein, die Ausgabe von der Befehlszeile zu lesen.

ist mein Code basiert auf:

How to redirect Standard Input/Output of an application

How do I run Command line commands from code

ich die gleiche Art und Weise des Lesens der Ausgabe auf meine Anwendung angewendet, und es funktioniert nicht, erst in dem Augenblick Ich schließe meine Anwendung, während ich heruntergefahren bin, kann ich einen Blick auf die Ausgabe werfen.

Es funktioniert, aber am wahrscheinlichsten habe ich Code verlegt, der verhindert, dass ich die Ausgabe zu sehen, bis ich meine Anwendung herunterfahren.

Kann mir jemand dabei helfen?

Code:

 Process p = new Process(); 
     p.StartInfo.FileName = Environment.GetEnvironmentVariable("comspec"); 
     p.StartInfo.ErrorDialog = false; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.RedirectStandardOutput = true; 

     //Execute the process 
     if (p.Start()) 
     { 
      //Get the output stream 
      StreamReader outputReader = p.StandardOutput; 
      StreamReader errorReader = p.StandardError; 

      // Assign a Stream Writer to send the Commands 
      StreamWriter commandWriter = p.StandardInput; 

      // Send the "Dir" command to the command line instance. 
      commandWriter.Write("dir"); 
      commandWriter.Write(commandWriter.NewLine); 

      p.WaitForExit(); 

      //Display the result 
      Console.WriteLine(outputReader.ReadToEnd()); 

      outputReader.Close(); 
      errorReader.Close(); 
      commandWriter.Close(); 
     } 

Antwort

4

Das Problem ist, dass Sie nicht cmd.exe sagen zu verlassen. Senden Sie einfach "exit \ r \ n", wenn Sie fertig sind.

Ein weiteres Problem, mit dem Sie eventuell konfrontiert werden, ist, dass Sie stdout und stdin asynchron lesen müssen.

using System; 
using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Process p = new Process(); 
     p.StartInfo.FileName = Environment.GetEnvironmentVariable("comspec"); 
     p.StartInfo.ErrorDialog = false; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     // Hook up async stdout and stderr reading 
     p.ErrorDataReceived += ConsoleDataReceived; 
     p.OutputDataReceived += ConsoleDataReceived; 

     // Execute the process 
     if (p.Start()) 
     { 
      // Begin async stdout and stderr reading 
      p.BeginOutputReadLine(); 
      p.BeginErrorReadLine(); 

      // Send the "Dir" command to the command line instance. 
      p.StandardInput.WriteLine("dir"); 

      // Send "exit" and wait for exit 
      p.StandardInput.WriteLine("exit"); 
      p.WaitForExit(); 
     } 
    } 

    static void ConsoleDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     if (e.Data != null) 
      Console.WriteLine(e.Data); 
    } 
} 
+0

Natürlich habe ich es total vergessen. Danke für die Aufmerksamkeit. –

+0

Was ist "ConsoleDataReceived"? – TMarshall

+0

@TMarshall: Lesen Sie weiter. In diesem Code sind zwei Methoden definiert: 'Main' und' ConsoleDataReceived'. – Tergiver

Verwandte Themen