Search code examples
powershellscheduled-taskspowershell-2.0comobject

Creating a scheduled task that runs on 6 days a week


I'm trying to create a few scheduled tasks using PowerShell prior to the TaskScheduler module, which is not an option as this will be used to run a process on external client machines. Therefore I can't use cmd as I need to specify the credentials each time.

I have delved into the comobject a little but I don't really understand this. I would be more than happy to use this if I could figure out the triggers, basically I need it to run 6 days a week (excluding Sunday) at a specific time once a day.

I think ive got the action and arguments down but it's the trigger im struggling with understanding.

This is the block im working on which was liberated from here, so all credit there!

try {
    [Object] $objScheduledTask = New-Object -ComObject("Schedule.Service")

    if (!($objScheduledTask.Connected)) {
        try {
            $objScheduledTask.Connect($env:COMPUTERNAME)
            $objScheduledTask_Folder = $objScheduledTask.GetFolder('\')
            $objScheduledTask_TaskDefinition = $objScheduledTask.NewTask(0)

            #Registration / Definitions
            $objScheduledTask_RegistrationInfo = $objScheduledTask_TaskDefinition.RegistrationInfo
            $objScheduledTask_RegistrationInfo.Description = 'My task name'

            #Define Settings
            $objScheduledTask_Settings = $objScheduledTask_TaskDefinition.Settings
            $objScheduledTask_Settings.Enabled = $True
            $objScheduledTask_Settings.StartWhenAvailable = $True
            $objScheduledTask_Settings.Hidden = $False

            #Triggers
            $objScheduledTask_Triggers = $objScheduledTask_TaskDefinition.Triggers
            $objScheduledTask_Trigger = $objScheduledTask_Triggers.Create(2)
            $objScheduledTask_Trigger.StartBoundary = "2011-10-01T04:00:00"
            $objScheduledTask_Trigger.DaysInterval = 1
            $objScheduledTask_Trigger.Id = "DailyTriggerId"
            $objScheduledTask_Trigger.Enabled = $True

            #Action
            $objScheduledTask_Action = $objScheduledTask_TaskDefinition.Actions.Create(0)
            $objScheduledTask_Action.Path = 'task\to\execute.exe'
            $objScheduledTask_Action.Arguments = ''
            $objScheduledTask_Action.WorkingDirectory = 'C:\'

            #Create Task
            $objScheduledTask_Folder.RegisterTaskDefinition('Sample Scheduled Task Description', $objScheduledTask_TaskDefinition, 6, "System", $null , 5) | out-null
            Write-Host "Scheduled Task Created Successfully" -ForegroundColor Green
        } catch [System.Exception] {
            Write-Host "Scheduled Task Creation Failed" -ForegroundColor Red
        }
    }
} catch [System.Exception]{
    Write-Host "Scheduled Task Creation Failed" -ForegroundColor Red
    Write-Host "  EXCEPTION:" $_ -ForegroundColor Red
}

Solution

  • You need a weekly trigger instead of a daily trigger if you want to run a task on selected days per week. The DaysOfWeek property specifies the days as a bitmask in an integer value.

    $objScheduledTask_Triggers = $objScheduledTask_TaskDefinition.Triggers
    $objScheduledTask_Trigger = $objScheduledTask_Triggers.Create(3)
    $objScheduledTask_Trigger.StartBoundary = '2011-10-01T04:00:00'
    $objScheduledTask_Trigger.WeeksInterval = 1  # run every week
    $objScheduledTask_Trigger.DaysOfWeek = 126   # Mo-Sa
    $objScheduledTask_Trigger.Id = 'DailyTriggerId'
    $objScheduledTask_Trigger.Enabled = $true