我希望Visual Basic能够在目录“C: projectTest ”上运行“make”命令。
我试图用这个:
Dim output As String = String.Empty Using Process As New Process Process.StartInfo = New processstartinfo("cmd") Process.StartInfo.WorkingDirectory = "C:projectTest" Process.StartInfo.UseShellExecute = False Process.StartInfo.CreateNowindow = True Process.StartInfo.RedirectStandardInput = True Process.StartInfo.RedirectStandardOutput = True Process.StartInfo.RedirectStandardError = True Process.Start() Process.BeginoutputReadLine() AddHandler Process.OutputDataReceived,_ Sub(processSender As Object,lineOut As DataReceivedEventArgs) output += lineOut.Data + vbCrLf End Sub Using InputStream As System.IO.StreamWriter = Process.StandardInput InputStream.AutoFlush = False InputStream.WriteLine("make") End Using Do Application.DoEvents() Loop Until Process.HasExited End Using
这段代码能够捕获控制台的“gcc …”部分(来自Makefile),但不会捕获错误(如果手动打开cmd并在该目录上运行make,会popup错误消息)。
如何检测Windows是否通过局域网或WiFi通过C#
我们可以从共享path运行batch file(.bat)吗?
以编程方式将SSL证书绑定到端口
Windows服务权限来读取共享文件夹
使用Windows传真服务器扩展发送传真 – faxcomexlib
Windows客户端应用程序的login对话框
安装程序自定义操作无法读取所有registry值
使用Windows系统caching的.NET HttpRequests
从IntPtr句柄获取Control / Form对象
C#试图打开远程文件的位置,但Windows不通过凭据
不止一个问题。 首先,由于@ shf301已经告诉你,你忘了阅读stderr。 他又忘了添加一行:
Process.Start() AddHandler Process.OutputDataReceived,lineOut As DataReceivedEventArgs) output += lineOut.Data + vbCrLf End Sub Process.BeginoutputReadLine() AddHandler Process.ErrorDataReceived,lineOut As DataReceivedEventArgs) output += lineOut.Data + vbCrLf End Sub Process.BeginErrorReadLine()
还有一个非常麻烦的问题,你的事件处理程序运行迟。 他们在这个过程已经退出之后开火。 这些处理程序在线程池线程上运行的副作用。 在使用输出变量之前,您需要等待一个任意的(不可估量的)时间量:
Do Application.DoEvents() Loop Until Process.HasExited System.Threading.Thread.Sleep(1000)
这太难看了 这样做, 任何 IDE或编辑器的方式。 将输出重定向到一个临时文件,然后读取文件:
Dim tempfile As String = System.IO.Path.GetTempFileName Using Process As New Process Process.StartInfo = New processstartinfo("cmd.exe") Process.StartInfo.Arguments = "/c make 1> """ + tempfile + """ 2>&1" Process.StartInfo.WorkingDirectory = "C:projectTest" Process.StartInfo.UseShellExecute = False Process.StartInfo.CreateNowindow = True Process.Start() Process.WaitForExit() output = System.IO.File.ReadAllText(tempfile) System.IO.File.Delete(tempfile) End Using
神秘的命令行的一些注释:
2>&1告诉cmd.exe将stderr重定向到stdout
三重双引号确保临时文件名中的空格不会造成麻烦。
同样的2>&1也会解决你原来的问题;)
错误通常写入StandardError流,您只能读取StandardOutput流。 为ErrorDataReceived事件添加事件处理程序,您应该看到错误。
AddHandler Process.ErrorDataReceived,lineOut As DataReceivedEventArgs) output += lineOut.Data + vbCrLf End Sub
像我这样的人,想知道为什么我们不能得到错误的流,在异步模式。 添加行
process.BeginErrorReadLine()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。