c# - 为什么 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);
}
不同时的示例:
当传递错误的用户名或密码时,命令提示符上将显示以下消息:*
登录失败:未知用户名或密码错误。
..而上述代码的输出将是:
句柄无效。
一个不完整的例子(这更重要):
执行此命令
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
and重定向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);
}
希望这可以帮助其他有同样问题的人。
推荐阅读
- c# - 使用 Azure 时 Visual Studio 中的 System.Net.Sockets.SocketException
- amazon-web-services - aws 云形成嵌套堆栈导出/导入值
- android - Gradle 同步失败,因为 ImmutableMultiMap 无法访问其超类
- sql-server - 在 SQL Server 的存储过程中执行时,新创建的变量显示为空值
- ios - 页面更改控制当前页面点的半径
- object - 地图内的 Lodash _.omit 函数
- java - 处理:声音文件在循环中,但只想播放一次
- openoffice-calc - 将多个电子表格中的数据读入数据库
- image - Rust - 图像箱:保存图像缓冲区的问题
- javascript - 从 React.js 中的 json 文件中获取数据