Читать вывод процесса консоли - PullRequest
4 голосов
/ 03 апреля 2012

Я пытаюсь прочитать полное содержимое процесса консоли (через 3 секунды) с кодом ниже:

Dim NewProcess As New System.Diagnostics.Process()
With NewProcess.StartInfo
    .FileName = EXE_PATH
    .RedirectStandardOutput = True
    .RedirectStandardError = True
    .RedirectStandardInput = True
    .UseShellExecute = False
    .WindowStyle = ProcessWindowStyle.Normal
    .CreateNoWindow = False 
End With

NewProcess.Start()

System.Threading.Thread.Sleep(3000)

MsgBox(NewProcess.StandardOutput.ReadToEnd)

Однако приложение, похоже, делает паузу при попытке «ReadToEnd», я думаю, это потому, что консольный процесс является непрерывным выводом и никогда не завершится. ReadLine отлично работает, но получает только первую строку, но мне нужно все содержимое консоли на этом этапе.

Как мне решить эту проблему?

Ответы [ 2 ]

6 голосов
/ 03 апреля 2012

Я бы попытался использовать событие Process.OutputDataReceived для асинхронного чтения вывода.

См .: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx#Y242

Private Shared processOutput As StringBuilder = Nothing

Public Shared Sub StartSomeProcess()
processOutput = new StringBuilder()
Dim NewProcess As New System.Diagnostics.Process()
With NewProcess.StartInfo
    .FileName = EXE_PATH
    .RedirectStandardOutput = True
    .RedirectStandardError = True
    .RedirectStandardInput = True
    .UseShellExecute = False
    .WindowStyle = ProcessWindowStyle.Normal
    .CreateNoWindow = False 
End With

' Set our event handler to asynchronously read the sort output.
AddHandler NewProcess.OutputDataReceived, AddressOf OutputHandler
NewProcess.Start()
NewProcess.BeginOutputReadLine()
NewProcess.WaitForExit()
MsgBox(processOutput.ToString())
End Sub

Private Shared Sub OutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)    
         ' Collect the sort command output.
         If Not String.IsNullOrEmpty(outLine.Data) Then    
            ' Add the text to the collected output.
            processOutput.AppendLine(outLine.Data)
         End If
      End Sub 
3 голосов
/ 29 декабря 2013

'Для захвата вывода и ошибки

    AddHandler NewProcess.OutputDataReceived, AddressOf OutputHandler
    AddHandler NewProcess.ErrorDataReceived, AddressOf OutputHandler

    NewProcess.Start()
    NewProcess.BeginOutputReadLine()
    NewProcess.BeginErrorReadLine()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...