Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Shinseiki86 en 23 Octubre 2009, 21:10 pm



Título: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 23 Octubre 2009, 21:10 pm
Hola a todos.

Resulta que en la empresa inhabilitaron "Tareas programadas" por un virus que se les coló... y me jodieron...

Tengo un bat que se debe ejecutar todos los dias desde las 5:30 am cada dos horas hasta las 3:30 pm y otra vez a las 4:30 pm, para un total de 7 ejecuciones en el dia.

No se mucho de vbs, pero me imagino que se puede hacer un residente oculto, que valide que no se ejecute dos veces y que ejecute el bat a las horas destinadas....

¿Alguien me puede ayudar?

De antemano... !Gracias!


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Novlucker en 24 Octubre 2009, 03:55 am
Puedes probar algo como esto

Código
  1. set objshell = createobject("Wscript.shell")
  2.  
  3. Selecthora = "5.30,7.30,9.30,11.30,13.30,15.30,16.30"
  4. comando = "miarchivo.bat"
  5.  
  6. horas = split(selecthora,",")
  7. task_event = -1
  8.  
  9. Do
  10. wscript.sleep 30000
  11. new_task_event = match_hour(hour(now()),minute(now()))
  12. if new_task_event > task_event then
  13. task_event = new_task_event
  14. objshell.run comando, vbhide
  15. if task_event=ubound(horas) then
  16. wscript.quit
  17. end if
  18. end if
  19. Loop
  20.  
  21. Function match_hour(hs,min)
  22. match_hour = -1
  23. for i = 0 to ubound(horas)
  24. shs = cint(split(horas(i),".")(0))
  25. smin = cint(split(horas(i),".")(1))
  26. if hs=shs and min=smin then
  27. match_hour= i
  28. exit Function
  29. end if
  30. next
  31. End Function

Para configurar el script debes de poner las horas a las que se ejecutará (Selecthora), separando hora y hora entre coma, y hora y minuto con punto (como aparece en el propio script).

Si te fijas ya he puesto las horas a las que dices se debe de ejecutar

El script revisa cada 30 segundos a ver si coincide hora y minuto actual con uno de los que aparece en la lista, si coincide revisa que no se haya ejecutado antes, y si esta todo ok ejecuta un comando, en este caso he puesto que se ejecute un bat en modo oculto. Por otra parte, si el script ejecuta un comando y coincide con que es el último horario de ejecución, se detiene (cierra)

Para probarlo podrías cambiar las horas de ejecución y poner por ejemplo a ejecutar la calculadora (calc)

Saludos


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 24 Octubre 2009, 15:56 pm
En el segundo if faltaba 'then'

Código:
if task_event=ubound(horas) then
 wscript.quit
end if

Como necesito ver el resultado del bat, quité vbhide. Estoy haciendole pruebas y funciona de maravilla! Gracias Novlucker!

Es posible hacer que ejecute un .lnk? Cuando se ejecuta desde el vbs primero me abre 2 ventanas para buscar carpeta y mover los archivos seleccionados. Si le doy en aceptar, mueve el acceso directo a la carpeta seleccionada. Si le doy cancelar a ambas, ejecuta el bat.


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Novlucker en 24 Octubre 2009, 20:16 pm
Es verdad, es que lo había probado sin ese if, eso se me ocurrio despues

No debería de haber problemas para ejecutar el ".lnk", pero no entendí lo de la carpeta y demás XD

Saludos


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 24 Octubre 2009, 20:39 pm
Cuando lo hago con un .lnk, al cumplirse la condición y ejecutarse "comando" me despliega una ventana para mover el acceso directo, pero no lo ejecuta.

No se si sea porque lo ejecuto en un Win2000...  :huh:


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Novlucker en 24 Octubre 2009, 20:48 pm
Ya veo, a mi también me funciona bien abriendo un lnk a una carpeta por ejemplo, pero uno a una imagen se abre y se cierra.

Y si directamente le pones la ruta a la cual apunta el lnk, o si abres el lnk y lees la ruta?

Saludos


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 24 Octubre 2009, 20:53 pm
Pues... la necesidad de hacerlo desde el lnk es porque el bat tiene dimensiones e icono preconfigurado... mejor dicho... es por puro capricho...   ;D


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Novlucker en 24 Octubre 2009, 21:03 pm
Ya veo, igual acabo de probar con un lnk a un bat, y me funciona sin problemas  :-\

Saludos


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 26 Octubre 2009, 17:14 pm
Necesito otra ayuda.

Necesito que el script no se cierre... asi que comenté el segundo if

Código:
Do
wscript.sleep 30000
new_task_event = match_hour(hour(now()),minute(now()))
if new_task_event > task_event then
task_event = new_task_event
objshell.run comando ', vbhide  'Para ocultar el progrma ejecutado
'if task_event=ubound(horas) then     'Cierra el script si no hay mas horas programadas
' wscript.quit
'end if
end if
Loop

Pero además necesito que cuando termine, se repita al dia siguiente con las mismas horas programadas.

La idea es no apagar el pc y que a las 5.30 se ejecute solo otra vez.


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Novlucker en 26 Octubre 2009, 17:45 pm
Entonces comentando esa parte ya esta .. el script esta programado así, como había dicho antes ...

Citar
El script revisa cada 30 segundos a ver si coincide hora y minuto actual con uno de los que aparece en la lista, si coincide revisa que no se haya ejecutado antes, y si esta todo ok ejecuta un comando

El script seguirá revisando las horas, y mañana cuando vuelvan a ser las 05:30 entonces la hora coincidirá con una de la lista, el script revisará si coincide con la última ejecución, el de las 16:30, y como no coincidirá volverá a comenzar :P

Saludos


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 26 Octubre 2009, 20:28 pm
mmm.. pues hice la prueba mdoficando la lista y colocandola en desorden para ver si funcionaba... pero por ejemplo:

Selecthora = "14.15,14.20,14.18"

Se ejecutó a las 14:15 y a las 14:18, pero no a las 14:20...

Supongo que si se evalúa la lista.. no debe importar el orden... ¿o si?.

Lo voy a dejar hoy en ejecución para ver si mañana se ejecuta sin problemas.
Gracias!


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Novlucker en 26 Octubre 2009, 20:56 pm
Es verdad, no me había dado cuenta, mejor en la parte que has comentado pon esto.

Código
  1. if task_event=ubound(horas) then
  2. task_event = -1
  3. end if

Ahora si debería de funcionar, pero el orden si importa ya que revisa que la ejecución anterior no sea menor que la actual, sino no se me ocurre manera de "marcar" la última ejecución

Saludos


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 26 Octubre 2009, 21:03 pm
Ok, lo modifique y si creo que funcione como necesito... Si es el ultimo evento programado, se le resta uno para que regrese al principio.

Coloqué fechas en desorden pero solo como prueba. Realmente colocaría los valores en orden.

Si mi hija nace hoy... me voy de vacas, asi que dentro de un mes informo como ha funcionado.

Gracias Novlucker! Fenomenal tu ayuda!


Título: Re: VBS residente para control de ejecución de un bat. ¿?
Publicado por: Shinseiki86 en 28 Octubre 2009, 21:46 pm
Hice lo siguietne y con eso ya tengo todo solucionado:

Creé un autoextraible con el .lnk y lo coloqué para que se descomprima en una carpeta temporal y se ejecute al terminar. Luego con el .vbs ejecuto el .exe y listo...