我不认为有关此主题的任何先前问题可以解决此问题。我使用psexec来执行远程exe文件。我在命令行中运行时获取exe文件的输出。 psexec.exe \\machine C:\somename.exe
。
当我使用C sharp Process Execution时,它会挂起或者它不会重定向输出。对于某些exe的超时和一些重定向标准输出为空,错误包含Exe退出代码0.有没有办法捕获输出?
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName =GetPsExecPath();
startInfo.Arguments = arguments;
Debug.WriteLine(arguments);
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
error = process.StandardError.ReadToEnd();
output = process.StandardOutput.ReadToEnd();
Debug.WriteLine(error);
Debug.WriteLine(output);
process.close();
编辑:索恩 所以问题主要是因为Psexec会向stderr抛出很多其他东西,因此我们读取它们的顺序,如果我们使用ReadToEnd(),它可能会导致死锁。因此,如果我们使用BeginOutputReadLine,它就像一个魅力!
答案 0 :(得分:4)
此代码段导致死锁的几率非常高。因为您首先阅读StandardError,然后是StandardOutput。这意味着在进程退出之前不会调用process.StandardOutput.ReadToEnd()。这意味着当psexec填满足够的字符时,它将无法刷新其stdout输出缓冲区。这意味着它将阻止并因此永不终止。死锁城市。
如果你交换这两个电话你会有更好的赔率,大多数程序将大部分输出发送到stdout。但是如果psexec由于某种原因将大量字符写入stderr,则死锁的概率仍为非零。您可以通过使用BeginOutputReadLine和BeginErrorReadLine完全消除它。