Планировщик заданий Windows — запуск задания один раз в день при входе в систему

Планировщик заданий Windows — запуск задания один раз в день при входе в систему

Я пытаюсь настроить задачу расписания для запуска 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\Главное меню\Программы\Автозагрузка

Надеюсь это поможет!

Связанный контент