Capturar salida de un proceso: Ejemplo comandos básicos (ping, tracert, cmd /?, etc)

Más de una vez quisimos llamadar a un .bat y recuperar la salida para visualizarla desde una página, con ASP.NET 2.0 tenemos metodos que nos facilitan la vida.
Como me dedique a leer un poco quise dejarlo por aquí, por si alguien lo necesita.

Siempre empezamos con un ejemplo bien pero bien básico para ir creciendo, y poder realizar las tareas que realmente necesitamos. En este caso empezamos con un ping y luego seguimos con un tracert a geeks.ms y una ayuda de cmd.exe /?

Código

Private Sub Ejecutar()
      Dim strArgumentos As String = "127.0.0.1"
      Dim strExe As String = "ping"

      'Armar el proceso a ejecutar
      Dim startInfo As System.Diagnostics.ProcessStartInfo = New System.Diagnostics.ProcessStartInfo(strExe, strArgumentos)

      'Para poder manupular la salida indicamos que no se ejecute el shell
      startInfo.UseShellExecute = False

      'Por definicion (o mejor dicho codificacion) debemos ajustarnos a los que nos dice "San MSDN" 
      '(...)UseShellExecute debe ser true si se desea establecer ErrorDialog en true(...)
      startInfo.ErrorDialog = False

      'Sin ventana...
      startInfo.CreateNoWindow = True

      'Deseamos manipular la salida del proceso, para ello debemos establecer que se redirija la salida
      startInfo.RedirectStandardOutput = True

      Try
          Dim p As Diagnostics.Process = System.Diagnostics.Process.Start(startInfo)

          'Leemos la salida (objeto StreamReader)
          Dim sr As System.IO.StreamReader = p.StandardOutput
          Dim cadenaSalida As String = sr.ReadToEnd()
          sr.Close()

          'La visualizamos en el textbox. Un ejemplo basico ;)...
          TextBox1.Text = cadenaSalida
      Catch ex As Exception
          TextBox1.Text = (ex.Message)
      End Try


  End Sub

 

Ejemplo 1: Ping

Comando: “ping 127.0.0.1”

Dim strArgumentos As String = "127.0.0.1"
Dim strExe As String = "ping"

image

Y en la salida capturada y visualizada en el Textbox

image

 

Ejemplo 2: Tracert

Comando: “tracert www.geeks.ms”

Dim strArgumentos As String = "www.geeks.ms"
Dim strExe As String = "tracert"

image

Salida capturada

image

 

Ejemplo 3: Ayuda de cmd.exe /?

Comando: “cmd.exe /?”

Dim strArgumentos As String = "/?"
Dim strExe As String = "cmd.exe"

image

Y en la salida capturada y visualizada en el Textbox

image

 

Hasta aquí llego el ejemplo básico, espero sea la base para otras necesidades.
Como podemos capturar la salida del proceso, podremos manipularla/filtrarla a nuestro antojo.

 

Enlaces

  • Process.Start (Método) (ProcessStartInfo)
    Inicia el recurso de proceso que se especifica mediante el parámetro que contiene la información de inicio del proceso (por ejemplo, el nombre de archivo del proceso que se va a iniciar) y asocia el recurso a un nuevo componente Process.
  • ProcessStartInfo.UseShellExecute (Propiedad)
    Obtiene o establece un valor que indica si se va a usar el shell del sistema operativo para iniciar el proceso.
    • (…)Si se establece esta propiedad en false, es posible redirigir las secuencias de entrada, salida y error (…)
    • (…)El valor de UseShellExecute debe ser true si se establece el valor de la propiedad ErrorDialog en true.(…)
  • ProcessStartInfo.ErrorDialog (Propiedad)
    Obtiene o establece un valor que indica si se va a mostrar un cuadro de diálogo de error al usuario si el proceso no se puede iniciar.
    • nuevamente: (…)UseShellExecute debe ser true si se desea establecer ErrorDialog en true(…)
  • ProcessStartInfo.CreateNoWindow (Propiedad)
    Obtiene o establece un valor que indica si el proceso se va a iniciar en una nueva ventana.
  • ProcessStartInfo.RedirectStandardOutput (Propiedad)
    Obtiene o establece un valor que indica si el resultado de una aplicación se escribe en la secuencia de Process.StandardOutput.
    • (…)Cuando un Process escribe texto en la secuencia estándar, dicho texto se muestra normalmente en la consola. Si se redirige la secuencia de StandardOutput, se puede manipular o suprimir el resultado de un proceso(…)
    • (…)Es preciso establecer el valor de UseShellExecute en false si se desea establecer el valor de RedirectStandardOutput en true. De lo contrario, al leer la secuencia de StandardOutput, se produce una excepción.(…)
  • Process.StandardOutput (Propiedad)
    Obtiene una secuencia utilizada para leer la salida de la aplicación.

8 comentarios en “Capturar salida de un proceso: Ejemplo comandos básicos (ping, tracert, cmd /?, etc)”

  1. Una question.

    Yo empleaba esto,para realizar un rsh.
    Ahora en lugar de emplear un rsh, tengo que emplear un cliente ssh. Empleo el plink y resulta que si desde un cmd de DOS ejecuto el plink no hay ningún problema en ejecutarse. Sin embargo si lo ejecuto desde el programa, no se ejecuta. Se abre la ventana del plink pero no se ejecutan los comandos.

    Sabes que es lo que puede estar pasando.

  2. Hola Jose Luis, no he utilizado plink me imagino que es algo parecido a rexec de windows?
    Si puedes postear un ejemplo o enviarme para testear te agradeceria.
    Se ejectua el comando que envias?
    Porque si tiene una salida tendrias que capturala.

  3. disculpa tengo una pregunta puedo hacer con un archivo de tipo cmd de alguna forma cuando este se ejecuta podria visualizar y utilizar lo que este me envia a ejecutar?

  4. Hola, gracias por el ejemplo, me ha servido de ayuda, mi intención es ejecutar un fichero batch, ¿existe la posibilidad usando este método de monitorizar la salida de la ventana ms-dos en tiempo real, o que se actualice el textbox cada cierto tiempo, aunque no haya finalizado la ejecución del batch?

    por ejemplo, ¿actualizar los datos del textbox linea a linea?

    Saludos, y gracias anticipadas

  5. Excelente,
    Tengo una aplicación que se conecta a otro equipo especificando el nombre de usuario y la contraseña. Eso lo hago con el comando D.O.S.
    NET USE. Y con esto me funciona OK

  6. Muy buen código, permiteme felicitarte por ello ya q uso parte de el para una aplicacion q estoy haciendo, solo q tengo una duda q me surgio al estar corriendo la apl, es la siguiente:

    Yo en lugar de poner “ping” pongo otro comando de un programa q instale pra las redes y q se ejecuta desde el cmd de windows, solo q al poner un comando SIN ESPACIOS todo va bien y al momento de poner un comando CON ESPACIOS me genera un error diciendo q el sistema no encuentra el archivo especificado, podras ayudarme con esto, sabras de alguna forma de q me tome los espacios y los ejecute el cmd?

    de antemano muchas gracias.

    Saludos coordiales

  7. ME PUEDES AYUDAR, TENGO QUE HACER UNA SENCILLA APLICACION DE ENVIAR 5 PING A MAQUINAS PARA SABER EL MOMENTO QUE SE PERDIO EL ENLACE UNA, UN BOTON QUE ENVIE E INICIE EL PING QUE ESTA EN UNA CAJA DE TEXTO EN VISUAL BASIC

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *