Título: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 00:08 am Hola a todos, regreso despues de muchos años a este gran foro.
Tengo unos problemillas con un pequeño script en Batch, les explico en que consiste. Tengo instalado un agente VPN el cual manualmente me puedo conectar y desconectar dandole doble click. Al realizar este evento se ejecuta un proceso "X". Lo que necesito es que al desconectarse se vuelva a conectar automaticamente, para esto he creado un bucle: Código Aqui evaluo si el proceso openvpn.exe se encuentra ejecutandose, en el caso que no cierro el programa y lo vuelvo abrir para que se reconecte pero al abrir el programa en la ventana MS-DOS el bucle se queda paralizado, la verdad soy novato en programacion en batch, espero que me puedan ayudar. Gracias de ante mano. Título: Re: BATCH - Problema en bucle infinito Publicado por: Eleкtro en 21 Septiembre 2016, 09:09 am Código El problema está ahí, estás evaluando el texto "ERRORLEVEL", no el valor de la variable dinámica %ERRORLEVEL%. Si comparas el texto "ERRORLEVEL" con "1", obviamente el resultado será negativo puesto que son distintos. Solución, añádele los símbolos % que faltan en el nombre de la variable: Código Aparte de eso, no es conveniente que hagas esto: Código Si le hubieses llegado a asignar un valor, entonces habrías sustituido la variable dinámica ERRORLEVEL durante el tiempo de vida de tu script, y jamás podría haber dado como resultado el valor "1", sino el valor que tu le hubieses asignado. En resumen, elimina esa linea para no caer en malas costumbres, no debes redeclarar variables dinámicas puesto que no tiene sentido hacerlo. Saludos Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 16:52 pm Lo he modificado y aun no me funciona del todo bien. Creo saber la solucion pero no se como hacerlo ya que no domino este lenguaje, solo una consulta mi estimado.
Como puedo volver a reutilizar la variable ERRORLEVEL o como puedo crear otro, he probado almacenando el valor de ERRORLEVEL en una variable pero se me dificulta mucho ! Código Esto es lo que quiero hacer pero no entra al if anidado o mejor dicho al if del proceso openvpn-gui.exe. Esto funciona asi: openvpn-gui.exe= proceso de la interfaz del agente vpn openvpn.exe= proceso de la CONEXION del vpn. Cuando se ejecuta el proceso OPENVPN-GUI se tiene que conectar la vpn, click derecho y conectar, al hacer este evento o sea al establecer la conexion se ejecuta automaticamente el proceso OPENVPN, lo que primero quiero hacer es dar a imprimir si se esta ejecutando o no los dos procesos para luego añadirle el codigo que necesito. Ayudame porfavor !!!de todos modos seguite intentando, gracias !! Creo que ahora se entendera un poco mejor mi codigo. Código Pero no entra al if del proceso openvpn.exe :( iluminame !! que estoy haciendo mal :( Di un pasito mas xD Cuando imprimo ERROLEVEL, echo %ERRORLEVEL%, porque me imprime 0 cuando el proceso esta cerrado ? :( Título: Re: BATCH - Problema en bucle infinito Publicado por: Eleкtro en 21 Septiembre 2016, 17:26 pm Primero de nada, esto es un foro donde hay unas reglas de redacción, no importa la experiencia que tengas, si algo has de saber es formatear el código que publiques, usa las etiquetas GeShi.
Por favor, no pidas por mensajes privados que leamos tu post, por más que lo hagas yo no lo voy a leer antes ni después, sinó en su momento. EDITO: También está prohibido hacer doble y triple post, USA EL BOTÓN MODIFICAR. Por favor, no me des más trabajo, escribe un post como Dios manda. Como puedo volver a reutilizar la variable ERRORLEVEL o como puedo crear otro, he probado almacenando el valor de ERRORLEVEL en una variable pero se me dificulta mucho ! La variable %ERRORLEVEL% es un valor dinámico que cambia cada vez que termina la ejecución de un comando/executable, se asigna el código de salida a dicha variable dinámica. No necesitas (ni tampoco podrías) crear una variable que cumpla su misma función, puedes reutilizar la variable %ERRORLEVEL% las veces que quieras, no se va a gastar :xD. no entra al if anidado if %ERRORLEVEL% EQU 1 ( ) else if ... Batch es un lenguaje MUY limitado, simplemente no es posible reproducir una sentencia Else If de manera convencional, así que esa anidación de Ifs no te funcionará. Batch está limitado a poder usar una sentencia If y un AND, y este último debemos usarlo de forma invisible... Te aconsejo que modifiques ese código que has escrito, sigue la siguiente estructura y no tendrás por que obtener errores: Código Saludos Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 17:33 pm Primero de nada, esto es un foro donde hay unas reglas de redacción, no importa la experiencia que tengas, si algo has de saber es formatear el código que publiques, usa las etiquetas GeShi. Por favor, no pidas por mensajes privados que leamos tu post, por más que lo hagas yo no lo voy a leer antes ni después, sinó en su momento. EDITO: También está prohibido hacer doble y triple post, USA EL BOTÓN MODIFICAR. Por favor, no me des más trabajo, escribe un post como Dios manda. La variable %ERRORLEVEL% es un valor dinámico que cambia cada vez que termina la ejecución de un comando/executable, se asigna el código de salida a dicha variable dinámica. No necesitas (ni tampoco podrías) crear una variable que cumpla su misma función, puedes reutilizar la variable %ERRORLEVEL% las veces que quieras, no se va a gastar :xD. Batch es un lenguaje MUY limitado, simplemente no es posible reproducir una sentencia Else If de manera convencional, así que esa anidación de Ifs no te funcionará. Batch está limitado a poder usar una sentencia If y un AND, y este último debemos usarlo de forma invisible... Te aconsejo que modifiques ese código que has escrito, sigue la siguiente estructura y no tendrás por que tener errores: Código Saludos Jaja disculpa las incomodidades !! Entiendo que Batch sea limitado pero no pense que seria tan limitadi como para no funcionar un if anidado. En tal caso, como haria para poder evaluar otro proceso ??? En tu codigo estoy evaluando a openvpn-gui pero tambien necesito evaluar a openvpn :( :( :( Se puede hacer en Batch? :( Título: Re: BATCH - Problema en bucle infinito Publicado por: Eleкtro en 21 Septiembre 2016, 17:49 pm Se puede hacer, por supuesto, con una correcta anidación de Ifs (esto es, meter un If dentro de otro, nada de usar Else If, eso ya ha quedado claro que no es posible), pero queda muy feo.
Si quieres comprobar si ambos procesos se encuentran activos al mismo tiempo, para no enbrutecer demasiado el código resultante podrías hacerlo de la siguiente manera: Código Lo que hago es declarar una variable "exitCodeCount" que servirá para determinar si ambos procesos están activos basándose en la suma de los códigos de salida de las subrutinas "CheckGUI" y "CheckCLI", si ambas llamadas a "CheckGUI" y "CheckCLI" devuelven "0" (0+0) entonces significa que ambos están activos, si devuelve "1" (0+1), que uno de los procesos se encuentra inactivo, y si devuelve "2" (1+1) significa que ningún proceso está activo. Saludos! Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 18:09 pm Se puede hacer, por supuesto, con una correcta anidación de Ifs (esto es, meter un If dentro de otro, nada de usar Else If, eso ya ha quedado claro que no es posible), pero queda muy feo. Si quieres comprobar si ambos procesos se encuentran activos al mismo tiempo, para no enbrutecer demasiado el código resultante podrías hacerlo de la siguiente manera: Código Lo que hago es declarar una variable "exitCodeCount" que servirá para determinar si ambos procesos están activos basándose en la suma de los códigos de salida de las subrutinas "CheckGUI" y "CheckCLI", si ambas llamadas a "CheckGUI" y "CheckCLI" devuelven "0" (0+0) entonces significa que ambos están activos, si devuelve "1" (0+1), que uno de los procesos se encuentra inactivo, y si devuelve "2" (1+1) significa que ningún proceso está activo. Saludos! Muchas gracias amigo !!! pero el problemilla es que tengo que saber exactamente cual de los dos procesos esta abierto y/o esta cerrado :( @echo off :bucle tasklist | findstr openvpn-gui.exe set /a indOPENVPN= %ERRORLEVEL% if %indOPENVPN% EQU 1 ( echo.interfazClose tasklist | findstr openvpn.exe echo %ERRORLEVEL% if %ERRORLEVEL% EQU 1 ( echo.conexionClose )else ( echo.conexionOpen ) ) else ( echo.interfazOpen ) goto bucle Mira te explico, en mi codigo en el if anidado si esta entrando ! pero no entiendo porque ERRORLEVEL me arroga el valor 0 si el proceso esta cerrado pero cuando abro la conexion no me imprime ni 0 ni nada ! :( :( :( :( Título: Re: BATCH - Problema en bucle infinito Publicado por: Eleкtro en 21 Septiembre 2016, 18:30 pm ¿Qué hemos hablado de publicar correctamente un código?, modifica ese código y entonces te responderé... si no lo hace otra persona antes.
...de todas formas, en el último código que te mostré, tienes dos funciones que devuelven 0 o 1 (False o True) cada una dependiendo de si un programa y el otro se encuentran, eso debería bastarte para que puedas comprender como podrías adaptar el código a tus necesidades, es muy sencillo, lo único que necesitas hacer es comprobar el valor de la variable exitCodeCount (o %ERRORLEVEL%). Saludos Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 18:33 pm ¿Qué hemos hablado de publicar correctamente un código?, hazlo y entonces te responderé... si no lo hace otra persona antes. Saludos No se como hacerlo :'( con que opcion lo hago ? Título: Re: BATCH - Problema en bucle infinito Publicado por: Eleкtro en 21 Septiembre 2016, 18:52 pm No se como hacerlo :'( con que opcion lo hago ? Con este: (http://i.imgur.com/rOV6fA5.png) En fin, te explico... Tomando como base el código que mostré, puedes determinar de forma individual el estado de cada proceso de la siguiente manera: Código Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 19:08 pm Con este: Estimado Elektro, la parte del codigo ya lo hice ;-) necesito mostrartelo para que me ayudes verificando si esta bien. Lo que nose es como hace para que mi codigo se vea como el tuyo cuando lo publicas :( :( o sea con ese marco(http://i.imgur.com/rOV6fA5.png) En fin, te explico... Tomando como base el código que mostré, puedes determinar de forma individual el estado de cada proceso de la siguiente manera: Código Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 19:20 pm Código
Ya esta ;-) Este programa me monitorea a la perfeccion ambos procesos, aqui te mando lo que en realidad quiero hacer: Código
Creo que se entiende a la perfeccion, el problema es que cuando openvpn-gui esta cerrado, ejecucto el script, abre ambos procesos sin ningun problema ! el problema es que cuando desconecto o sea cuando se ejecuta openvpn, el programa se queda ahi pasmado, como si el bucle se hubiera detenido y cuando cierro openvpn-gui el programa lo vuelve a abrir, eso esta perfecto ! pero se sigue quedando ahi pasmado como si no fuera un bucle :/ Ayudameee porfavor :( :( :( :( :( PSDT: Código
Aqui esta el problema, entra al else solo cuando abro el batch pero luego cuando desconecto manualmente el vpn ya no vuelve a conectar. Revise con el comando tasklist en cmd y si abre el proceso openvpn cuando abro la conexion y el proceso desaparece o se cierra cuando cierro la conexion. Alguna explicacion?? iluminamee porfavor :( :( PSDT: Perdon por modificar 2 veces ;-) Título: Re: BATCH - Problema en bucle infinito Publicado por: llAudioslavell en 21 Septiembre 2016, 19:30 pm Perdonnn, ya logre conseguirlo ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) Muchisimas graciass Elektroo Te amooooooo :'( :'( :'( Graciasssssssssssssssss
|