我正在尝试执行一个命令并等待它退出:
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;但是,如果tasklist设置为true,则RedirectStandardOutput命令永远不会退出。
如果我将RedirectStandardOutput设置为false或将命令更改为/c whoami,则它几乎立即退出。
有什么想法吗?
发布于 2019-10-06 09:57:16
您应该在调用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;如果没有读取输出,tasklist进程将等待直到父进程读取输出,根据RedirectStandardOutput的备注部分
如果父进程在
之前调用
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链接显示了一个示例)。
https://stackoverflow.com/questions/58254883
复制相似问题