Osp*_*rey 0 vb.net windows timer command-prompt
我在别处问过类似的问题,但也许我没有问过正确的方法,或者我不够清楚,所以我再问一次.
这是我想要的地方:
我一直在试图使用Process和StartInfo命令,但它们只运行应用程序并立即关闭进程.我需要保持dos框打开并继续读取dos应用程序添加到其中的任何新文本.我也遇到了这个似乎可以解决我的问题的线程,但它是在C#中我无法转换它:
我确实进入了打开命令提示符并启动应用程序的部分,但我不知道如何读取它不时地返回到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
Run Code Online (Sandbox Code Playgroud)
但我得到的只是空白的dos盒子.zbarcam应用程序运行正常,因为我可以看到相机预览,我也可以看到它检测到QR码,但文本没有显示在dos框中,_commandExecutor_OutputRead除非我关闭DOS框,否则不会触发sub.
那个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
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样调用它:
Dim output As String = ExecuteCommand("mycommand.exe", "")
Run Code Online (Sandbox Code Playgroud)
当然这会进行同步通话.如果您希望它以异步方式调用命令行并在事件完成时引发事件,那么这也是可能的,但需要更多编码.
如果你想异步地做它并且只是定期检查固定间隔的更多输出,例如,这是一个简单的例子:
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
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17192 次 |
| 最近记录: |