首页 > 解决方案 > 为什么 Process.StandardOutput 与实际输出不同和/或不完整?

问题描述

嗯,首先,当从 C# 执行 PsExec 命令时,一部分输出在 中,StandardOutput而另一部分StandardError 由于某种原因在 中,正如其他帖子中提到的那样,但这没什么大不了的。

现在,问题是:即使将这两个部分组合在一起,与命令提示符窗口上显示的内容相比,“输出”也不完全相同。有时它是不同的,有时它是不完整的。

这是我的代码:

string args = $@"{computerName} -u ""{username}"" -p ""{password}"" {pathOrCommand}";
var pi = new ProcessStartInfo("PsExec.exe", args);
pi.CreateNoWindow = true;
pi.WindowStyle = ProcessWindowStyle.Hidden;
pi.UseShellExecute = false;
pi.RedirectStandardOutput = true;
pi.RedirectStandardError = true;
using (Process p = Process.Start(pi))
{
    var resultLines = new List<string>();
    var handler = new DataReceivedEventHandler(delegate (object o, DataReceivedEventArgs e)
    {
        resultLines.Add(e.Data);
    });
    p.ErrorDataReceived += handler;
    p.OutputDataReceived += handler;
    p.BeginErrorReadLine();
    p.BeginOutputReadLine();

    p.WaitForExit();   
    string result = string.Join("\r\n", resultLines);
}

所以,我的问题是:


* 我在这里只展示输出的相关部分。

标签: c#processstdoutpsexec

解决方案


我仍然不明白为什么输出不同,但我设法创建了一个解决方法,除非有人提供更好的解决方案,否则我将使用它。

我曾经cmd.exestdoutand重定向stderr到一个临时文件。进程退出后,我读取文件的内容,然后将其删除:

string tempFile = Path.GetTempFileName();
string args = $@"/c PsExec.exe {computerName} -u ""{username}"" -p ""{password}"" {pathOrCommand}";
var pi = new ProcessStartInfo("cmd.exe", $"{args} 1> {tempFile} 2>&1");
pi.CreateNoWindow = true;
pi.WindowStyle = ProcessWindowStyle.Hidden;
using (Process p = Process.Start(pi))
{
    p.WaitForExit();

    string result = File.ReadAllText(tempFile);
    File.Delete(tempFile);
}

希望这可以帮助其他有同样问题的人。


推荐阅读