Beispiel #1
0
        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();
            }
        }