ProcessInfo и RedirectStandardOutput

У меня был класс в 4.6.1, обновляющий интерфейс, который был в 4.6.2 ... обновление класса до 462 исправило его.

28
задан Drew Noakes 20 August 2013 в 11:25
поделиться

3 ответа

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

Вы можете попробовать запустить свой код в другом процессе, который выводится на консоль, и посмотреть, правильно ли он работает. Мне прямо сейчас это читается.

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

Я пошел и вытащил блок кода, который использовал для этого. Это приложение WPF, которое перенаправляет вывод процесса в окно. Обратите внимание на привязку события. Поскольку это WPF, я должен вызвать свой вызов, чтобы записать данные. Поскольку вас не беспокоит блокировка, вы можете просто заменить это на:

Console.WriteLine(e.Data);

Надеюсь, это поможет!

    private static void LaunchProcess()
    {
        Process build = new Process();
        build.StartInfo.WorkingDirectory =  @"dir";
        build.StartInfo.Arguments = "";
        build.StartInfo.FileName = "my.exe";

        build.StartInfo.UseShellExecute = false;
        build.StartInfo.RedirectStandardOutput = true;
        build.StartInfo.RedirectStandardError = true;
        build.StartInfo.CreateNoWindow = true;
        build.ErrorDataReceived += build_ErrorDataReceived;
        build.OutputDataReceived += build_ErrorDataReceived;
        build.EnableRaisingEvents = true;
        build.Start();
        build.BeginOutputReadLine();
        build.BeginErrorReadLine();
        build.WaitForExit();
    }

    // write out info to the display window
    static void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        string strMessage = e.Data;
        if (richTextBox != null && !String.Empty(strMessage))
        {
            App.Instance.Dispatcher.BeginInvoke(DispatcherPriority.Send, (ThreadStart)delegate()
            {
                Paragraph para = new Paragraph(new Run(strMessage));
                para.Margin = new Thickness(0);
                para.Background = brushErrorBrush;
                box.Document.Blocks.Add(para);
            });
       }
    } 
49
ответ дан 28 November 2019 в 02:28
поделиться

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

ProcessStartInfo info = new ProcessStartInfo(...)
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;

Process p = Process.Start(info);
p.OutputDataReceived += p_OutputDataReceived;
p.ErrorDataReceived += p_ErrorDataReceived;

p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();

..

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Received from standard out: " + e.Data);
}

void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Received from standard error: " + e.Data);
}

Дополнительную информацию см. В событии OutputDataReceived off Process.

22
ответ дан 28 November 2019 в 02:28
поделиться

Использование лямбда-выражений и т.д.:

var info = new ProcessStartInfo(path)
{
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
    Verb = "runas",
};

var process = new Process
{
    EnableRaisingEvents = true,
    StartInfo = info
};

Action<object, DataReceivedEventArgs> actionWrite = (sender, e) =>
{
    Console.WriteLine(e.Data);
};

process.ErrorDataReceived += (sender, e) => actionWrite(sender, e);
process.OutputDataReceived += (sender, e) => actionWrite(sender, e);

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
11
ответ дан 28 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: