2016-07-21 10 views
0

Ich habe ein Problem mit der Anzeige der Ergebnisse von cmd-Befehlen in richtextbox. Bisher ich habe diesen Code:Geben Sie den Befehl cmd ein, zeigen Sie das Ergebnis in richtextbox an C#

private void richTextBox2_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
     { 
      e.Handled = true; 
      e.SuppressKeyPress = true; 
       ProcessStartInfo cmdStartInfo = new ProcessStartInfo(); 
       cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe"; 
       cmdStartInfo.RedirectStandardOutput = true; 
       cmdStartInfo.RedirectStandardError = true; 
       cmdStartInfo.RedirectStandardInput = true; 
       cmdStartInfo.UseShellExecute = false; 
       cmdStartInfo.CreateNoWindow = true; 

       Process cmdProcess = new Process(); 
       cmdProcess.StartInfo = cmdStartInfo; 
       cmdProcess.OutputDataReceived += cmd_DataReceived; 
       cmdProcess.EnableRaisingEvents = true; 
       cmdProcess.Start(); 
       cmdProcess.BeginOutputReadLine(); 
       cmdProcess.BeginErrorReadLine(); 

       cmdProcess.StandardInput.WriteLine(richTextBox2.Text);  
       cmdProcess.StandardInput.WriteLine("exit");     

       cmdProcess.WaitForExit(); 

       richTextBox1.Text = richTextBox1.Text + cmd_DataReceived + Environment.NewLine; 

     } 
    } 

static void cmd_DataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Console.WriteLine("Output from other process"); 
     Console.WriteLine(e.Data); 
    } 

Ich habe versucht zu ersetzen "Console.WriteLine (e.Data);" mit "richTextBox1.Text = richTextBox1.Text + (e.Data);" aber es würde nicht akzeptiert werden. Ich habe auch versucht "RichTextBox1.Text = RichTextBox1.Text + cmd_DataReceived"; Aber das hat iether nicht funktioniert. Dann habe ich versucht zu ersetzen Console.WriteLine mit messagebox.show (e.data) aber wieder .. nee Die Befehle funktionieren, aber es wird

nicht angezeigt Ich weiß, dass ich die meisten der Code kopiert, und es ist wahrscheinlich gemeint für eine Konsolenanwendung.

Bitte helfen

+0

Es ist nicht klar, was Sie versuchen, hier zu tun. Sie schreiben den Inhalt der Richtextbox in den InputStream, so dass Sie anscheinend die Argumente für die cmd.exe in die Richtextbox schreiben und sie dann an die Eingabeaufforderung übergeben möchten, aber Ihre Frage fragt, ob die Ergebnisse in der Richtextbox angezeigt werden sollen. Übrigens gibt es in einem Aufruf von CMD.EXE ohne Parameter keine Ausgabe. – Steve

+0

hmm. dann ist das fast unmöglich, außer wenn ich alle Eingabeaufforderungsantworten zu allen Befehlen hinzufüge. Und ja, ich denke du hast es richtig verstanden. – KrisPus

+0

Ich half jemandem, etwas Ähnliches zu tun. Ihr Code sieht gut aus, ich denke * Ihr einziges Problem ist, dass Ereignisse in einem eigenen Thread ausgeführt werden und Sie die Benutzeroberfläche nicht aus einem Thread aktualisieren können. Sie können sie nur über den UI-Thread aktualisieren. Ein wenig außerhalb meines Elements, aber Sie müssen Invoke oder BeginInvoke verwenden und möglicherweise mit einem Dispatcher, zB [hier] (http://stackoverflow.com/questions/4446048/how-to-update-textboxes-in- -main-thread-from-ahead-thread) und [hier] (http://stackoverflow.com/questions/19009174/dispatcher-invoke-vs-begininvoke-confusion). – Quantic

Antwort

0

Wie Sie warten auf den Prozess mit cmdProcess.WaitForExit zu verlassen, wird cmd_DataReceived alle Daten zu bekommen. Das bedeutet, dass Sie die Daten speichern müssen, die Sie aus dem Rückruf erhalten haben, und nachdem WaitForExit endet, können Sie das Textfeld mit dem Inhalt der gespeicherten Daten festlegen.

Eine einfache Möglichkeit ist die Verwendung einer StringBuilder:

// Have a reference to a stringbuilder that both functions can see 
    StringBuilder m_output; 

    private void richTextBox2_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
     { 
      // Before the process starts, create a new stringbuilder 
      m_output = new StringBuilder(); 

      e.Handled = true; 
      e.SuppressKeyPress = true; 
      ProcessStartInfo cmdStartInfo = new ProcessStartInfo(); 
      cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe"; 
      cmdStartInfo.RedirectStandardOutput = true; 
      cmdStartInfo.RedirectStandardError = true; 
      cmdStartInfo.RedirectStandardInput = true; 
      cmdStartInfo.UseShellExecute = false; 
      cmdStartInfo.CreateNoWindow = true; 

      Process cmdProcess = new Process(); 
      cmdProcess.StartInfo = cmdStartInfo; 
      cmdProcess.OutputDataReceived += cmd_DataReceived; 
      cmdProcess.EnableRaisingEvents = true; 
      cmdProcess.Start(); 
      cmdProcess.BeginOutputReadLine(); 
      cmdProcess.BeginErrorReadLine(); 

      cmdProcess.StandardInput.WriteLine(richTextBox2.Text); 
      cmdProcess.StandardInput.WriteLine("exit"); 

      cmdProcess.WaitForExit(); 

      // And now that everything's done, just set the text 
      // to whatever's in the stringbuilder 
      richTextBox1.Text = m_output.ToString(); 

      // We're done with the stringbuilder, let the garbage 
      // collector free it 
      m_output = null; 
     } 
    } 

    // Note: This is no longer a static method so it has 
    // access to the member variables, including m_output 
    void cmd_DataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Debug.WriteLine("Output from other process"); 
     Debug.WriteLine(e.Data); 

     // Add the data, one line at a time, to the string builder 
     m_output.AppendLine(e.Data); 
    } 
+0

Es hat funktioniert !, auch wenn ich "Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten." vor dem Text kann ich eine Filter-Zeichenfolge dafür machen :) – KrisPus

+0

Ich habe die Zeichenfolge hinzugefügt: string RAW = m_output.ToString(). Split (neue Zeichenfolge [] {">"}, StringSplitOptions.None) .Last(); Zeichenfolge RAW2 = RAW.Split (neue Zeichenfolge [] {richTextBox2.Text + "& exit"}, StringSplitOptions.RemoveEmptyEntries) .Last(); Aber endete mit vielen leeren Zeilen, aber es ist in Ordnung – KrisPus

Verwandte Themen