Avatar billede mikeo Nybegynder
04. maj 2005 - 16:31 Der er 7 kommentarer og
1 løsning

Redirect standardoutput til en fil

Hej!

Jeg har et program der starter et consolProgram (vha System.Diagnostics.Process...) Det program der startes skriver noget forskelligt til til standardOut (Console.Out).

Jeg vil gerne have det consolProgrammet skriver, appendet til en fil.
Og det skal appendes til filen løbende. Dvs. det er ikke nok at det bliver skrevet når consolProgrammet afsluttes.

Nogen forslag?
Avatar billede _just4fun_ Nybegynder
04. maj 2005 - 16:44 #1
Forslag:
        private string runProgram(string program, string arguments)
        {
            System.Diagnostics.ProcessStartInfo psi =  new System.Diagnostics.ProcessStartInfo(program);
            psi.Arguments = arguments;
            psi.RedirectStandardOutput = true;
            psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
            psi.UseShellExecute = false;
            System.Diagnostics.Process listFiles;
            listFiles = System.Diagnostics.Process.Start(psi);
            System.IO.StreamReader myOutput = listFiles.StandardOutput;
            listFiles.WaitForExit(60000);
            string output = "exited without returning";
            if (listFiles.HasExited) 
            { 
                output = myOutput.ReadToEnd();
            }
            return output;
        }
Avatar billede mikeo Nybegynder
04. maj 2005 - 16:58 #2
Det duer desværre ikke. ConsolPogrammet skal nemlig køre i flere dage af gangen uden at stoppe.
Avatar billede nielle Nybegynder
04. maj 2005 - 19:08 #3
ProcessStartInfo PSI = new ProcessStartInfo(@"C:\Source.C#\PocEksperten016b\bin\Debug\PocEksperten016b.exe");

PSI.RedirectStandardOutput = true;
PSI.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
PSI.UseShellExecute = false;
           
Process P = Process.Start(PSI);
StreamReader SR = P.StandardOutput;

while (!P.HasExited)
{
    string Output = SR.ReadLine();

    using (StreamWriter SW = new StreamWriter(@"C:\log.txt", true))
    {
        SW.AutoFlush = true;
        SW.WriteLine(Output);
    }
}
Avatar billede nielle Nybegynder
04. maj 2005 - 21:54 #4
Der er selvfølgelig også muligheden for at gøre det på den gode gamle måde - ude i DOS:

C:\> DitProgram.exe >> C:\log.txt
Avatar billede mikeo Nybegynder
06. maj 2005 - 09:17 #5
Ja det har du da helt ret i :-)

Hvad sker der når der laves et kald til ReadLine() (SR.ReadLine()), og der ikke er noget at læse? Bliver processen excluderet ind til der kommer noget, eller vil den blot fortsætte?
Avatar billede nielle Nybegynder
06. maj 2005 - 09:52 #6
I de tests jeg selv har lavet ser der ikke ud til at være noget problem når processen ikke har skrevet noget.

Derimod er der netop nogle problemer hvis processen skriver meget ud på meget kort tid - så får ReadLine vist ikke fat i alt sammen.
Avatar billede mikeo Nybegynder
08. maj 2005 - 11:49 #7
Det ser ikke desto mindre ud til at virke efter hensigten :-) Så tak for hjælpen.
Smid et svar...
Avatar billede nielle Nybegynder
08. maj 2005 - 13:49 #8
Ok :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester