PowerShell Scheduled Tasks

A scheduled task is an instruction that tells Windows to run a program or script automatically at a specific time, on a recurring schedule, or when a certain event happens — such as system startup or user login. PowerShell provides a complete set of cmdlets to create, manage, and remove scheduled tasks without ever opening the Task Scheduler window.

How Scheduled Tasks Work

+-------------------+
|  Task Scheduler   |  ← Windows service that runs in the background
+-------------------+
         |
         | Checks schedule every minute
         v
+-------------------+       Trigger fires?
|  Scheduled Task   |  ─────────────────→  Run the action
+-------------------+
         |
     Contains:
     ├── Trigger  (When: daily at 6 AM, on startup, on login)
     ├── Action   (What: run a .ps1 script, open an app)
     └── Settings (How: timeout, run as admin, etc.)

Key Cmdlets for Scheduled Tasks

CmdletPurpose
New-ScheduledTaskTriggerDefine when the task runs
New-ScheduledTaskActionDefine what the task does
New-ScheduledTaskSettingsSetConfigure task behavior
Register-ScheduledTaskCreate and save the task
Get-ScheduledTaskList existing tasks
Start-ScheduledTaskRun a task immediately
Stop-ScheduledTaskStop a running task
Unregister-ScheduledTaskDelete a task
Enable-ScheduledTaskEnable a disabled task
Disable-ScheduledTaskDisable without deleting

Creating a Basic Scheduled Task

The process has three steps: define a trigger, define an action, then register the task.
# Step 1: Define WHEN the task runs (trigger)
$trigger = New-ScheduledTaskTrigger -Daily -At "06:00AM"

# Step 2: Define WHAT the task does (action)
$action = New-ScheduledTaskAction `
    -Execute "powershell.exe" `
    -Argument "-File C:\Scripts\BackupFiles.ps1"

# Step 3: Register (create) the task
Register-ScheduledTask `
    -TaskName "DailyBackup" `
    -Trigger $trigger `
    -Action $action `
    -Description "Runs the daily backup script every morning at 6 AM" `
    -RunLevel Highest

Types of Triggers

Daily Trigger

# Run every day at 8 PM
$trigger = New-ScheduledTaskTrigger -Daily -At "8:00PM"

# Run every 2 days at noon
$trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 2 -At "12:00PM"

Weekly Trigger

# Run every Monday at 7 AM
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "07:00AM"

# Run on Monday and Friday
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday,Friday -At "09:00AM"

One-Time Trigger

# Run once at a specific date and time
$trigger = New-ScheduledTaskTrigger -Once -At "2025-12-31 11:59PM"

System Startup Trigger

# Run when Windows starts
$trigger = New-ScheduledTaskTrigger -AtStartup

User Login Trigger

# Run when any user logs in
$trigger = New-ScheduledTaskTrigger -AtLogOn

Running a Task as a Specific User

# Run the task as SYSTEM (highest privilege, runs even when no one is logged in)
Register-ScheduledTask `
    -TaskName "SystemCleanup" `
    -Trigger $trigger `
    -Action $action `
    -User "SYSTEM" `
    -RunLevel Highest

# Run as a specific user
Register-ScheduledTask `
    -TaskName "UserReport" `
    -Trigger $trigger `
    -Action $action `
    -User "DOMAIN\Alice" `
    -Password "P@ssword123"

Task Settings

New-ScheduledTaskSettingsSet controls how the task behaves — what happens if it fails, how long it can run, and more.
$settings = New-ScheduledTaskSettingsSet `
    -ExecutionTimeLimit (New-TimeSpan -Hours 2) `   # Max 2 hours runtime
    -RestartCount 3 `                               # Retry 3 times if it fails
    -RestartInterval (New-TimeSpan -Minutes 5) `    # Wait 5 min between retries
    -StartWhenAvailable                             # Run ASAP if trigger was missed

Register-ScheduledTask `
    -TaskName "ReliableTask" `
    -Trigger $trigger `
    -Action $action `
    -Settings $settings

Viewing Existing Scheduled Tasks

# List all registered tasks
Get-ScheduledTask

# Find tasks by name pattern
Get-ScheduledTask -TaskName "*Backup*"

# See full details including trigger and action
Get-ScheduledTask -TaskName "DailyBackup" | Format-List *

# Check last run time and result
Get-ScheduledTaskInfo -TaskName "DailyBackup"

Sample Output of Get-ScheduledTaskInfo

TaskName           : DailyBackup
LastRunTime        : 10/11/2026 06:00:02 AM
LastTaskResult     : 0                    ← 0 means Success
NextRunTime        : 10/12/2026 06:00:00 AM
NumberOfMissedRuns : 0

Running a Task Immediately

# Trigger the task right now, without waiting for its schedule
Start-ScheduledTask -TaskName "DailyBackup"

Disabling and Enabling Tasks

# Disable a task (keeps it registered but prevents it from running)
Disable-ScheduledTask -TaskName "DailyBackup"

# Enable it again
Enable-ScheduledTask -TaskName "DailyBackup"

Deleting a Scheduled Task

# Delete with confirmation prompt
Unregister-ScheduledTask -TaskName "DailyBackup"

# Delete silently (no confirmation)
Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false

Real-World Example: Weekly Log Cleanup

# Action: delete log files older than 30 days
$action = New-ScheduledTaskAction `
    -Execute "powershell.exe" `
    -Argument '-Command "Get-ChildItem C:\Logs -Filter *.log | Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) | Remove-Item -Force"'

# Trigger: every Sunday at 2 AM
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At "02:00AM"

# Settings: timeout after 1 hour
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hours 1)

# Register the task
Register-ScheduledTask `
    -TaskName "WeeklyLogCleanup" `
    -Trigger $trigger `
    -Action $action `
    -Settings $settings `
    -User "SYSTEM" `
    -RunLevel Highest `
    -Description "Removes log files older than 30 days every Sunday at 2 AM"

Task Result Codes

CodeMeaning
0Success
1Incorrect function / general failure
2147942401Access denied (run as admin)
267009Task is currently running
267011Task has not yet run

Summary

Scheduled tasks automate scripts to run at set times, on startup, or on login — without any manual action. PowerShell provides cmdlets for every aspect: creating triggers, defining actions, configuring settings, and managing the task lifecycle. Mastering scheduled tasks eliminates repetitive manual work and ensures critical operations like backups, cleanups, and reports run reliably on schedule.

Leave a Comment

Your email address will not be published. Required fields are marked *