2 Vb.NET Iniciar proceso y retorno de salida

pregunta creada en Sun, Mar 17, 2019 12:00 AM

Estoy intentando ejecutar algunos comandos de línea de comandos (masilla). Ahora puede ser que la línea de comando espere una entrada (el ejemplo más simple: la contraseña puede ser incorrecta). Toda la salida debe escribirse en la Consola.

Mi código muestra una línea de comando sin fin que no escribe nada en la consola.

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
    
- 1
2 Respuestas                              2                         

Como mencionó Stephen, no está imprimiendo nada en la consola, solo está escribiendo en el objeto StringBuilder. Así que tienes que imprimir el contenido del objeto StringBuilder en la consola para ver un resultado:

Console.WriteLine(processOutput)

Ejemplo de MSDN ver: https: //docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.outputdatareceived?view=netframework-4.7.2

    
0
2019-03-18 15: 55: 07Z

es porque no estás escribiendo nada para la consola o la interfaz de usuario. Debug.write no es lo mismo que console.write

Además, su función de delegado puede regresar después de 1 segundo. Un mejor paradigma usaría esperar.

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 /operator /await-operator

    
0
2019-03-18 14: 42: 39Z
fuente colocada aquí