How to Create and Manage Scheduled Tasks in Windows with PowerShell

5 min read

Create, modify and troubleshoot Windows scheduled tasks via PowerShell and Task Scheduler GUI. Run scripts at startup, on schedule, at login and on events.

Scheduled Tasks automate anything in Windows — scripts, backups, maintenance. PowerShell gives you full control without the GUI.


Basic Concepts

A scheduled task has three parts:

  • Trigger — when to run (time, event, login, startup)
  • Action — what to run (executable, script, arguments)
  • Principal — which account to run as (user, SYSTEM, highest privileges)

Create a Basic Scheduled Task

# Run a script daily at 9 AM
$action  = New-ScheduledTaskAction -Execute "powershell.exe" `
  -Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\daily.ps1"

$trigger = New-ScheduledTaskTrigger -Daily -At "09:00AM"

$principal = New-ScheduledTaskPrincipal `
  -UserId "SYSTEM" -RunLevel Highest

Register-ScheduledTask -TaskName "DailyScript" `
  -Action $action -Trigger $trigger -Principal $principal `
  -Description "Daily maintenance script"

Trigger Types

# Run at system startup
$trigger = New-ScheduledTaskTrigger -AtStartup

# Run at user login
$trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME

# Run once
$trigger = New-ScheduledTaskTrigger -Once -At "2026-06-01 10:00:00"

# Run weekly (Monday, Wednesday)
$trigger = New-ScheduledTaskTrigger -Weekly `
  -DaysOfWeek Monday,Wednesday -At "08:00AM"

# Run on event (e.g. when Event ID 4625 occurs — failed login)
$cimTrigger = New-ScheduledTaskTrigger -OnEvent `
  -Subscription '<QueryList><Query><Select Path="Security">*[System[EventID=4625]]</Select></Query></QueryList>'

List and Find Tasks

# All tasks
Get-ScheduledTask | Select-Object TaskName, State, TaskPath

# Only enabled tasks
Get-ScheduledTask | Where-Object {$_.State -ne "Disabled"}

# Tasks in root (user-created)
Get-ScheduledTask | Where-Object {$_.TaskPath -eq "\"}

# Last run result and time
Get-ScheduledTask | ForEach-Object {
  $info = $_ | Get-ScheduledTaskInfo
  [PSCustomObject]@{
    Name       = $_.TaskName
    LastRun    = $info.LastRunTime
    LastResult = $info.LastTaskResult
    NextRun    = $info.NextRunTime
  }
} | Sort-Object LastRun -Descending | Select-Object -First 10

Run, Disable, Delete

# Run immediately
Start-ScheduledTask -TaskName "DailyScript"

# Disable (keeps task, stops it running)
Disable-ScheduledTask -TaskName "DailyScript"

# Enable
Enable-ScheduledTask -TaskName "DailyScript"

# Delete permanently
Unregister-ScheduledTask -TaskName "DailyScript" -Confirm:$false

Modify Existing Task

# Change trigger time
$task = Get-ScheduledTask -TaskName "DailyScript"
$task.Triggers[0].StartBoundary = "2026-06-01T08:00:00"
$task | Set-ScheduledTask

# Change action script
Set-ScheduledTask -TaskName "DailyScript" `
  -Action (New-ScheduledTaskAction -Execute "powershell.exe" `
    -Argument "-File C:\Scripts\new-script.ps1")

Run Task as Different User

# Run as specific user with password
$principal = New-ScheduledTaskPrincipal `
  -UserId "DOMAIN\ServiceAccount" `
  -LogonType Password `
  -RunLevel Highest

Register-ScheduledTask -TaskName "ServiceTask" `
  -Action $action -Trigger $trigger -Principal $principal `
  -Password "ServicePassword123!"

View Task History

# Enable task history (disabled by default)
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true

# View task history
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 20 |
  Where-Object {$_.Id -in @(100, 102, 103, 200, 201)} |
  Select-Object TimeCreated, Id, Message | Format-List

Summary

Use New-ScheduledTaskAction/Trigger/Principal then Register-ScheduledTask. List with Get-ScheduledTask. Check results with Get-ScheduledTaskInfo. Enable task history with wevtutil. SYSTEM account for tasks that must run without user login.

Frequently Asked Questions

My scheduled task runs fine when I trigger it manually but not on schedule — why?

Most common causes: user account doesn't have "Log on as batch job" right, or the task is set to run only when user is logged in. Check the Principal settings — use SYSTEM or "Run whether user is logged on or not".

How do I see the exit code of a scheduled task?

Get-ScheduledTaskInfo -TaskName "TaskName" | Select-Object LastTaskResult. Code 0 = success. Non-zero = error. Check the task's action arguments for typos if it fails.

Can scheduled tasks run PowerShell scripts silently (no window)?

Yes: use -WindowStyle Hidden in the action: -Argument "-WindowStyle Hidden -File C:\script.ps1".

Related articles

← All articles