public CommandResult Execute() { TextWriter originalConsoleOut = _environment.GetConsoleOut(); TextWriter originalConsoleError = _environment.GetConsoleError(); string originalWorkingDirectory = _environment.GetWorkingDirectory(); try { // redirecting the standard out and error so we can forward // the output to the caller using (BlockingMemoryStream outStream = new BlockingMemoryStream()) using (BlockingMemoryStream errorStream = new BlockingMemoryStream()) { _environment.SetConsoleOut(new StreamWriter(outStream) { AutoFlush = true }); _environment.SetConsoleError(new StreamWriter(errorStream) { AutoFlush = true }); // Reset the Reporters to the new Console Out and Error. Reporter.Reset(); if (!string.IsNullOrEmpty(_workingDirectory)) { _environment.SetWorkingDirectory(_workingDirectory); } var taskOut = _stdOut.BeginRead(new StreamReader(outStream)); var taskErr = _stdErr.BeginRead(new StreamReader(errorStream)); int exitCode = _builtInCommand(_commandArgs.ToArray()); outStream.DoneWriting(); errorStream.DoneWriting(); Task.WaitAll(taskOut, taskErr); // fake out a ProcessStartInfo using the Muxer command name, since this is a built-in command ProcessStartInfo startInfo = new ProcessStartInfo(new Muxer().MuxerPath, $"{CommandName} {CommandArgs}"); return(new CommandResult(startInfo, exitCode, null, null)); } } finally { _environment.SetConsoleOut(originalConsoleOut); _environment.SetConsoleError(originalConsoleError); _environment.SetWorkingDirectory(originalWorkingDirectory); Reporter.Reset(); } }