命令提示符批处理文件输出到VB文本框

时间:2015-08-12 13:47:43

标签: vb.net winforms batch-file command-prompt

我有许多批处理文件,我正试图围绕它们包装GUI,以便我的一些用户可以在一个地方轻松使用它们。

目前,我有2个按钮和一个文本框。每个按钮使用不同的工作目录调用相同的批处理文件(尽管在生产中,批处理文件将不同)。目前,它所做的就是调用'DIR / A / B'来列出目录内容。

DIR /A /B
exit

我有以下代码:(按钮2相同,但具有不同的工作目录)

Public Class Form1
Dim P As New Process
Dim SW As System.IO.StreamWriter

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    AddHandler P.OutputDataReceived, AddressOf DisplayOutput
    P.StartInfo.CreateNoWindow() = True
    P.StartInfo.UseShellExecute = False
    P.StartInfo.WorkingDirectory = "C:\temp"
    P.StartInfo.RedirectStandardInput = True
    P.StartInfo.RedirectStandardOutput = True
    P.StartInfo.RedirectStandardError = True
    P.StartInfo.FileName = "c:\temp\dircmd.cmd"
    P.Start()
    P.SynchronizingObject = TextBox1
    Try
        P.BeginOutputReadLine()
        TextBox1.Text = TextBox1.Text & vbCrLf & "Begin output" & vbCrLf
        SW = P.StandardInput
        SW.WriteLine()
        MsgBox("WriteLine()")
        SW.Dispose()
        SW.Close()
        MsgBox("StreamWriter Close")
        P.WaitForExit()
        P.CancelOutputRead()
        P.Close()
        MsgBox("Process Close")
    Catch ex As Exception
        MsgBox(ex.ToString())
    End Try
End Sub

Private Sub DisplayOutput(ByVal sendingProcess As Object, ByVal output As DataReceivedEventArgs)
    Textbox1.AppendText(output.Data() & vbCrLf)
End Sub

我的问题是我从每个命令获得输出,但它会重复。第一个按钮,第一次工作正常。第二个按钮工作,但一切都列出两次。回到第一个按钮,一切都列出3次。我最初认为我需要清除StreamWriter缓冲区,但它不重复旧信息,它只是重复新信息,我不知道为什么。

Begin output

C:\temp>DIR /A /B 
bob.txt
dircmd.cmd
LocationRouting.xml
TempFrogsareNOTCool.txt
Test.txt
test2.txt
Test3.txt

C:\temp>exit

Begin output 2

C:\>DIR /A /B 
C:\>DIR /A /B 
$Recycle.Bin
$Recycle.Bin
Config.Msi
Config.Msi
Documents and Settings  
Documents and Settings
<snip>

C:\>exit
C:\>exit

1 个答案:

答案 0 :(得分:0)

切换到使用Using构造来实例化和处理Process:

选项A:

        Using P As Process = New Process
            P.StartInfo.CreateNoWindow = True
            P.StartInfo.UseShellExecute = False
            P.StartInfo.WorkingDirectory = "C:\temp"
            P.StartInfo.RedirectStandardInput = True
            P.StartInfo.RedirectStandardOutput = True
            P.StartInfo.RedirectStandardError = True
            P.StartInfo.FileName = "c:\temp\dircmd.cmd"
            P.Start()
            Dim sOutput As String
            Using oStreamReader As System.IO.StreamReader = P.StandardOutput
                sOutput = oStreamReader.ReadToEnd()
            End Using
            OutputTextBox.Text = sOutput
            P.Close()

        End Using

选项B:

  Private Sub TestDirOutputButton_Click(sender As System.Object, e As System.EventArgs) Handles TestDirOutputButton.Click
        Using P As Process = New Process
            AddHandler P.OutputDataReceived, AddressOf DisplayOutput
            P.StartInfo.CreateNoWindow() = True
            P.StartInfo.UseShellExecute = False
            P.StartInfo.WorkingDirectory = "C:\temp"
            P.StartInfo.RedirectStandardInput = True
            P.StartInfo.RedirectStandardOutput = True
            P.StartInfo.RedirectStandardError = True
            P.StartInfo.FileName = "c:\temp\dircmd.cmd"
            P.Start()
            P.SynchronizingObject = OutputTextBox
            Try
                P.BeginOutputReadLine()
                OutputTextBox.Text = OutputTextBox.Text & vbCrLf & "Begin output" & vbCrLf
                SW = P.StandardInput
                SW.WriteLine()
                MsgBox("WriteLine()")
                SW.Dispose()
                SW.Close()
                MsgBox("StreamWriter Close")
                P.WaitForExit()
                P.CancelOutputRead()
                P.Close()
                MsgBox("Process Close")
            Catch ex As Exception
                MsgBox(ex.ToString())
            End Try
            RemoveHandler P.OutputDataReceived, AddressOf DisplayOutput
        End Using

    End Sub