Vb.NET запускает процесс и возвращает результат - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь выполнить некоторые команды командной строки (замазка). Теперь может случиться так, что командная строка ожидает ввода (самый простой пример: пароль может быть неправильным). Весь вывод должен быть записан в консоль.

Мой код отображает бесконечную командную строку, которая ничего не записывает в консоль.

Imports System.Text

Public Class Form1
    Private Shared processOutput As StringBuilder = Nothing
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim line As String = "/c plink -ssh chef@192.168.178.35 -pw 12345678 -m C:\putty\pw\putty.txt"
        processOutput = New StringBuilder()
        Dim objP As New System.Diagnostics.Process()
        Dim objPi As ProcessStartInfo = New ProcessStartInfo()
        With objPi
            .FileName = "cmd.exe"
            .Arguments = line
            .RedirectStandardOutput = True
            .RedirectStandardError = True
            .RedirectStandardInput = True
            .UseShellExecute = False
            .WindowStyle = ProcessWindowStyle.Hidden
            .CreateNoWindow = False
        End With
        objP.StartInfo = objPi

        AddHandler objP.OutputDataReceived, AddressOf OutputHandler
        objP.Start()
        objP.BeginOutputReadLine()
        objP.WaitForExit(1000)
        Debug.WriteLine(processOutput.ToString())
    End Sub

    Private Shared Sub OutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
        If Not String.IsNullOrEmpty(outLine.Data) Then
            processOutput.AppendLine(outLine.Data)
        End If
    End Sub


End Class

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Как уже упоминал Стивен, вы ничего не выводите на консоль, а только записываете в объект StringBuilder. Таким образом, вы должны напечатать содержимое объекта StringBuilder на консоль, чтобы увидеть результат:

Console.WriteLine(processOutput)

MSDN пример см .: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.outputdatareceived?view=netframework-4.7.2

0 голосов
/ 18 марта 2019

это потому, что вы ничего не пишете в консоль или пользовательский интерфейс.Debug.write отличается от console.write

Кроме того, функция делегата может возвращаться через 1 секунду.Лучшая парадигма будет использовать await.

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click  
    ' Call the method that runs asynchronously.  
    Dim result As String = Await WaitAsynchronouslyAsync()  

    ' Call the method that runs synchronously.  
    'Dim result As String = Await WaitSynchronously()  

    ' Display the result.  
    TextBox1.Text &= result  
End Sub  

' The following method runs asynchronously. The UI thread is not  
' blocked during the delay. You can move or resize the Form1 window   
' while Task.Delay is running.  
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)  
    Await Task.Delay(10000)  
    Return "Finished"  
End Function  

' The following method runs synchronously, despite the use of Async.  
' You cannot move or resize the Form1 window while Thread.Sleep  
' is running because the UI thread is blocked.  
Public Async Function WaitSynchronously() As Task(Of String)  
    ' Import System.Threading for the Sleep method.  
    Thread.Sleep(10000)  
    Return "Finished"  
End Function

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/await-operator

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