[英]Why is Process.StandardOutput different from the actual output and/or incomplete?
好吧,首先,当从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);
}
一个不同的例子:
输入错误的用户名或密码时,命令提示符将显示以下消息: *
登录失败:用户名未知或密码错误。
..而上述代码的输出将是:
句柄无效。
一个不完整的例子(这很重要) :
执行此命令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
与实际输出不同?
有没有办法解决?
* 我仅在此处介绍输出的相关部分。
我仍然不明白为什么输出会有所不同,但是我设法创建了一个解决方法,除非有人提供更好的解决方案,否则我将使用该解决方法。
我使用cmd.exe
将stdout
和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);
}
希望这可以帮助其他有同样问题的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.