我正在尝试编写一个运行Perl脚本的VB .NET程序,并读取并使用标准输出。我希望能够在打印时单独处理每一行,并相应地更新我的程序显示。这里有一些我已经“编写”的代码(读作:“大部分是从网上复制的”):
Private WithEvents pscript As Process
Private Sub myProgram_Load(sender As Object, e As System.EventArgs) Handles Me.Load
pscript = New Process()
pscript.StartInfo.CreateNoWindow = True
pscript.StartInfo.FileName = "C:\perl64\bin\perl.exe"
pscript.StartInfo.Arguments = "C:\test.pl"
pscript.StartInfo.UseShellExecute = False
pscript.StartInfo.RedirectStandardOutput = True
pscript.StartInfo.RedirectStandardInput = True
AddHandler pscript.OutputDataReceived, AddressOf pscript_output_process
pscript.Start()
pscript.BeginOutputReadLine()
End Sub
Private Sub pscript_output_process(sender As Object, e As DataReceivedEventArgs)
MessageBox.Show(e.Data)
End Sub
这有一个问题:程序等待测试脚本运行完成,然后一个接一个地触发几个OutputDataReceived事件。这意味着当我使用真实脚本时,它很可能在几个小时内什么也不做,然后必须同时处理5,000个事件,尽管事情是以相当规律的间隔打印的整个时间。
有没有什么方法可以让它在写入时处理每一行文本,而不是在最后一次处理所有文本?
答案 0 :(得分:1)
我想通过从互联网上复制更多东西来解决这个问题。问题似乎出现在Perl中,它通常不会在每个print语句后刷新标准输出。我真的不知道最后一句话意味着什么,但无论如何,将行local $| = 1;
添加到脚本的顶部(这使得它自动刷新标准输出,根据我读过的网站)解决了这个问题。
答案 1 :(得分:0)
While (pscript.HasExited = False)
Dim sLine As String = pscript.StandardOutput.ReadLine
End While