Task Scheduler: Automation on Windows Server

Task Scheduler is Windows equivalent of cron. It allows you to run scripts, commands and programs automatically at scheduled times or in response to system events.

02

Open Task Scheduler

powershell
# Via run
taskschd.msc

# Via PowerShell
Get-ScheduledTask | Where-Object State -eq "Running"
03

Create a Task via PowerShell

PowerShell is the most reliable and scriptable method to create tasks.

Basic Structure

powershell
# 1. Define action (what to execute)
$action = New-ScheduledTaskAction `
  -Execute "powershell.exe" `
  -Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\backup.ps1"

# 2. Define trigger (when to execute)
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00AM"

# 3. Define settings
$settings = New-ScheduledTaskSettingsSet `
  -ExecutionTimeLimit (New-TimeSpan -Hours 2) `
  -RestartCount 3 `
  -RestartInterval (New-TimeSpan -Minutes 5)

# 4. Register the task
Register-ScheduledTask `
  -TaskName "Nightly Backup" `
  -Action $action `
  -Trigger $trigger `
  -Settings $settings `
  -RunLevel Highest `
  -User "SYSTEM"
04

Trigger Types

Fixed Schedule (daily, weekly, monthly)

powershell
# Every day at 3:00 AM
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00AM"

# Every Monday at 8:30 AM
$trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 1 `
  -DaysOfWeek Monday -At "08:30AM"

# First day of month at 00:00
$trigger = New-ScheduledTaskTrigger -Monthly -DaysOfMonth 1 -At "00:00AM"

# Every hour (use RepetitionInterval)
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) `
  -RepetitionInterval (New-TimeSpan -Hours 1) `
  -RepetitionDuration ([TimeSpan]::MaxValue)

At Boot / Login

powershell
# At system startup
$trigger = New-ScheduledTaskTrigger -AtStartup

# At specific user login
$trigger = New-ScheduledTaskTrigger -AtLogOn -User "DOMAIN\user"

On System Event

powershell
# When specific event is written to log
$trigger = New-ScheduledTaskTrigger -AtEvent `
  -LogName "System" -Source "Service Control Manager" -EventId 7036
05

Practical Examples

SQL Server Express Backup (no SQL Agent)

powershell
# Create backup script
$backupScript = @'
$date = Get-Date -Format "yyyyMMdd_HHmm"
$backupPath = "C:\Backup\DB_$date.bak"
Invoke-Sqlcmd -ServerInstance "localhost" -Query "BACKUP DATABASE MyDb TO DISK='$backupPath' WITH FORMAT, COMPRESSION"
# Delete backups older than 7 days
Get-ChildItem "C:\Backup\*.bak" | Where-Object LastWriteTime -lt (Get-Date).AddDays(-7) | Remove-Item
'@
$backupScript | Out-File "C:\Scripts\backup-sql.ps1" -Encoding utf8

# Create task
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
  -Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\backup-sql.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00AM"
Register-ScheduledTask -TaskName "SQL Nightly Backup" `
  -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest

Weekly IIS Log Cleanup

powershell
$cleanScript = @'
$logPath = "C:\inetpub\logs\LogFiles"
Get-ChildItem $logPath -Recurse -Filter "*.log" |
  Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) |
  Remove-Item -Force
'@
$cleanScript | Out-File "C:\Scripts\clean-iis-logs.ps1" -Encoding utf8

$action = New-ScheduledTaskAction -Execute "powershell.exe" `
  -Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\clean-iis-logs.ps1"
$trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 1 `
  -DaysOfWeek Sunday -At "03:00AM"
Register-ScheduledTask -TaskName "IIS Log Cleanup" `
  -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest

Auto-Restart Service if Offline

powershell
$watchScript = @'
$service = "W3SVC"
if ((Get-Service $service).Status -ne "Running") {
  Start-Service $service
  Write-EventLog -LogName Application -Source "TaskScheduler" `
    -EventId 1001 -EntryType Warning -Message "Service $service restarted automatically"
}
'@
$watchScript | Out-File "C:\Scripts\watch-iis.ps1" -Encoding utf8

$action = New-ScheduledTaskAction -Execute "powershell.exe" `
  -Argument "-NonInteractive -ExecutionPolicy Bypass -File C:\Scripts\watch-iis.ps1"
# Every 5 minutes
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) `
  -RepetitionInterval (New-TimeSpan -Minutes 5) `
  -RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName "Watch IIS" `
  -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest
06

Manage Existing Tasks

powershell
# List all tasks
Get-ScheduledTask

# Filter by state
Get-ScheduledTask | Where-Object State -eq "Disabled"
Get-ScheduledTask | Where-Object State -eq "Ready"

# Run task manually
Start-ScheduledTask -TaskName "Nightly Backup"

# Enable / Disable
Enable-ScheduledTask -TaskName "Nightly Backup"
Disable-ScheduledTask -TaskName "Nightly Backup"

# Delete task
Unregister-ScheduledTask -TaskName "Nightly Backup" -Confirm:$false

# View last result
(Get-ScheduledTaskInfo -TaskName "Nightly Backup").LastTaskResult
# 0 = success, any other value = error
07

PowerShell Execution Permissions

If PowerShell scripts don't run, check execution policy:

powershell
# View current policy
Get-ExecutionPolicy -List

# Enable signed or local scripts for system
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine

# Or, for task only, use -ExecutionPolicy Bypass flag in action
08

Logs and Debug

powershell
# View task execution history (last 10 runs)
Get-ScheduledTaskInfo -TaskName "Nightly Backup"

# Detailed log in Event Viewer
# Event Viewer → Applications and Services Logs
#           → Microsoft → Windows → TaskScheduler → Operational

# Enable operational log if disabled
wevtutil set-log "Microsoft-Windows-TaskScheduler/Operational" /enabled:true

0x1: script not found or generic error. 0x41301: task still running (timeout). 0x8007010B: directory not found. Always check absolute path of scripts.

DeluxHost, gegründet 2023, bietet hochwertige Hosting-Lösungen für verschiedene digitale Anforderungen. Wir bieten Shared Hosting, VPS und dedizierte Server mit erweiterter Sicherheit und globalen Rechenzentren.

© DeluxHost, Alle Rechte vorbehalten. | USt-IdNr.: IT17734661006
Alle Systeme betriebsbereit