elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  BATCH - Problema en bucle infinito
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: BATCH - Problema en bucle infinito  (Leído 7,260 veces)
llAudioslavell

Desconectado Desconectado

Mensajes: 177


Ver Perfil
BATCH - Problema en bucle infinito
« 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
  1. @echo off
  2. :bucle
  3.  
  4. tasklist | findstr openvpn.exe
  5.  
  6. if ERRORLEVEL == 1 (
  7. taskkill /IM openvpn-gui.exe
  8. "C:\Program Files (x86)\Sophos\Sophos SSL VPN Client\bin\openvpn-gui.exe" --connect xxxxxxxx@xxxxxxxxxx.xxxx.ovpn
  9. )
  10.  
  11. goto bucle

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.


« Última modificación: 21 Septiembre 2016, 08:56 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #1 en: 21 Septiembre 2016, 09:09 am »

Código
  1. if ERRORLEVEL == 1 (...)

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
  1. If "%ERRORLEVEL%" EQU "1" (...)



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


« Última modificación: 21 Septiembre 2016, 09:13 am por Eleкtro » En línea

llAudioslavell

Desconectado Desconectado

Mensajes: 177


Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #2 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
  1. @echo off
  2. :bucle
  3.  
  4. tasklist | findstr openvpn-gui.exe
  5.  
  6. if %ERRORLEVEL% EQU 1 (
  7.        echo.el proceso openvpn-gui esta cerrado
  8. tasklist | findstr openvpn.exe
  9. if %ERRORLEVEL% EQU 0 (
  10. echo.el proceso openvpn esta abierto
  11. )else if %ERRORLEVEL% EQU 1 (
  12.  
  13. echo. el proceso openvpn esta cerrado
  14. )
  15. ) else if %ERRORLEVEL% EQU 0 (
  16.         echo.el proceso openvpn-gui esta abierto
  17. )
  18.  
  19.  
  20. goto bucle

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
  1. @echo off
  2. :bucle
  3.  
  4. tasklist | findstr openvpn-gui.exe
  5.  
  6. set /a indOPENVPN= %ERRORLEVEL%
  7.  
  8. if %indOPENVPN% EQU 1 (
  9.        echo.interfazClose
  10. tasklist | findstr openvpn.exe
  11. echo %ERRORLEVEL%
  12. if %ERRORLEVEL% EQU 1 (
  13. echo.conexionClose
  14. )else if %ERRORLEVEL% EQU 0 (
  15. echo.conexionOpen
  16. )
  17.  
  18. ) else if %indOPENVPN% EQU 0 (
  19.         echo.interfazOpen
  20. )
  21.  
  22. goto bucle
  23.  
  24. goto bucle
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 ?  :(
« Última modificación: 21 Septiembre 2016, 17:28 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #3 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
  1. @Echo OFF & (CHCP 1252)1>&2>NUL
  2.  
  3. Set "exeName=openvpn-gui"
  4.  
  5. :Loop
  6. (TaskList.exe /FI "IMAGENAME eq "%exeName%.exe"" | Find "%exeName%.exe")1>&2>NUL && (
  7.    REM Escribir aquí las órdenes cuando el resultado es True.
  8.    Echo:El proceso "%exeName%.exe" está activo.
  9.  
  10. ) || (
  11.    REM Escribir aquí las órdenes cuando el resultado es False.
  12.    Echo:El proceso "%exeName%.exe" está inactivo.
  13.  
  14. )
  15.  
  16. (TimeOut /T 1 /NoBreak)1>&2>NUL
  17. GoTo :Loop

Saludos
« Última modificación: 21 Septiembre 2016, 17:32 pm por Eleкtro » En línea

llAudioslavell

Desconectado Desconectado

Mensajes: 177


Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #4 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
  1. @Echo OFF & (CHCP 1252)1>&2>NUL
  2.  
  3. Set "exeName=openvpn-gui"
  4.  
  5. :Loop
  6. (TaskList.exe /FI "IMAGENAME eq "%exeName%.exe"" | findstr "%exeName%.exe")1>&2>NUL && (
  7.    REM Escribir aquí las órdenes cuando el resultado es True.
  8.    Echo:El proceso "%exeName%.exe" está activo.
  9.  
  10. ) || (
  11.    REM Escribir aquí las órdenes cuando el resultado es False.
  12.    Echo:El proceso "%exeName%.exe" está inactivo.
  13.  
  14. )
  15.  
  16. (TimeOut /T 1 /NoBreak)1>&2>NUL
  17. GoTo :Loop

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?  :(
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #5 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
  1. @Echo OFF & (CHCP 1252)1>&2>NUL
  2. SetLocal EnabledelayedExpansion
  3.  
  4. :Loop
  5. Set /A "exitCodeCount=0"
  6. (Call :CheckGUI) & (Set /A "exitCodeCount+=!ERRORLEVEL!")
  7. (Call :CheckCLI) & (Set /A "exitCodeCount+=!ERRORLEVEL!")
  8.  
  9. If "!exitCodeCount!" EQU "0" (
  10.    Echo:Ambos procesos están activos.
  11.  
  12. ) Else (
  13.    If "!exitCodeCount!" EQU "1" (
  14.        Echo:Al menos uno de los procesos está inactivo.
  15.  
  16.    ) Else ( :: "!exitCodeCount!" EQU "2"
  17.        Echo:Ninguno de los procesos está activo.
  18.  
  19.    )
  20.  
  21. )
  22.  
  23. (TimeOut /T 1 /NoBreak)1>&2>NUL
  24. GoTo :Loop
  25.  
  26. :CheckGUI
  27. (TaskList.exe /FI "IMAGENAME eq openvpn-gui.exe" | findstr "openvpn-gui.exe")1>&2>NUL
  28. Exit /B "%ERRORLEVEL%"
  29.  
  30. :CheckCLI
  31. (TaskList.exe /FI "IMAGENAME eq openvpn.exe" | findstr "openvpn.exe")1>&2>NUL
  32. Exit /B "%ERRORLEVEL%"

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!
« Última modificación: 21 Septiembre 2016, 17:59 pm por Eleкtro » En línea

llAudioslavell

Desconectado Desconectado

Mensajes: 177


Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #6 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
  1. @Echo OFF & (CHCP 1252)1>&2>NUL
  2. SetLocal EnabledelayedExpansion
  3.  
  4. :Loop
  5. Set /A "exitCodeCount=0"
  6. (Call :CheckGUI) & (Set /A "exitCodeCount+=!ERRORLEVEL!")
  7. (Call :CheckCLI) & (Set /A "exitCodeCount+=!ERRORLEVEL!")
  8.  
  9. If "!exitCodeCount!" EQU "0" (
  10.    Echo:Ambos procesos están activos.
  11.  
  12. ) Else (
  13.    If "!exitCodeCount!" EQU "1" (
  14.        Echo:Al menos uno de los procesos está inactivo.
  15.  
  16.    ) Else ( :: "!exitCodeCount!" EQU "2"
  17.        Echo:Ninguno de los procesos está activo.
  18.  
  19.    )
  20.  
  21. )
  22.  
  23. (TimeOut /T 1 /NoBreak)1>&2>NUL
  24. GoTo :Loop
  25.  
  26. :CheckGUI
  27. (TaskList.exe /FI "IMAGENAME eq openvpn-gui.exe" | findstr "openvpn-gui.exe")1>&2>NUL
  28. Exit /B "%ERRORLEVEL%"
  29.  
  30. :CheckCLI
  31. (TaskList.exe /FI "IMAGENAME eq openvpn.exe" | findstr "openvpn.exe")1>&2>NUL
  32. Exit /B "%ERRORLEVEL%"

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 !  :(  :(  :(  :(
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #7 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
« Última modificación: 21 Septiembre 2016, 18:34 pm por Eleкtro » En línea

llAudioslavell

Desconectado Desconectado

Mensajes: 177


Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #8 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 ?
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: BATCH - Problema en bucle infinito
« Respuesta #9 en: 21 Septiembre 2016, 18:52 pm »

No se como hacerlo :'( con que opcion lo hago ?

Con este:




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
  1. @Echo OFF & (CHCP 1252)1>&2>NUL
  2. SetLocal EnabledelayedExpansion
  3.  
  4. :Loop
  5. Set /A "isGUIactive=-1"
  6. Set /A "isCLIactive=-1"
  7. (Call :CheckGUI) & (Set /A "isGUIactive=!ERRORLEVEL!")
  8. (Call :CheckCLI) & (Set /A "isCLIactive=!ERRORLEVEL!")
  9.  
  10. If "!isGUIactive!" EQU "0" (
  11.    Echo:El proceso "openvpn-gui" está activo.
  12. )
  13.  
  14. If "!isCLIactive!" EQU "0" (
  15.    Echo:El proceso "openvpn" está activo.
  16. )
  17.  
  18. If "!isGUIactive!" EQU "0" If "!isCLIactive!" EQU "0" (
  19.    Echo:Ambos procesos está activos.
  20. )
  21.  
  22. (TimeOut /T 1 /NoBreak)1>&2>NUL
  23. GoTo :Loop
  24.  
  25. :CheckGUI
  26. (TaskList.exe /FI "IMAGENAME eq openvpn-gui.exe" | Find "openvpn-gui.exe")1>&2>NUL
  27. Exit /B "%ERRORLEVEL%"
  28.  
  29. :CheckCLI
  30. (TaskList.exe /FI "IMAGENAME eq openvpn.exe" | Find "openvpn.exe")1>&2>NUL
  31. Exit /B "%ERRORLEVEL%"
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
probando un bucle infinito... « 1 2 3 »
Bugs y Exploits
mousehack 22 15,601 Último mensaje 28 Agosto 2015, 21:46 pm
por MCKSys Argentina
El que se ha metido en un bucle infinito soy yo...
Programación C/C++
Superplay 0 3,819 Último mensaje 1 Diciembre 2010, 21:14 pm
por Superplay
Implementacion de bucle infinito
Programación C/C++
mark182 3 4,549 Último mensaje 12 Marzo 2011, 11:33 am
por Akai
Bucle infinito interumpible
Programación C/C++
soyloqbuskas 3 2,749 Último mensaje 23 Agosto 2012, 01:06 am
por 0xDani
Problema con bucle infinito
Programación C/C++
magictheory 8 3,116 Último mensaje 1 Noviembre 2016, 12:57 pm
por magictheory
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines