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!
Puedes probar algo como esto
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
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.
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
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:
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
Pues... la necesidad de hacerlo desde el lnk es porque el bat tiene dimensiones e icono preconfigurado... mejor dicho... es por puro capricho... ;D
Ya veo, igual acabo de probar con un lnk a un bat, y me funciona sin problemas :-\
Saludos
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.
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
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!
Es verdad, no me había dado cuenta, mejor en la parte que has comentado pon esto.
if task_event=ubound(horas) then
task_event = -1
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
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!
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...