Как прикрепить OutputDataReceived на внешний процесс? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь запустить консольное приложение из сценария powershell, а затем получить процесс в программе c# и затем присоединить его к событию OutputDataReceived, чтобы получить стандартный вывод консоли. Мой код выглядит так:

Powershell:

    $proc = New-Object System.Diagnostics.Process
    $proc.StartInfo.FileName = $path
    $proc.StartInfo.Arguments = "$args"
    $proc.StartInfo.RedirectStandardOutput = $true
    $proc.StartInfo.RedirectStandardError = $true
    $proc.StartInfo.UseShellExecute = $false
    $proc.StartInfo.CreateNoWindow = $false
    $proc.EnableRaisingEvents = $true
    $proc.Start()
    $proc.BeginErrorReadLine()
    $proc.BeginOutputReadLine()

    $processIdFile = "processId.txt"
    new-item -force -path $processIdFile -value $proc.Id -type file

Затем, со стороны C#:

private Process GetProcess()
        {
            var processIdFile = Path.Combine(this.MessageQueueDir, "processId.txt");
            var processId = File.ReadAllText(processIdFile).ToInt32().Value;
            var process = Process.GetProcessById(processId, ".");
            return process;
        }
private void ReadOutput()
{
    var proc = GetProcess()
    var _output = new StringBuilder()
    var _error = new StringBuilder()
    proc.OutputDataReceived += CreateLogHandler(_output); // Appends string to stringbuilder on event
    proc.ErrorDataReceived += CreateLogHandler(_error);
    while (true){
       string o = _output.ToString(); // o is always empty string
       Thread.Sleep(1000);
    }
}

Странная вещь, если я копирую этот процесс создание кода в контексте c#, на самом деле он работает правильно. Возможно, это проблема Windows, где, возможно, он не позволяет вам читать вывод, если он создан в другом потоке? Есть ли способ обойти это? Мой текущий обходной путь - это вывод в текстовый файл и чтение его, но это не на 100% безопасно во всех случаях.

Редактировать 1: Кроме того, при запуске процесса в powershell я не получаю новую консоль окно для программы, тогда как, если я запускаю ее в c#, появляется новое окно консоли для исполняемого файла. Не уверен, что это актуально или нет.

...