【问题标题】:.NET System.Diagnostics.Process output is incomplete.NET System.Diagnostics.Process 输出不完整
【发布时间】:2021-06-07 11:01:15
【问题描述】:

我无法检索在 shell 中执行的命令的完整输出。该程序首先写一行说明它正在连接到服务器以获取数据,然后显示获取的数据。在我的小型 VB 应用程序中我总是只得到第一行,这表明该命令提供了正确且经过验证的参数,但输出的其余部分没有通过。

首先,我只是尝试使用WaitForExit() 和ReadToEnd() 来阅读它。然后用oProcess.StandardOutput.ReadLine()逐行阅读。

正如某个线程中的建议,我尝试禁用 WaitForExit() 并包含等待进程退出的循环:

    Dim oProcess As New System.Diagnostics.Process()
    Dim oStartInfo As New System.Diagnostics.ProcessStartInfo("net", " user %USERNAME% /DOMAIN")
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    'oProcess.WaitForExit()

    Dim lns As String
    Dim q As System.Text.StringBuilder = New System.Text.StringBuilder()
    While Not (oProcess.HasExited)
        q.Append(oProcess.StandardOutput.ReadToEnd())
        lns &= q.ToString()
    End While
    Me.TextBox1.Text &= lns & vbCrLf

我尝试按照另一个帖子中的建议包含Thread.Sleep(500)。

仍然只有一行。显然,它就像来自 CMD 的魅力。请问有什么想法吗?

【问题讨论】:

  • 如果是net 命令,我猜剩下的输出在stderr,而不是stdout。也尝试捕获 stderr。
  • @Zilog80 好的,从没有看到它的角度来看,这是有道理的。感谢您的建议,将尝试。
  • 您可能需要考虑使用 .NET 中内置的类型直接与 Active Directory 交互,而不是使用命令行工具然后必须解析它的输出。
  • @Damien_The_Unbeliever 是的,这是一种可能性,尽管用 AD 查询来负担一个很小的功能是相当过分的。那里的主要问题是,目前我没有设置 LDAP 部分所需的所有信息(比如 OU 的名称)。

标签: .net cmd process output


【解决方案1】:

事实证明这个问题相当愚蠢,由于我的经验不足,我没有意识到如果出现错误,错误消息会进入不同的(错误)输出。这导致我错误地描述了问题。

读取错误输出时,我可以看到查询返回未找到用户的错误。 %USERNAME% 未被处理并用 Environment.GetEnvironmentVariable("USERNAME") 替换它修复了所有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2018-02-14
    • 2018-09-30
    相关资源
    最近更新 更多