[python-win32] taskscheduler: how to tick setting "Run task as soon as possible after scheduled start is missed"
Eryk Sun
eryksun at gmail.com
Mon Jan 9 19:37:13 EST 2023
On 1/5/23, Joel Moberg <joel.moberg at gmail.com> wrote:
> Maybe I can adjust the flag in the Trigger object but I have no idea what
> flags are available.
The following loosely adapts Microsoft's time trigger task example,
with commented links to get further information. The property that
directly addresses your question is
taskDefinition.Settings.StartWhenAvailable.
---
import win32com.client
from pywintypes import com_error
from datetime import datetime, timedelta
# Connect a TaskService instance.
# https://learn.microsoft.com/windows/win32/taskschd/taskservice
service = win32com.client.Dispatch('Schedule.Service')
service.Connect()
# Create a TaskDefinition.
# https://learn.microsoft.com/windows/win32/taskschd/taskdefinition
taskDefinition = service.NewTask(0)
# Set the task description and author name.
# https://learn.microsoft.com/windows/win32/taskschd/registrationinfo
taskDefinition.RegistrationInfo.Description = (
"Start notepad at a certain time")
taskDefinition.RegistrationInfo.Author = "Author Name"
# Enable the task to start after the scheduled time.
# https://learn.microsoft.com/windows/win32/taskschd/tasksettings
taskDefinition.Settings.Enabled = True
taskDefinition.Settings.StartWhenAvailable = True
# Add a TimeTrigger.
# https://learn.microsoft.com/windows/win32/taskschd/triggercollection
# https://learn.microsoft.com/windows/win32/taskschd/timetrigger
TASK_TRIGGER_TIME = 1
# The time format is "YYYY-MM-DD" "T" "HH:MM:SS" [(+-)"HH:MM"]. For
# example, "1980-01-01T00:00:00+00:00". Local time is used if the
# optional UTC offset is omitted.
TIME_TEMPLATE = "{:%Y-%m-%dT%H:%M:%S}"
trigger = taskDefinition.Triggers.Create(TASK_TRIGGER_TIME)
trigger.Id = "TimeTriggerId"
trigger.Enabled = True
trigger.StartBoundary = TIME_TEMPLATE.format(
datetime.now() + timedelta(seconds=30))
trigger.EndBoundary = TIME_TEMPLATE.format(
datetime.now() + timedelta(minutes=5))
trigger.ExecutionTimeLimit = "PT5M" # 5 minutes
# Add an ExecAction.
# https://learn.microsoft.com/windows/win32/taskschd/actioncollection
# https://learn.microsoft.com/windows/win32/taskschd/execaction
TASK_ACTION_EXEC = 0
action = taskDefinition.Actions.Create(TASK_ACTION_EXEC)
action.Id = "ExecActionid"
action.Path = r"C:\Windows\System32\notepad.exe"
# Register the task to run only in the user's interactive session.
# https://learn.microsoft.com/windows/win32/taskschd/taskfolder
TASK_CREATE_OR_UPDATE = 6
TASK_LOGON_PASSWORD = 1
TASK_LOGON_S4U = 2 # requires admin access
TASK_LOGON_INTERACTIVE_TOKEN = 3
TASK_LOGON_GROUP = 4
TASK_LOGON_SERVICE_ACCOUNT = 5
service.GetFolder("\\").RegisterTaskDefinition(
"Time Trigger Test", taskDefinition, TASK_CREATE_OR_UPDATE,
None, None, TASK_LOGON_INTERACTIVE_TOKEN)
More information about the python-win32
mailing list