
Я пытаюсь настроить задачу расписания для запуска exe-файла ровно один раз в день. Я пробовал следующее:
Запускать ежедневно в 4:00 утра, «запустить задачу как можно скорее после пропуска запланированного запуска»
Этот подход отлично работает, если на моей учетной записи не установлен пароль. В этом случае Windows загружается сразу на рабочий стол — после небольшой задержки задача запускается.
Когда я добавил пароль к своей учетной записи, задача больше не выполнялась. В истории задач я вижу, что предупреждения регистрируются:
Планировщик задач не запустил задачу "X", поскольку пользователь "Y" не вошел в систему, когда были выполнены условия запуска. Действие пользователя: Убедитесь, что пользователь вошел в систему, или измените определение задачи, чтобы разрешить запуск, когда пользователь вышел из системы.
Это кажется глупым предупреждением - в разделе "Параметры безопасности" у меня выбрано "Запускать только при входе пользователя в систему". Почему планировщик заданий пытается запустить задачу до того, как пользователь войдет в систему?
Запускать ежедневно в 4:00 утра и «при входе в систему», запускать как можно скорее
Этот подход не дал того эффекта, на который я рассчитывал, т.е. я хотелобаусловия должны быть истинными, т.е. если "after 4:00AM daily" верно и "log on" верно, то запустите задачу; и для каждого последующего события "log on" в этот день, "after 4:00AM daily" не будет истинным, поэтому он будет ждать следующего дня. К сожалению, Task Scheduler работает не так, и при таком подходе задача запускается послекаждыйвойдите в систему.
Запускать независимо от того, вошел ли пользователь в систему или нет.
Я не могу использовать этот подход, потому что exe, который я пытаюсь запустить, иногда требует ввода данных пользователем, когда он завершен. В общем, есть множество причин, по которым кто-то не может использовать эту опцию.
Другие варианты
В качестве отчаянного решения я рассматриваю возможность написания пакетного скрипта, который будет записывать данные в файл и сможет определить, вызывался ли он ранее.
Неужели не существует лучшего способа реализовать этот, казалось бы, распространенный и простой вариант планирования?
решение1
Запускать задачу один раз в день при входе в систему
Я пытаюсь настроить задачу расписания для запуска exe-файла ровно один раз в день.
Я подумываю написать пакетный скрипт, который будет записывать данные в файл и сможет определить, вызывался ли он ранее.
Итак, ниже приведен пример с очень простой и базовой логикой пакетного сценария, который, как вы указали в комментарии, может быть полезен в вашем случае для решения проблем, с которыми вы столкнулись.
Я также сошлюсь на другой пост (в конце этого ответа) о планировщике задач с подвохами и т. д. на всякий случай, если у вас возникнут дополнительные проблемы с планировщиком задач, который не будет работать должным образом при выполнении пакетного сценария. Несмотря на то, что параметры, которые вы выбираете в конфигурации, могут отличаться, как и ОС, подвохи на этом уровне, скорее всего, будут теми же, поэтому быстро просмотрите и этот пост, если у вас возникнут проблемы с пакетным планированием, когда планировщик задач не будет работать должным образом.
Базовая разбивка сценария
Цикл
FOR /F
создаетYYYYMMDD
переменную для использования в текущей дате.Это
CheckDir
путь к локальному диску или даже путь UNC, на\\servername\sharename\folder
который вы будете каждый день помещать этот небольшой проверочный файл сYYYYMMDD
частью его имени.- Просто измените
C:\Path
или вставьте UNC-путь туда, куда он должен указывать в вашей среде.
- Просто измените
Это
checkfile
ТОЛЬКО имя файла с передним%CheckDir%\
и%DT%
добавленным в конец перед расширением .txt. Это, например, даст вам окончательный результатC:\Path\VersionBackup_20130202.txt
на сегодня, как в моем примере.- По сути, это проверит, существует ли файл на сегодня, если да, то завершит скрипт, если его нет, то создаст его, а затем запустит VersionBackup.exe, как бы ни назывался его EXE-файл. Таким образом, это можно запланировать с помощью Task Scheduler на запуск один раз в час, указав на пакетный скрипт, и согласно логике пакетного скрипта, ему будет разрешено запускаться только один раз в день.
Нужно
START "" "C:\Path\VersionBackup.exe"
просто указать полный путь к имени EXE-файла, который выполняет операцию резервного копирования версии.
Пример пакетного скрипта
@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
решение2
Поместите .exe в одну из следующих папок, чтобы запустить его при загрузке компьютера. Вам не придется ничего делать в планировщике заданий.
Только для текущего пользователя:
C:\Users\имя пользователя\AppData\Roaming\Microsoft\Windows\Главное меню\Программы\Автозагрузка
Для всех пользователей:
C:\ProgramData\Microsoft\Windows\Главное меню\Программы\Автозагрузка
Надеюсь это поможет!