vb. net CMD результат оболочки не приходит, пока CMD близко - PullRequest
1 голос
/ 18 апреля 2020

есть 2 текстовых поля и 1 кнопка

button1 = запуск процесса cmd
textbox1 = команда типа, которую вы хотите запустить на cmd
textbox2 = живые результаты процесса cmd

в этом случае я заменяю textbox1 на «ping www.google.com» & «ping www.facebook.com»
проблема в том, что .. результат не приходит, пока cmd близко
cmd не является автоматическим c закрыть .. я должен закрыть его сам

это мой код

Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Threading
Imports System.Windows
Public Class Form1

    Private Results As String
    Private Delegate Sub delUpdate()
    Private Finished As New delUpdate(AddressOf UpdateText)
    Dim myprocess As New Process
    Dim StartInfo As New System.Diagnostics.ProcessStartInfo

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        StartInfo.FileName = "cmd" 
        StartInfo.RedirectStandardInput = True
        StartInfo.RedirectStandardOutput = True
        StartInfo.UseShellExecute = False 
        StartInfo.CreateNoWindow = False
        myprocess.StartInfo = StartInfo
        myprocess.Start()

        Dim CMDThread As New Threading.Thread(AddressOf CMDAutomate)
        CMDThread.Start()
        myprocess.StandardInput.WriteLine("ping www.google.com")
        myprocess.StandardInput.WriteLine("ping www.facebook.com")
    End Sub

    Private Sub CMDAutomate()
        On Error Resume Next
        While myprocess.StandardOutput.EndOfStream = False
            Results = myprocess.StandardOutput.ReadToEnd.ToString()
            Invoke(Finished)
        End While
    End Sub

    Private Sub UpdateText()
        TextBox2.AppendText(System.Environment.NewLine() & Results)
        TextBox2.ScrollToCaret()
    End Sub

End Class

1 Ответ

1 голос
/ 18 апреля 2020

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

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