Не получается вывод процесса (SF C .exe / VERIFYONLY). Process.StandardOutPut.ReadToEnd дает вывод с / n / 0 / n, включенным в различные пространства - PullRequest
0 голосов
/ 28 января 2020
            Process p = new Process();
            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            p.StartInfo.CreateNoWindow = false;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.FileName = "sfc.exe";
            p.StartInfo.Arguments = " /VERIFYONLY";
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.Start();
            string error = p.StandardError.ReadToEnd();
            string output = p.StandardOutput.ReadToEnd();

/ processOutput получает вывод типа "\ n \ 0 \ n \ 0 \ n \ 0M \ 0i \ 0c \ 0r \ 0o \ 0s \ 0o \ 0f \ 0t \ 0 \ 0 ( \ 0R \ 0) \ 0 \ 0W \ " / string processOutput = output + error; p.WaitForExit ();

1 Ответ

0 голосов
/ 28 января 2020

Судя по всему, sf c записывает перенаправленный вывод как Unicode, используя WriteFile. Затем вы можете помочь потребителю декодировать его, указав

p.StartInfo.StandardOutputEncoding = System.Text.Encoding.Unicode;

В связанной заметке - следите за переполнением буфера каналов. Вы читаете перенаправленный вывод с блокировкой вызовов на StreamReader.ReadToEnd. Вы можете зайти в тупик, заблокировав чтение одного потока, пока дочерний процесс пытается выполнить запись в другой. Самое простое решение - использовать StreamReader.ReadToEndAsync хотя бы для одного потока:

var output_task = p.StandardOutput.ReadToEndAsync();
string error = p.StandardError.ReadToEnd();
string output = output_task.Result;
...