VBS residente para control de ejecución de un bat. ¿?

Iniciado por Shinseiki86, 23 Octubre 2009, 21:10 PM

0 Miembros y 2 Visitantes están viendo este tema.

Shinseiki86

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!

Novlucker

#1
Puedes probar algo como esto

Código (vb) [Seleccionar]
set objshell = createobject("Wscript.shell")

Selecthora = "5.30,7.30,9.30,11.30,13.30,15.30,16.30"
comando = "miarchivo.bat"

horas = split(selecthora,",")
task_event = -1

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
if task_event=ubound(horas) then
wscript.quit
end if
end if
Loop

Function match_hour(hs,min)
match_hour = -1
for i = 0 to ubound(horas)
shs = cint(split(horas(i),".")(0))
smin = cint(split(horas(i),".")(1))
if hs=shs and min=smin then
match_hour= i
exit Function
end if
next
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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Shinseiki86

En el segundo if faltaba 'then'

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.

Novlucker

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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Shinseiki86

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:

Novlucker

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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Shinseiki86

Pues... la necesidad de hacerlo desde el lnk es porque el bat tiene dimensiones e icono preconfigurado... mejor dicho... es por puro capricho...   ;D

Novlucker

Ya veo, igual acabo de probar con un lnk a un bat, y me funciona sin problemas  :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Shinseiki86

Necesito otra ayuda.

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

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.

Novlucker

Entonces comentando esa parte ya esta .. el script esta programado así, como había dicho antes ...

CitarEl 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
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein