PsExec v 1.98 输出重定向问题

本文关键字:重定向 问题 输出 PsExec | 更新日期: 2023-09-27 18:32:14

我认为之前关于这个主题的任何问题都没有给出这个问题的答案。我使用 psexec 执行远程 exe 文件。当我在命令行中运行 exe 文件时,我正在获取它的输出。 psexec.exe ''machine C:'somename.exe .
当我使用 C 尖锐进程执行时,它要么挂起,要么不重定向输出。对于某些 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,它就像一个魅力!

PsExec v 1.98 输出重定向问题

此代码片段导致死锁的可能性非常高。 因为你首先阅读StandardError,然后阅读StandardOutput。 这意味着这个过程。StandardOutput.ReadToEnd() 在进程退出之前不会被调用。 这意味着 psexec 在填充足够多的字符时将无法刷新其 stdout 输出缓冲区。 这意味着它将阻塞,因此永远不会终止。 死锁城市。

如果您交换两个调用,您将有更好的几率,大多数程序将大部分输出发送到 stdout。 但是,如果 psexec 出于某种原因向 stderr 写入大量字符,则死锁的几率仍然不为零。 您可以通过使用 BeginOutputReadLine 和 BeginErrorReadLine 来完全消除这种情况。