没有获得进程的输出 (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 包含在各种空间中的主要内容,如果未能解决你的问题,请参考以下文章

高手请进!任务管理器里的进程那些是可以结束不用的呢?

如何把nginx安装成windows服务

如何获得CreateProcess启动的进程返回的结果

使用带有 cat 和多个进程管道的 popen 未获得 grep 结果

使用 grep 过滤进程的实时输出?如果是这样,如何在比赛后获得线路? [复制]

cmd常用命令