Solved

C# Redirect Console Output to log file

Posted on 2007-03-22
9
2,323 Views
Last Modified: 2007-12-19
I would like to run an executable program that takes an argument and then redirect the console output to a file. The following is how I normally do it from command line (runs nunit-console.exe, passes it MyTest.dll as an argument, and redirects the console output to outfile.log):

nunit-console.exe MyTest.dll > outfile.log 2>&1

I would like to be able to do this strictly from my C# code. The following is the code I have, but it does not work. Can you please help me (this is very urgent)???? Thank you so much!!!

           Process myprocess  = new Process();
            myprocess.StartInfo.FileName = @"c:\nunit-console.exe";
            myprocess.StartInfo.WorkingDirectory = @"c:\" ;
            myprocess.StartInfo.Arguments= "MyTest.dll -s -m";
            myprocess.StartInfo.UseShellExecute = false;
            myprocess.StartInfo.RedirectStandardOutput = true;
            myprocess.StartInfo.CreateNoWindow = true;
            StreamWriter sw = new StreamWriter(@"c:\outfile.log");
            myprocess.Start();
            sw.WriteLine(myprocess.StandardOutput.ReadToEnd());
            sw.Close();
0
Comment
Question by:jrwalker2
  • 6
  • 2
9 Comments
 
LVL 16

Expert Comment

by:AlexNek
ID: 18769655
I remember that setting RedirectStandardOutput to true is not enough. In addition you must set
UseShellExecute = false;
http://msdn2.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx
0
 
LVL 16

Expert Comment

by:AlexNek
ID: 18769656
Ohh you you have it already, sorry.
0
 
LVL 16

Expert Comment

by:AlexNek
ID: 18769658
Try to remove myprocess.StartInfo.CreateNoWindow = true;
0
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 
LVL 16

Expert Comment

by:AlexNek
ID: 18769664
myprocess.WaitForExit(); can be useful too.
0
 
LVL 9

Accepted Solution

by:
bele04 earned 250 total points
ID: 18769697
you should read the stream being returned by the process before calling the WaitForExit:

Process myprocess  = new Process();
            myprocess.StartInfo.FileName = @"c:\nunit-console.exe";
            myprocess.StartInfo.WorkingDirectory = @"c:\" ;
            myprocess.StartInfo.Arguments= "MyTest.dll -s -m";
            myprocess.StartInfo.UseShellExecute = false;
            myprocess.StartInfo.RedirectStandardOutput = true;
            myprocess.StartInfo.CreateNoWindow = true;
            StreamWriter sw = new StreamWriter(@"c:\outfile.log");
            myprocess.Start();
            string strOutput = myprocess.StandardOutput.ReadToEnd();
            myprocess.WaitForExit();
            sw.WriteLine(strOutput);
            sw.Close();

more info at the msdn site:
http://msdn2.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx
0
 
LVL 1

Author Comment

by:jrwalker2
ID: 18772793
I tried the above code, but it is not working for me yet. It prints to the oufile.log what seems to be rules on how to run nunit-console.exe with arguments, but I do not know how to apply it. The MyTest.dll is a library of NUnit tests that I am trying to run. I also saw on the following website an example of running an .exe file and passing args to it it the way I think I want to, but I'm not sure how to apply it (compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs") .
http://msdn2.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx 

Can you please provide code? Thank you



Below is what printed in the outfile.log:
-------------------------------------------
NUnit version 2.2.2
Copyright (C) 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole.
Copyright (C) 2000-2003 Philip Craig.
All Rights Reserved.

OS Version: Microsoft Windows NT 5.1.2600 Service Pack 2    .NET Version: 2.0.50727.42


NUNIT-CONSOLE [inputfiles] [options]

Runs a set of NUnit tests from the console.

You may specify one or more assemblies or a single
project file of type .nunit.

Options:
/fixture=STR         Fixture to test
/config=STR          Project configuration to load
/xml=STR             Name of XML output file
/transform=STR       Name of transform file
/xmlConsole          Display XML to the console
/output=STR          File to receive test output (Short format: /out=STR)
/err=STR             File to receive test error output
/labels              Label each test in stdOut
/include=STR         List of categories to include
/exclude=STR         List of categories to exclude
/noshadow            Disable shadow copy
/thread              Run tests on a separate thread
/wait                Wait for input before closing console window
/nologo              Do not display the logo
/help                Display help (Short format: /?)


Options that take values may use an equal sign, a colon
or a space to separate the option from its value.


0
 
LVL 16

Assisted Solution

by:AlexNek
AlexNek earned 250 total points
ID: 18774443
It is correct
myprocess.StartInfo.Arguments= "MyTest.dll -s -m";
you can try to write
myprocess.StartInfo.Arguments= "\"MyTest.dll -s -m\"";

0
 
LVL 1

Author Comment

by:jrwalker2
ID: 18775965
Thank you all
0
 
LVL 16

Expert Comment

by:AlexNek
ID: 18776248
Dont mention it. Thank you too.
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

For those of you who don't follow the news, or just happen to live under rocks, Microsoft Research released a beta SDK (http://www.microsoft.com/en-us/download/details.aspx?id=27876) for the Xbox 360 Kinect. If you don't know what a Kinect is (http:…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question