StandardOutput возвращает пустую строку в C # - PullRequest
0 голосов
/ 20 февраля 2019

Подобные вопросы о STDOUT (STandarOUTput) были заданы ранее.Но в моем случае исключений нет, тем не менее, выходной результат - пустая строка.

Используя следующий код, я успешно могу выполнить EXE.Exe возвращает некоторые выходные данные в командном окне, которое я также вижу.Теперь я хочу прочитать этот вывод в строке.В приведенном ниже коде strOutput является пустой строкой (хотя я вижу некоторые результаты в окне командной строки).

Вот мой код:

System.Diagnostics.Process myProcess = new System.Diagnostics.Process();

try
{
    myProcess.StartInfo.Arguments = "";
    myProcess.StartInfo.UseShellExecute = false;             
    myProcess.StartInfo.FileName = @"D:\exeFilePath\exedrivermanager.exe";
    myProcess.StartInfo.CreateNoWindow = true;         

    myProcess.StartInfo.RedirectStandardOutput = true;
    myProcess.Start();
    string strOutput = myProcess.StandardOutput.ReadToEnd(); //THIS RETURNS AN EMPTY STRING.

    Console.WriteLine(Environment.NewLine + Environment.NewLine + "Output: " + strOutput);

    //Wait for process to finish
    myProcess.WaitForExit();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

РЕДАКТИРОВАТЬ:

Я понял, что невозможно записать вывод в файл, даже с командной строкой.Кажется, что вызываемая программа никогда не завершается полностью.Вызываемая программа покидает командную строку, как показано на снимке экрана ниже.

enter image description here

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Я считаю, что лучше всего записывать вывод exec во внешний текстовый файл, а затем читать из этого файла обычным способом чтения текстовых файлов.

0 голосов
/ 20 февраля 2019

Чтобы понять, что не так, вы можете попробовать прочитать ErrorStream.Например, утилита восстановления MongoDB записывает всю консольную информацию в ErrorStream вместо OutputStream.Я бы порекомендовал вам попробовать использовать прослушиватели событий:

           var startInfo = new System.Diagnostics.ProcessStartInfo
            {
                FileName = exePath,
                Arguments = " ", //this could be tricky
                UseShellExecute = false,
                RedirectStandardError = true,
                RedirectStandardOutput = true,
                CreateNoWindow = true
            };

            try
            {
                using (var process = new System.Diagnostics.Process())
                {
                    process.StartInfo = startInfo;

                    process.OutputDataReceived += (sender, args) => Logger.Warn("OutputStream: " + args.Data);
                    process.ErrorDataReceived += (sender, args) => Logger.Warn("ErrorStream: " + args.Data);

                    if (!process.Start())
                    {
                        // not started
                    }

                    process.BeginErrorReadLine();
                    process.BeginOutputReadLine();

                    if (!process.WaitForExit(60_000))
                    {
                        \\Process ended with timeout. 60_000";
                    }
                }
            }
            catch (Exception e)
            {
                \\ O_o
                throw;
            }
0 голосов
/ 20 февраля 2019

Я считаю, что подписка на события более надежна.И, как сказал Адриано, вам, вероятно, следует также перенаправить поток ошибок.Вот фрагмент кода, который должен помочь:

process.EnableRaisingEvents = true; 
process.StartInfo.RedirectStandardError = true;
process.OutputDataReceived += process_Output;
process.ErrorDataReceived += process_Error;

void process_Output(object sender, DataReceivedEventArgs e)
{
    //e.Data would contain a line
    var outputLine = e.Data;
}

void process_Error(object sender, DataReceivedEventArgs e)
{
    var errorLine = e.Data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...