Skip to content

Scheduled Tasks

Scheduled tasks are one of the core automation mechanisms in Windows. They allow administrators to run programs, scripts, and maintenance operations at specific times or in response to system events. PowerShell provides a comprehensive interface for creating, inspecting, modifying, and executing scheduled tasks, giving you full control over automated workflows across local and remote systems.

This section explains how scheduled tasks are structured, how PowerShell interacts with them, and how to manage them in a predictable and maintainable way.


1. Understanding the Windows Task Scheduler Architecture

The Windows Task Scheduler is built around three fundamental components:

  1. Triggers — define when a task runs.
  2. Actions — define what the task does.
  3. Settings and Conditions — define how the task behaves (e.g., stop after a timeout, run only on AC power).

A scheduled task is essentially a configuration object that combines these elements. PowerShell exposes these components through cmdlets that allow you to construct tasks programmatically rather than through the graphical interface.


2. PowerShell Cmdlets for Scheduled Tasks

PowerShell provides a dedicated module, ScheduledTasks, which includes cmdlets such as:

  • Get-ScheduledTask
  • Register-ScheduledTask
  • Set-ScheduledTask
  • Unregister-ScheduledTask
  • Start-ScheduledTask
  • Get-ScheduledTaskInfo

These cmdlets operate on the same underlying system as the Task Scheduler GUI, meaning any task created in PowerShell appears in the Task Scheduler and vice versa.


3. Inspecting Existing Scheduled Tasks

Before creating or modifying tasks, it is important to understand what already exists on the system.

Listing all scheduled tasks

Get-ScheduledTask

This returns a list of task definitions, each represented as an object containing:

  • The task name
  • The task path
  • The triggers
  • The actions
  • The current state

Inspecting a specific task

Get-ScheduledTask -TaskName "MyTask"

This retrieves the full definition of the task, allowing you to examine its configuration in detail.

Retrieving runtime information

Get-ScheduledTaskInfo -TaskName "MyTask"

This provides operational data such as:

  • Last run time
  • Last run result
  • Next scheduled run
  • Number of failures

This distinction is important: Get-ScheduledTask retrieves the definition, while Get-ScheduledTaskInfo retrieves the runtime state.


4. Creating a New Scheduled Task

Creating a scheduled task in PowerShell involves constructing the components individually and then registering the task.

4.1 Creating a trigger

A trigger defines when the task runs. For example, a daily trigger:

$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM

This creates an object representing a daily schedule at 3 AM.

4.2 Creating an action

An action defines what the task does. For example, running a PowerShell script:

$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\Backup.ps1"

This instructs the task to launch PowerShell and execute the script.

4.3 Registering the task

Register-ScheduledTask -TaskName "DailyBackup" -Trigger $trigger -Action $action

This creates the task in the Task Scheduler. By default, it runs under the local system account unless credentials are specified.


5. Running Tasks Under Specific Credentials

Many administrative tasks require running under a particular user account.

Prompting for credentials

$cred = Get-Credential

Registering a task with credentials

Register-ScheduledTask -TaskName "DailyBackup" -Trigger $trigger -Action $action -User $cred.UserName -Password $cred.GetNetworkCredential().Password

The task will now run under the specified user context, inheriting that user’s permissions.


6. Modifying Existing Tasks

Tasks can be updated without recreating them.

Example: updating the trigger

$trigger = New-ScheduledTaskTrigger -Daily -At 2:00AM
Set-ScheduledTask -TaskName "DailyBackup" -Trigger $trigger

This changes the task to run at 2 AM instead of 3 AM.

Example: updating the action

$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\NewBackup.ps1"
Set-ScheduledTask -TaskName "DailyBackup" -Action $action

This updates the script the task executes.


7. Running and Stopping Scheduled Tasks

PowerShell allows you to start tasks manually, which is useful for testing.

Starting a task

Start-ScheduledTask -TaskName "DailyBackup"

This runs the task immediately, regardless of its trigger.

Stopping a running task

Stop-ScheduledTask -TaskName "DailyBackup"

This stops the task if it is currently running.


8. Removing Scheduled Tasks

When a task is no longer needed, it can be removed cleanly.

Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false

This deletes the task without prompting for confirmation.


9. Practical Administrative Scenarios

Running a cleanup script every hour

$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1)
$action  = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\Cleanup.ps1"

Register-ScheduledTask -TaskName "HourlyCleanup" -Trigger $trigger -Action $action

Creating a task that runs at logon

$trigger = New-ScheduledTaskTrigger -AtLogOn
$action  = New-ScheduledTaskAction -Execute "notepad.exe"

Register-ScheduledTask -TaskName "OpenNotepadAtLogon" -Trigger $trigger -Action $action

Monitoring failed tasks

Get-ScheduledTask |
    ForEach-Object {
        $info = Get-ScheduledTaskInfo -TaskName $_.TaskName
        if ($info.LastTaskResult -ne 0) {
            [pscustomobject]@{
                TaskName = $_.TaskName
                LastRun  = $info.LastRunTime
                Result   = $info.LastTaskResult
            }
        }
    }

This produces a list of tasks that did not complete successfully.


10. Summary

Scheduled tasks provide a robust and flexible automation framework within Windows. PowerShell enhances this framework by offering:

  • A structured, object‑oriented interface for task creation and management
  • The ability to define triggers, actions, and settings programmatically
  • Full control over credentials and execution context
  • Tools for inspecting task definitions and runtime state
  • Support for both local and remote task management

By mastering scheduled tasks in PowerShell, administrators can automate routine maintenance, enforce consistency across systems, and build reliable operational workflows.