
Estoy intentando configurar una tarea programada para ejecutar un archivo ejecutable exactamente una vez al día. He probado lo siguiente:
Activar diariamente a las 4:00 a. m., "ejecutar la tarea lo antes posible después de perderse un inicio programado"
Este enfoque funciona perfectamente si no tengo una contraseña configurada en mi cuenta, en cuyo caso Windows arranca directamente en el escritorio; después de un breve retraso, la tarea se ejecuta.
Cuando agregué una contraseña a mi cuenta, la tarea ya no se ejecutó. En el historial de tareas veo que se registran advertencias:
El Programador de tareas no inició la tarea "X" porque el usuario "Y" no inició sesión cuando se cumplieron las condiciones de inicio. Acción del usuario: asegúrese de que el usuario haya iniciado sesión o cambie la definición de la tarea para permitir el inicio cuando el usuario esté desconectado.
Esto parece una advertencia estúpida: en "Opciones de seguridad", tengo seleccionado "Ejecutar solo cuando el usuario ha iniciado sesión". ¿Por qué el Programador de tareas intenta iniciar la tarea antes de que el usuario inicie sesión?
Activar diariamente a las 4:00 a. m. y "al iniciar sesión", ejecutar lo antes posible
Este enfoque no tuvo el efecto que pretendía, es decir, queríaamboslas condiciones sean verdaderas, es decir, si "después de las 4:00 a. m. todos los días" es verdadero e "iniciar sesión" es verdadero, ejecute la tarea; y para cada evento sucesivo de "iniciar sesión" ese día, "después de las 4:00 a. m. todos los días" no será cierto, por lo que esperará hasta el día siguiente. Lamentablemente, no es así como funciona el Programador de tareas y, con este enfoque, la tarea se ejecuta despuéscadaacceder.
Ejecutar ya sea que el usuario haya iniciado sesión o no
No puedo utilizar este enfoque porque el archivo ejecutable que intento ejecutar a veces requiere la intervención del usuario cuando está completo. En general, existen diversas razones por las que es posible que no se pueda utilizar esta opción.
Otras opciones
En el ámbito de las soluciones desesperadas, estoy considerando escribir un script por lotes que escriba en un archivo y pueda detectar si se ha llamado antes.
Seguramente debe haber una mejor manera de lograr este caso de uso de programación aparentemente común y simple.
Respuesta1
Ejecute una tarea una vez al día al iniciar sesión
Estoy intentando configurar una tarea programada para ejecutar un archivo ejecutable exactamente una vez al día.
Estoy considerando escribir un script por lotes que escriba en un archivo y pueda detectar si se ha llamado antes.
Bien, el siguiente es un ejemplo con una lógica de secuencia de comandos por lotes muy básica y simple, como usted indicó en el comentario, que puede ser útil en su caso según los problemas que enfrenta.
También haré referencia a otra publicación (al final de esta respuesta) sobre el Programador de tareas con problemas, etc. en caso de que tenga más problemas con el Programador de tareas que no funciona como se esperaba al ejecutar el script por lotes. Aunque las opciones que elija específicamente en la configuración pueden ser diferentes, así como el sistema operativo, los problemas en este nivel probablemente sean los mismos, así que eche un vistazo rápido a esa publicación también si tiene problemas con la programación por lotes con el Programador de tareas, no funcionando como se esperaba.
Desglose del guión básico
El
FOR /F
bucle crea laYYYYMMDD
variable que se utilizará para la fecha actual.Es
CheckDir
una ruta de unidad local o incluso una ruta UNC en\\servername\sharename\folder
la que colocará este pequeño archivo de verificación con laYYYYMMDD
parte de su nombre de archivo cada día.- Simplemente cambie
C:\Path
o conecte la ruta UNC a donde debe apuntar en su entorno
- Simplemente cambie
Es
checkfile
SÓLO el nombre del archivo con el%CheckDir%\
delante y el%DT%
añadido al final antes de la extensión .txt. Por ejemplo, le dará un resultado final deC:\Path\VersionBackup_20130202.txt
hoy como en mi ejemplo.- Básicamente, esto verificará si el archivo existe hoy; de ser así, finalice el script; si no existe, créelo y luego ejecute VersionBackup.exe, cualquiera que sea su nombre EXE. De esta manera, esto podría programarse con el Programador de tareas una vez por hora apuntando al script por lotes y, según la lógica del script por lotes, solo se permitirá ejecutarlo una vez al día.
Solo
START "" "C:\Path\VersionBackup.exe"
necesita apuntar a la ruta completa donde existe el nombre EXE que realiza la operación de copia de seguridad de la versión.
Ejemplo de secuencia de comandos por lotes
@ECHO ON
:::: SET YYYYMMDD format for date
FOR /F "TOKENS=2-4 DELIMS=/ " %%A IN ("%DATE%") DO SET "DT=%%C%%B%%A"
:SetCheckFile
SET CheckDir=C:\Path
SET checkfile=%CheckDir%\VersionBackup_%DT%.txt
IF NOT EXIST "%CheckDir%" MD "%CheckDir%"
IF EXIST "%checkfile%" GOTO EOF
ECHO Creating the check file for date %DT% to ensure only one Version Backup run for the day>>"%checkfile%"
:StartApp
START "" "C:\Path\VersionBackup.exe"
GOTO EOF
Respuesta2
Coloque el .exe en una de las siguientes carpetas para ejecutarlo cuando se inicie la computadora. No tendrás que hacer nada en el Programador de tareas.
Solo para el usuario actual:
C:\Usuarios\nombre de usuario\AppData\Roaming\Microsoft\Windows\Menú Inicio\Programas\Inicio
Para todos los usuarios:
C:\ProgramData\Microsoft\Windows\Menú Inicio\Programas\Inicio
¡Espero que esto ayude!