Another way to receive console output is attach to the cmd process:
var poList= Process.GetProcesses().Where(process => process.ProcessName.Contains("cmd"));
var a = poList.First();
//FreeConsole();//if you use console application you must free self console
AttachConsole((uint) a.Id);
var err=Marshal.GetLastWin32Error();
var ptr=GetStdHandle(-11);
SMALL_RECT srctReadRect= new SMALL_RECT
{
Top = 0,Left = 0,Bottom = 1,Right = 79
};
CHAR_INFO[,] chiBuffer = new CHAR_INFO[2,80]; // [2][80];
COORD coordBufSize= new COORD
{
X = 2,Y = 80
};
COORD coordBufCoord = new COORD
{
X = 0,
Y = 0
};
bool fSuccess;
fSuccess = ReadConsoleOutput( ptr,chiBuffer,coordBufSize,chiBuffer coordBufCoord,ref srctReadRect);
all pinvoke functions can be copied form PInvike ConsoleFunctions Let me know if you need mode detailed information