为什么 Process.StandardOutput 与实际输出不同和/或不完整?

21 浏览
0 Comments

为什么 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();
    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);
}

  • 不同的示例:

    当传递错误的用户名或密码时,命令提示窗口上会显示以下消息:*

    登录失败:未知的用户名或错误的密码。

    ..而上述代码的输出将是:

    句柄无效。

  • 不完整的示例(这更重要):

    当执行此命令PsExec \\computer -u username -p password query session时,结果看起来像这样:*

    SESSIONNAME USERNAME ID STATE TYPE DEVICE

    >services 0 Disc

    console someUserName 1 Active

    rdp-tcp 65537 Listen

    ..但从C#执行时的输出只有:

    SESSIONNAME USERNAME ID STATE TYPE DEVICE

所以,我的问题是:

  • 为什么Process.StandardOutput / Process.StandardError与实际输出不同?
  • 有没有办法解决这个问题?

* 我只展示了输出的相关部分。

0