阅读和写作使用到命令提示符控制台VB.net(Reading and writing to a co

2019-06-26 07:22发布

我曾问过类似的问题在其他地方,但也许我没有问正确的方式或我不太清楚,所以我再次问。

这就是我想:

  1. 打开Windows命令提示
  2. 通过运行一个DOS命令一个DOS应用程序
  3. 阅读是在DOS框中显示返回的文本,并将其显示在我的窗户形式的文本框中。 这需要定期(比如说,每秒)以及DOS窗口不应该关闭重复。

我一直转圈圈试图使用进程和StartInfo的命令,但他们只运行应用程序并关闭进程的时候了。 我需要保持DOS窗口打开,请继续阅读由DOS应用程序添加到任何新的文本。 我也碰到这个线程,似乎回答我的问题,但它是在C#中,我无法将其转换:

阅读Windows命令提示符STDOUT

我没去,我打开命令提示符并获得应用程序启动的一部分,但我不知道怎么看,它每一个现在,然后返回到DOS窗口控制台的数据。 我要不断地检查是否有改变,这样我可以对他们采取行动,或许使用定时器控制。

请帮忙。

谢谢!

我跑这是好心由Stevedog提供的代码,并用它是这样的:

  Private WithEvents _commandExecutor As New CommandExecutor()

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    _commandExecutor.Execute("c:\progra~2\zbar\bin\zbarcam.exe", "")
  End Sub

  Private Sub _commandExecutor_OutputRead(ByVal output As String) Handles _commandExecutor.OutputRead
    txtResult.Text = output
  End Sub

但是,所有我得到的是空白的DOS窗口。 该zbarcam应用程序运行正常,因为我可以看到摄像头预览,我也可以把它检测QR码,但文本不是在DOS窗口显示和_commandExecutor_OutputRead子没有被触发,除非我关闭DOS窗口。

Answer 1:

那C#示例是不好的,因为它没有说明如何实际读取标准输出流。 创建这样的方法:

Public Function ExecuteCommand(ByVal filePath As String, ByVal arguments As String) As String
    Dim p As Process
    p = New Process()
    p.StartInfo.FileName = filePath
    p.StartInfo.UseShellExecute = False
    p.StartInfo.RedirectStandardInput = True
    p.StartInfo.RedirectStandardOutput = True
    p.Start()
    p.WaitForExit()
    Return p.StandardOutput.ReadToEnd()
End Function

然后,你可以这样调用:

Dim output As String = ExecuteCommand("mycommand.exe", "")

当然,这使得同步调用。 如果你想让它异步调用的命令行,只是引发一个事件是完成时,这也是可能的,但需要多一点的编码。

如果您希望异步做到这一点,只是定期检查保持对一个固定的时间间隔更多的输出,例如,这里有一个简单的例子:

Public Class CommandExecutor
    Implements IDisposable

    Public Event OutputRead(ByVal output As String)

    Private WithEvents _process As Process

    Public Sub Execute(ByVal filePath As String, ByVal arguments As String)
        If _process IsNot Nothing Then
            Throw New Exception("Already watching process")
        End If
        _process = New Process()
        _process.StartInfo.FileName = filePath
        _process.StartInfo.UseShellExecute = False
        _process.StartInfo.RedirectStandardInput = True
        _process.StartInfo.RedirectStandardOutput = True
        _process.Start()
        _process.BeginOutputReadLine()
    End Sub

    Private Sub _process_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles _process.OutputDataReceived
        If _process.HasExited Then
            _process.Dispose()
            _process = Nothing
        End If
        RaiseEvent OutputRead(e.Data)
    End Sub

    Private disposedValue As Boolean = False
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                If _process IsNot Nothing Then
                    _process.Kill()
                    _process.Dispose()
                    _process = Nothing
                End If
            End If
        End If
        Me.disposedValue = True
    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
End Class

然后,你可以使用它像这样:

Public Class Form1
    Private WithEvents _commandExecutor As New CommandExecutor()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        _commandExecutor.Execute("D:\Sandbox\SandboxSolution\ConsoleCs\bin\Debug\ConsoleCs.exe", "")
    End Sub

    Private Sub _commandExecutor_OutputRead(ByVal output As String) Handles _commandExecutor.OutputRead
        Me.Invoke(New processCommandOutputDelegate(AddressOf processCommandOutput), output)
    End Sub

    Private Delegate Sub processCommandOutputDelegate(ByVal output As String)
    Private Sub processCommandOutput(ByVal output As String)
        TextBox1.Text = output
    End Sub

    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        _commandExecutor.Dispose()
    End Sub
End Class


Answer 2:

当谈到事件的转换器通常会失败。


的直接转换的代码将如下所示:

Dim proc as Process

Sub RunApp
    proc = new Process()
    proc.StartInfo.FileName = "your_app.exe"
    proc.StartInfo.Arguments = ""
    proc.StartInfo.UseShellExecute = false
    proc.StartInfo.RedirectStandardInput = true
    proc.StartInfo.RedirectStandardOutput = true
    AddHandler proc.OutputDataReceived, AddressOf InterProcOutputHandler
    proc.Start()
    proc.WaitForExit()
End Sub

Sub InterProcOutputHandler(sendingProcess as object, outLine as DataReceivedEventArgs)
    'Read data here

    'Send command if necessary
    proc.StandardInput.WriteLine("your_command")
End Sub

proc.OutputDataReceived不是财产,而是一个事件 。

要订阅事件,在C#使用event += handler ,而在VB.NET你使用AddHandler event, AddressOf handler



文章来源: Reading and writing to a command prompt console using VB.net