VB.Net之ProcessStartInfo对象应用:启动外部DOS程序,并实时获取运行信息

来源:互联网 发布:linux启动ssh服务 编辑:程序博客网 时间:2024/04/28 15:26

在传统VB程序中,你可以使用Shell函数启动一个应用程序。当你传送一个数据文件名的时候,VB在相应应用程序中打开这个数据文件。你可以使用一个任选的windowstyle参数控制所启动的应用程序的窗口方式。例如,在VB6中,下面这行代码将启动默认的文本编辑器(通常是记事本)并打开文件”D:\run.txt”:

returnID = Shell("D:\run.txt", vbNormalFocus)

在VB.NET中仍然能够使用Shell功能,并且它已经被做了一些改动,但在.NET框架中它并不是启动应用程序的最好的方法,因为Shell函数有一些严格的限制条件,特别是对外部程序的输入输出控制完全无能为力。而使用System.Diagnostics命名空间中的Process类来启动外部程序,可以简单的使用共享的 Process.Start方法启动一个新的过程,把一个可执行文件名或者可执行应用程序的扩展关联文件名作为参数传输给它。例如,下面的代码启动”D:\run.txt”文件:

System.Diagnostics.Process.Start("D:\run.txt")

ProcessStartInfo类是 Process 组件的一部分,使用 Process 类启动进程时,可以访问附加到当前运行进程时可用的进程信息之外的进程信息,可以使用 ProcessStartInfo 类来更好地控制您启动的进程。最吸引我们的是:通常,标准输入方式为键盘,标准输出和标准错误是显示在监视器屏幕上。然而,我们通过ProcessStartInfo类可以使用 RedirectStandardInput、RedirectStandardOutput 和RedirectStandardError 属性使进程从文件或其他设备获取输入,或者向文件或其他设备返回输出。

下面用一个实例说明,在窗体上放置一个多行文本框,两个按钮,一个Process控件(工具箱的组件面板里面有),名字都为缺省,代码如下:

Public Class Form1    Private _process As Process = Nothing    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        '启动cmd.exe 无限输出ping localhost的结果。        Dim psi As New ProcessStartInfo()        psi.FileName = "cmd.exe"        psi.Arguments = " /c ping localhost /t"        psi.UseShellExecute = False        psi.RedirectStandardOutput = True        psi.CreateNoWindow = True        _process = New Process()        _process.StartInfo = psi        ' 定义接收消息的Handler        AddHandler _process.OutputDataReceived, New DataReceivedEventHandler(AddressOf Process1_OutputDataReceived)        _process.Start()        ' 开始接收        _process.BeginOutputReadLine()    End Sub    Private Delegate Sub AddMessageHandler(ByVal msg As String)    Private Sub Process1_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles Process1.OutputDataReceived        Dim handler As AddMessageHandler = Function(msg As String)                                               Me.TextBox1.Text += msg + Environment.NewLine                                               Me.TextBox1.[Select](Me.TextBox1.Text.Length - 1, 0)                                               Me.TextBox1.ScrollToCaret()                                           End Function        If Me.TextBox1.InvokeRequired Then            Me.TextBox1.Invoke(handler, e.Data)        End If    End Sub    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        _process.CancelOutputRead()        _process.Close()    End Sub    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        Me.TextBox1.HideSelection = False    End SubEnd Class

Ping指令获取返回值

参考:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo(VS.80).aspx

0 0
原创粉丝点击