任务列表命令在重定向标准输出为 true 时不会退出



我正在尝试执行命令并等待它退出:

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c tasklist";
proc.Start();
proc.WaitForExit();
return;

但是,如果设置为 trueRedirectStandardOutputtasklist命令永远不会退出。

如果我将RedirectStandardOutput设置为 false 或将命令更改为/c whoami,它几乎立即退出。

有什么想法吗?

您应该在调用WaitForExit()之前阅读输出,此示例工作正常:

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c tasklist";
proc.Start();
var output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
Console.WriteLine(output);
return;

根据RedirectStandardOutput的备注部分,如果不读取输出tasklist进程会等到父进程读取输出

如果父进程调用,则可能导致死锁条件p.StandardOutput.ReadToEnd和子进程之前的p.WaitForExit写入足够的文本来填充重定向的流。父进程 将无限期等待子进程退出。孩子 进程将无限期地等待父级从完整读取StandardOutput流。

您还可以异步读取进程输出(并限制进程等待退出超时(,如下所示

Process proc = new Process();
StringBuilder output = new StringBuilder();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c tasklist";
proc.OutputDataReceived += (s, e) =>
{
output.Append(e.Data).Append("n");
};
proc.ErrorDataReceived += (s, e) =>
{
output.Append(e.Data).Append("n");
};
proc.Start();
proc.BeginOutputReadLine();
proc.WaitForExit(100);
Console.WriteLine(output);
return; 

此外,如果要重定向两个流(错误和输出(,则由于再次死锁,您已经异步读取了其中的至少一个流(MSDN 链接显示了一个示例(

最新更新