Ausgaben eines Prozesses in Datei umleiten

Eroli

Erfahrenes Mitglied
Hallo zusammen,

ich will, dass mein programm die Ausgaben verschiedener Anwendungen (auf DOS-Basis) in eine Datei umleitet. Dies mache ich, indem ich dem Prozess als StartInfo den Argument >C:\\MeineDatei.txt übergebe.

Dies klappt bei *.bat-Dateien auch sehr gut, allerdings nicht bei *.exe's.

Die exe liefert genau so Ausgaben wie die BAT im Dosfenster und wenn ich sie direkt aus der CMD mit >C:\\MeineDatei.txt aufrufe funktioniert es auch, dass die Ausgaben in die Datei umgeleitet werden. Nur mit meinem Programm nicht.

Habt ihr vielleicht irgendwelche Ideen? Es ist leider relativ dringend...

Viele Grüße,
Eroli


PS: Noch ein bisschen Code
C#:
                        Process batchProcess = new Process();
                        batchProcess.StartInfo.FileName = BatchPathTextBox.Text;
                        batchProcess.StartInfo.Arguments = ArgumentsTextBox.Text + " > C:\\Output.txt";
                        batchProcess.Start();
                        while (!batchProcess.HasExited)
                        {
                            Thread.Sleep(1000);
                        }
(Keine Exceptions, C:\Output.txt wird nicht erstellt)
 
Hallo,

schau dir die Processklasse genauer an.

Hier ein Beispiel in dem die Ausgabe der Batchdatei in einem File über den Standardoutput-Kanal gespeichert wird.

C#:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;


namespace RedirectStandardOutputExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Process process = new Process();
            process.StartInfo.FileName = @"S:\batchjob.bat";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.OutputDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs e){
                Console.WriteLine("received Data: " + e.Data);
                WriteToFile(e.Data);
            });
            
            process.Start();
            process.BeginOutputReadLine();

            Console.ReadLine();
        }

        static void WriteToFile(string aText)
        {
            StreamWriter writer = new StreamWriter(@"s:\bubu.text",true);
            writer.WriteLine(aText);
            writer.Close();
        }
    }
}
So sieht die Batchdatei aus:
Code:
echo bubu

Und so sieht die Ausgabedatei (bubu.text) aus:
Code:
S:\>echo bubu 
bubu

Gruß Konstantin
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

da bin ich ziemlich direkt nachdem ich hier gefragt hatte auch drauf gekommen. Allerdings funktioniert auch dies nicht.

Wenn ich die Anwendung im DOS-Fenster starte, dann sieht das so aus, dass in eine Zeile "A" geschrieben wird. Dann, während das programm lädt, sieht es so aus:
"A."
"A.."
"A..."
Irgendwann ist es ja dann mal fertig mit laden und dann steht in DERSELBEN Zeile:
"B"

Soweit ich weiß ist dies in der normalen Eingabeaufforderung von Windows gar nicht möglich, muss also irgendwie mit dem Programm zusammenhängen und deswegen wohl auch die Schwierigkeiten.

Habt ihr irgendwelche Ideen?
 
Also das was auf der Konsole ausgegeben wird ist ja nur ein output.
Wie sieht denn der Code aus der die Ausgabe auf die Konsole macht?
 
Hallo,

ich kann dir nicht sagen, wie der aussieht, weil ich da keinen Zugriff drauf habe. ich weiß nur, dass es mit VO (VisualObjects) von der Firma CA geschrieben ist.

Ich kann dir nur sagen, dass es so nicht klappt, also ist es wohl doch irgendwie kein Output.

Ist dein Code mit meinem gleichwertig?

C#:
                        Process batchProcess = new Process();
                        batchProcess.StartInfo.FileName = BatchPathTextBox.Text;
                        batchProcess.StartInfo.Arguments = ArgumentsTextBox.Text;
                        batchProcess.StartInfo.RedirectStandardOutput = true;
                        batchProcess.StartInfo.UseShellExecute = false;
                        batchProcess.Start();
                        String output = batchProcess.StandardOutput.ReadToEnd();
                        batchProcess.WaitForExit();
                        MessageBox.Show(output);
 
Zuletzt bearbeitet:
Wie leitest du den deinen Output(wenn es einen gäbe) um? Schick mal Code
 
Bitte den Code oben beachten, wurde reineditiert, schon vor diesem Post.

Das Problem ist das folgende.

Eine Bat-Datei ruft die oben beschriebene Anwendung auf und diese erzeugt einige Zeilen in der beschriebenen, komischen Art und Weise. Da die BAT-Datei diesen Vorgang sehr oft wiederholt und ab und an die Zeilen mal anders sind, ist es erforderlich auf ALLE Zeilen Zugang zu haben. Irgendwann kann man aber nicht mehr im DOS-Fenster hochscrollen und außerdem ist dies zu unübersichtlich. Ich wollte den Output in eine Datei leiten und dann entsprechend filtern.
 
Also ich hoffe du führst die Umleitung nicht mit > C:\myFile.txt durch, weil das ja nicht funktioniert. In meinem Bespiel verwende ich einen EventHandler mit dem ich jede neue Ausgabe direkt in ein File schreibe. Probiere das mal so zu machen wie ich es tuhe.

[EDIT]
Der EventHandler reagiert sobald ein entsprechendes Event gesendet wird. Dieses wird gesendet sobald eine neue Ausgabe gemacht wird.
Und da kannst du ja handeln, dass nach A... => B in eine neue Zeile rutscht z.B. in dem du schaust ob der Wert != . ist , dann kommt er in eine neue Zeile.
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
Nein, auch dies klappt nicht. Habe deinen Code wie folgt umgeformt:

C#:
        private void StartButton_Click(object sender, EventArgs e)
        {
            Start();
        }

        private void Start()
        {
            try
            {
                Process process = new Process();
                process.StartInfo.FileName = PathTextBox.Text;
                process.StartInfo.Arguments = ArgumentsTextBox.Text;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.OutputDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs e)
                {
                    LogRichTextBox.AppendText(e.Data + "\n");
                    WriteToFile(e.Data);
                });
                process.Start();
                process.BeginOutputReadLine();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        void WriteToFile(string aText)
        {
            StreamWriter writer = new StreamWriter(@"C:\bubu.text",true);
            writer.WriteLine(aText);
            writer.Close();
        }

Ich sag ja, die Ausgabe ist extrem komisch, das ist keine normale Ausgabe...

Und da kannst du ja handeln, dass nach A... => B in eine neue Zeile rutscht z.B. in dem du schaust ob der Wert != . ist , dann kommt er in eine neue Zeile.

Es wird aber weder "A" noch "A." noch "A.." noch "A..." noch "B" vom Programm erfasst.
 
Zuletzt bearbeitet:
Zurück