De programacion y otros demonios

martes, 24 de marzo de 2009

VB Net Capturar salida de un proceso: Ejemplo cambiar configuración de red

Capturar salida de un proceso: Ejemplo cambiar configuración de red

Inicio mi blog con esta entrada, una de las tantas cosas que he tenido que aprender por requerimientos de usuarios en mi trabajo J….. Necesitaban un programa en visual basic .net que ejecutara un archivo .bat que cambiara la configuración de la red según parámetros leídos de una bd en Access. Al principio intente con un comando sencillo:

Dim Sql as String = “comandos.bat ” + ip + " " + gw + " " + dns1 + " " + dns2

Shell(Path.GetFullPath(sql), AppWinStyle.MinimizedFocus, True)

Donde sql es el nombre de mi archivo .bat concatenado con los parametros de ejecución; es decir la configuración de la red.

Y qué maravilla!!.. funcionó, sin embargo cuando había un error el programa seguía ejecutándose y no le daba ningún aviso al usuario de que había ocurrido un error, además me mostraba una molesta ventana negra de comandos.

Por esto, preferí implementar la solución con el objeto System.Diagnostics.Process que me permite hacer manejo de errores, y poder ejecutarlo en modo “silencioso”; les explico:


Archivo .bat

netsh interface ip set address name="nombre_conexion" dhcp

netsh interface ip set address name="nombre_conexion" source=static addr=%1 mask=255.255.255.0

netsh interface ip set address name="nombre_conexion" gateway=%2 gwmetric=0

netsh interface ip set dns name="nombre_conexion" source=static addr=%3 register=PRIMARY

netsh interface ip add dns name="nombre_conexion" addr=%4 index=2

Código

Creo la función ejecutar_Shell que recibe la ruta del archivo, los parámetros, y un string donde se guardará el resultado de la ejecución para posteriormente mostrarla en un textbox.

Function ejecutar_Shell(ByVal arch_comandos As String, ByVal argumentos As String, ByRef stdOutput As String) As Integer

Try

Dim procID As Integer

Dim newProcCmd As System.Diagnostics.Process = New System.Diagnostics.Process



' La ejecución del shell se hace en modo "Silencioso" (no se muestra la ventana)

newProcCmd.StartInfo.FileName = Path.GetFullPath(arch_comandos)

newProcCmd.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden

‘Asi no muestra la ventana negra

newProcCmd.StartInfo.CreateNoWindow = True

'Para poder manipular la salida indicamos que no se ejecute el shell

newProcCmd.StartInfo.UseShellExecute = False

newProcCmd.StartInfo.Arguments = argumentos ‘Le paso los parámetros de ejecución

'Deseamos manipular la salida del proceso, para ello debemos establecer que se redirija la salida

newProcCmd.StartInfo.RedirectStandardOutput = True

newProcCmd.Start()

procID = newProcCmd.Id

newProcCmd.WaitForExit()



‘Debo saber si el proceso termino con exito o fallo

Dim procEC As Integer = -1

If newProcCmd.HasExited Then

procEC = newProcCmd.ExitCode

End If

'Leemos la salida (objeto StreamReader)

Dim sr As System.IO.StreamReader = newProcCmd.StandardOutput

stdOutput = sr.ReadToEnd()

sr.Close()

newProcCmd.Dispose()

Return procEC



Catch ex As Exception

MsgBox(":: Ha ocurrido un error ::" + Chr(13) + Chr(13) + _

"- No se pudo ejecutar el comando." + Chr(13) + Chr(13) + _

ex.ToString, MsgBoxStyle.Critical, "Error”)

End Try

End Function







 

Etiquetas:

2 comentarios:

Publicar un comentario



<< Inicio