没有获得进程的输出 (SFC.exe /VERIFYONLY)。 Process.StandardOutPut.ReadToEnd 提供输出,其中 /n/0/n 包含在各种空间中
Posted
技术标签:
【中文标题】没有获得进程的输出 (SFC.exe /VERIFYONLY)。 Process.StandardOutPut.ReadToEnd 提供输出,其中 /n/0/n 包含在各种空间中【英文标题】:Not getting output of a process (SFC.exe /VERIFYONLY). The Process.StandardOutPut.ReadToEnd is giving output with /n/0/n included in various spaces 【发布时间】:2020-05-13 17:30:58 【问题描述】: 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\"/ 字符串过程输出=输出+错误; p.WaitForExit();
【问题讨论】:
【参考方案1】:显然,sfc 使用 WriteFile 将重定向输出作为 Unicode 写入。然后您可以通过指定来帮助消费者对其进行解码
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;
【讨论】:
以上是关于没有获得进程的输出 (SFC.exe /VERIFYONLY)。 Process.StandardOutPut.ReadToEnd 提供输出,其中 /n/0/n 包含在各种空间中的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 cat 和多个进程管道的 popen 未获得 grep 结果