Announcement

Collapse
No announcement yet.

Konsolenausgabe umleiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Konsolenausgabe umleiten

    Ich habe mir aus dem Internet einen Codeschnipsel gezogen, mit dem angeblich die Rückgabe von Konsolenbefehlen während deren Ausführung umgeleitet werden kann.

    Dies habe ich in einer kleinen Dummy- Applikation erst einmal eingebaut. Den Code habe ich so umgestrickt, dass die Ausgabe auf eine Textbox umgeleitet werden soll. Leider erhalte ich außer der Sanduhr nix und komme auch nicht wieder zurück, selbst wenn der Prozess bereits abgeschlossen ist.

    Wo liegt der Fehler ?

    Hier der angepasste Code:
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.IO;
    
    namespace DummyProject
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Shown(object sender, EventArgs e)
            {
                //string output;
                Process p = new Process();
    
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.FileName = "c:\\temp\\7za.exe";
                p.StartInfo.Arguments = " a -r -sfxc:\\temp\\7zS.sfx C:\\TEMP\\test.7z C:\\temp\\*.*";
                p.StartInfo.CreateNoWindow = true;
                p.OutputDataReceived += new DataReceivedEventHandler(this.p_OutputDataReceived);
    
                txtLog.Text = p.StartInfo.FileName + p.StartInfo.Arguments;
    
                p.Start();
    
                p.BeginOutputReadLine();
                p.WaitForExit();
                p.Close();
                
                MessageBox.Show("Hier komme ich erst nach Abschluss des Prozesses hin");
            }
    
            private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
            {
                //Debug.WriteLine(e.Data);
                txtLog.Text += e.Data;
            }
        }
    }

  • #2
    Hallo,

    das Ereignis OutputDataReceived kann auskommentiert werden. Statt dessen reicht es aus, unmittelbar nach dem Aufruf der Start-Methode den Rückgabewert direkt über ReadToEnd abzuholen:

    Code:
    ...
    p.Start();
    string sOutput = p.StandardOutput.ReadToEnd();
    p.WaitForExit()
    p.Close();
    MessageBox.Show(sOutput);

    Comment


    • #3
      Das hab ich auch schon mal ausprobiert. Nur leider bekomme ich da auch nicht das gleiche Verhalten wie auf der Konsole.

      Es wird immer erst die Ausgabe für das jeweilige Kommando angezeigt, nachdem es komplett abgearbeitet wurde.

      Bei solchen Komprimierungsgeschichten wie ich sie verwenden will, kann dies bei einer größeren Datenmenge schon einmal dauern. Der Benutzer könnte dann vermuten, dass das Programm abgestürzt sei, wenn er nicht gerade in den Task- Manager schaut.

      Im Prinzip soll alles so zeitnah wie möglich gezeigt werden, eben wie auf der Konsole auch.

      Comment

      Working...
      X