.NET System.Diagnostics.Process执行shell命令输出不完整问题求助
问题原因
- 未重定向并读取标准错误流:
net user %USERNAME% /DOMAIN这类系统命令会将部分状态提示、查询结果输出到标准错误流(StandardError),你当前的代码仅读取了标准输出流(StandardOutput),自然会丢失这部分内容。 - 同步读取逻辑存在缺陷:
StandardOutput.ReadToEnd()是同步读取方法,在进程未退出时调用只会返回当前输出缓冲区中已有的全部数据就立刻返回,不会等待后续输出写入,循环重复调用该方法也无法捕获后续新生成的输出,还会造成内容重复拼接的问题。
解决方案
推荐使用官方推荐的异步事件监听方式读取输出,可同时捕获标准输出和标准错误流的所有内容,也能避免进程死锁问题,修正后的代码如下:
' 先导入需要的命名空间,放在文件顶部 Imports System.Diagnostics Imports System.Text ' 业务逻辑部分 Dim oProcess As New Process() Dim oStartInfo As New ProcessStartInfo("net.exe", "user %USERNAME% /DOMAIN") oStartInfo.UseShellExecute = False oStartInfo.RedirectStandardOutput = True oStartInfo.RedirectStandardError = True ' 新增:重定向标准错误流 oStartInfo.CreateNoWindow = True ' 如果输出有中文乱码,可新增以下两行指定编码 ' oStartInfo.StandardOutputEncoding = Encoding.GetEncoding("GBK") ' oStartInfo.StandardErrorEncoding = Encoding.GetEncoding("GBK") oProcess.StartInfo = oStartInfo ' 初始化存储输出的StringBuilder Dim outputBuilder As New StringBuilder() ' 绑定输出接收事件,标准输出和标准错误流共用同一个处理逻辑 AddHandler oProcess.OutputDataReceived, Sub(sender, e) If Not String.IsNullOrEmpty(e.Data) Then outputBuilder.AppendLine(e.Data) End If End Sub AddHandler oProcess.ErrorDataReceived, Sub(sender, e) If Not String.IsNullOrEmpty(e.Data) Then outputBuilder.AppendLine(e.Data) End If End Sub oProcess.Start() ' 开始异步监听两个流的输出 oProcess.BeginOutputReadLine() oProcess.BeginErrorReadLine() ' 等待进程执行完成 oProcess.WaitForExit() ' 最终把所有输出赋值给文本框 Me.TextBox1.Text &= outputBuilder.ToString() & vbCrLf ' 释放进程资源 oProcess.Close() oProcess.Dispose()
内容的提问来源于stack exchange,提问作者Oak_3260548
相关产品推荐
相关产品推荐

