为什么 Process.StandardOutput 与实际输出不同和/或不完整?
为什么 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
与实际输出不同? - 有没有办法解决这个问题?
* 我只展示了输出的相关部分。