PsExec v 1.98输出重定向问题

时间:2012-04-25 05:25:56

标签: c# psexec

我不认为有关此主题的任何先前问题可以解决此问题。我使用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,它就像一个魅力!

1 个答案:

答案 0 :(得分:4)

此代码段导致死锁的几率非常高。因为您首先阅读StandardError,然后是StandardOutput。这意味着在进程退出之前不会调用process.StandardOutput.ReadToEnd()。这意味着当psexec填满足够的字符时,它将无法刷新其stdout输出缓冲区。这意味着它将阻止并因此永不终止。死锁城市。

如果你交换这两个电话你会有更好的赔率,大多数程序将大部分输出发送到stdout。但是如果psexec由于某种原因将大量字符写入stderr,则死锁的概率仍为非零。您可以通过使用BeginOutputReadLine和BeginErrorReadLine完全消除它。