3

Я пытаюсь настроить задачу по расписанию для запуска exe точно один раз в день. Я пробовал следующее:

Ежедневно запускать в 4:00 утра, "запускать задание как можно скорее после пропуска запланированного запуска"

Этот подход прекрасно работает, если у меня нет учетной записи, установленной в моей учетной записи, и в этом случае Windows загружается непосредственно на рабочий стол - после небольшой задержки задача запускается.

Когда я добавил пароль к своей учетной записи, задача больше не выполнялась. В истории задач я вижу предупреждения, которые регистрируются:

Планировщик задач не запустил задачу "X", так как пользователь "Y" не вошел в систему при выполнении условий запуска. User Action: Убедитесь, что пользователь вошел в систему, или измените определение задачи, чтобы разрешить запуск при выходе пользователя из системы.

Это похоже на глупое предупреждение - в разделе "Параметры безопасности" я выбрал "Запускать только когда пользователь вошел в систему". Почему планировщик задач пытается запустить задачу до входа пользователя в систему?

Запускать ежедневно в 4 часа утра и "при входе в систему", запускать как можно быстрее

Этот подход не дал желаемого эффекта, т.е. я хотел, чтобы оба условия выполнялись, т. Е. Если «после 4:00 утра ежедневно» имеет значение "истина", а "вход в систему" имеет значение "истина", то запустите задачу; и для каждого последующего события "вход в систему" в тот день «после 4:00 утра ежедневно» не будет истинным, поэтому он будет ждать следующего дня. К сожалению, это не так, как работает планировщик задач, и при таком подходе задача запускается после каждого входа в систему.

Запускать, вошел ли пользователь в систему или нет

Я не могу использовать этот подход, потому что исполняемый файл, который я пытаюсь запустить, иногда требует ввода данных пользователем, когда он завершен. В целом, существует множество причин, по которым нельзя использовать эту опцию.

Другие опции

В области отчаянных обходных путей я собираюсь написать пакетный сценарий, который запишет файл и сможет определить, вызывался ли он раньше.

Конечно, должен быть лучший способ достичь этого, казалось бы, распространенного и простого сценария использования?

2 ответа2

1

Запускать задачу один раз в день при входе в систему

Я пытаюсь настроить задачу по расписанию для запуска exe точно один раз в день.

Я подумываю написать пакетный скрипт, который запишет в файл и сможет определить, вызывался ли он раньше.

Итак, приведенный ниже пример с очень простой и простой логикой пакетного сценария, как вы указали в комментарии, может быть полезен в вашем случае для решения проблем, с которыми вы сталкиваетесь.

Я также буду ссылаться на другой пост (внизу этого ответа) о планировщике заданий с помощью getcha и т.д. На случай, если у вас возникнут дополнительные проблемы с планировщиком заданий, который не работает должным образом при выполнении пакетного сценария. Несмотря на то, что параметры, которые вы выбираете конкретно в конфигурации, могут отличаться, также как и для ОС, ошибки на этом уровне, скорее всего, те же самые, поэтому взгляните на этот пост тоже, если у вас проблемы с пакетным планированием с помощью Task Scheduler, а не работает как положено.


Базовая разбивка скриптов

  • Цикл FOR /F создает переменную YYYYMMDD для использования на текущую дату.

  • CheckDir - это путь к локальному диску или даже UNC-путь к \\servername\sharename\folder которую вы будете помещать этот небольшой контрольный файл с частью YYYYMMDD в имени файла каждый день.

    • Просто измените C:\Path или вставьте UNC-путь туда, куда он должен указывать в вашей среде
  • Контрольный checkfile - это ТОЛЬКО имя файла с %CheckDir%\ перед ним и %DT% добавленным в его конец перед расширением .txt. Например, он даст вам окончательный результат C:\Path\VersionBackup_20130202.txt на сегодняшний день, как в моем примере.

    • Это по существу проверит, существует ли файл на сегодняшний день, если так, завершите сценарий, если он не существует, создайте его и затем запустите VersionBackup.exe независимо от того, как называется его имя EXE. Таким образом, это можно запланировать с помощью планировщика заданий, чтобы один раз в час указывать на пакетный сценарий, и, согласно логике пакетного сценария, запускать его можно будет только один раз в день.
  • 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

0

Перетащите .exe в одну из следующих папок, чтобы запустить его при загрузке компьютера. Вам не нужно ничего делать в планировщике заданий.

Только для текущего пользователя:

C:\Users\ имя пользователя \ AppData \ Roaming \ Microsoft \ Windows \ Пуск \ Меню \ Программы \ Автозагрузка

Для всех пользователей:

C:\ProgramData\Microsoft\Windows\ Пуск \ Меню \ Программы \ Автозагрузка

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .