【发布时间】: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 的名称)。