Перенаправить вывод процесса в файл и на консоль - PullRequest
1 голос
/ 24 мая 2019

Мне нужно выполнить команду оболочки из c# кода, а затем записать в файл выходные данные оболочки.

Код, который я использую для выполнения команды оболочки:

using (var process = Process.Start(new ProcessStartInfo
{
    FileName = fileName,
    Arguments = arguments,
    CreateNoWindow = false,
    WindowStyle = ProcessWindowStyle.Normal,
    RedirectStandardOutput = false,
    UseShellExecute = true,
}))
{
    // blocking wait for the process to end
    process.WaitForExit();
}

Я читаю другие ответы, которые меняют RedirectStandardOutput = true и useShellExecute = false, чтобы они могли получать вывод консоли с

string output = process.StandardOutput.ReadToEnd();

Но это не откроет окно оболочки.

Есть лиспособ отобразить вывод команды в окне консоли и получить этот вывод?

1 Ответ

1 голос
/ 24 мая 2019

Можно использовать что-то подобное

using System;
using System.Diagnostics;

    namespace InteractWithConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                ProcessStartInfo cmdStartInfo = new ProcessStartInfo();
                cmdStartInfo.FileName = @"C:\Windows\System32\cmd.exe";
                cmdStartInfo.RedirectStandardOutput = true;
                cmdStartInfo.RedirectStandardError = true;
                cmdStartInfo.RedirectStandardInput = true;
                cmdStartInfo.UseShellExecute = false;
                cmdStartInfo.CreateNoWindow = true;

                Process cmdProcess = new Process();
                cmdProcess.StartInfo = cmdStartInfo;
                cmdProcess.ErrorDataReceived += cmd_Error;
                cmdProcess.OutputDataReceived += cmd_DataReceived;
                cmdProcess.EnableRaisingEvents = true;
                cmdProcess.Start();
                cmdProcess.BeginOutputReadLine();
                cmdProcess.BeginErrorReadLine();

                cmdProcess.StandardInput.WriteLine("ping google.com.ua");     //Execute ping google.com.ua
                cmdProcess.StandardInput.WriteLine("exit");                  //Execute exit.

                cmdProcess.WaitForExit();
            }

            static void cmd_DataReceived(object sender, DataReceivedEventArgs e)
            {
                Console.WriteLine("Output from other process");
                Console.WriteLine(e.Data);
            }

            static void cmd_Error(object sender, DataReceivedEventArgs e)
            {
                Console.WriteLine("Error from other process");
                Console.WriteLine(e.Data);
            }
        }
    }
...