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: net
2 comentarios:
Muy bueno, gracias.
De Anónimo, A las 14 de noviembre de 2011, 16:38
Este comentario ha sido eliminado por el autor.
De Alberto Garcia, A las 4 de agosto de 2016, 6:40
Publicar un comentario
<< Inicio