Windows Scheduled Tasks
This guide explains how to automate tasks on your Windows VPS with Task Scheduler.
Access Task Schedulerβ
Win + R>taskschd.msc- Or search for "Task Scheduler"
Create a Simple Taskβ
Via GUIβ
- In the right panel, click Create Basic Task...
- Name: Give a descriptive name
- Trigger: Choose the frequency
- Daily, Weekly, Monthly, etc.
- Action: Select Start a program
- Program/script: Path to the executable or script
- Finish
Example: Daily Backupβ
- Name: "Daily Backup"
- Trigger: Daily at 03:00
- Action:
C:\Scripts\backup.bat
Create an Advanced Taskβ
For more options, use Create Task...
General Tabβ
- Name: Task name
- Run whether user is logged on or not: Check for server tasks
- Run with highest privileges: For tasks requiring admin rights
Triggers Tabβ
Click New... to add triggers:
- On a schedule: Fixed time
- At startup: When the server starts
- At log on: When a user logs in
- On an event: In response to a Windows event
Actions Tabβ
- Start a program: Run a script or application
- Send an e-mail: (deprecated, use a PowerShell script)
- Display a message: (deprecated)
Conditions Tabβ
- Start the task only if the computer is idle
- Start only if on AC power
- Wake the computer to run this task
Settings Tabβ
- Allow task to be run on demand
- Run task as soon as possible after a scheduled start is missed
- Stop the task if it runs longer than: Timeout
PowerShell: Task Managementβ
Create a Taskβ
# Define the action
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\backup.ps1"
# Define the trigger (every day at 3 AM)
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
# Define settings
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hours 1)
# Create the task
Register-ScheduledTask -TaskName "Daily Backup" -Action $action -Trigger $trigger -Settings $settings -User "SYSTEM" -RunLevel Highest
Trigger Examplesβ
# At system startup
$trigger = New-ScheduledTaskTrigger -AtStartup
# Every hour
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1) -RepetitionDuration (New-TimeSpan -Days 365)
# Every Monday at 8 AM
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 8am
# 1st of every month
$trigger = New-ScheduledTaskTrigger -Monthly -DaysOfMonth 1 -At 00:00
Manage Existing Tasksβ
# List all tasks
Get-ScheduledTask
# View task details
Get-ScheduledTask -TaskName "Daily Backup" | Get-ScheduledTaskInfo
# Run a task manually
Start-ScheduledTask -TaskName "Daily Backup"
# Disable a task
Disable-ScheduledTask -TaskName "Daily Backup"
# Enable a task
Enable-ScheduledTask -TaskName "Daily Backup"
# Delete a task
Unregister-ScheduledTask -TaskName "Daily Backup" -Confirm:$false
Useful Scriptsβ
Backup Scriptβ
Create C:\Scripts\backup.ps1:
# Configuration
$source = "C:\inetpub\wwwroot"
$destination = "C:\Backups"
$date = Get-Date -Format "yyyy-MM-dd_HH-mm"
$backupFile = "$destination\backup_$date.zip"
# Create destination folder if needed
if (!(Test-Path $destination)) {
New-Item -ItemType Directory -Path $destination
}
# Create archive
Compress-Archive -Path $source -DestinationPath $backupFile -Force
# Delete backups older than 7 days
Get-ChildItem $destination -Filter "*.zip" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item
# Log
Add-Content -Path "C:\Scripts\backup.log" -Value "$(Get-Date): Backup created - $backupFile"
Service Restart Scriptβ
# C:\Scripts\restart-service.ps1
$serviceName = "MyService"
Stop-Service -Name $serviceName -Force
Start-Sleep -Seconds 5
Start-Service -Name $serviceName
# Log
$status = Get-Service -Name $serviceName
Add-Content -Path "C:\Scripts\service.log" -Value "$(Get-Date): $serviceName - $($status.Status)"
Log Cleanup Scriptβ
# C:\Scripts\cleanup-logs.ps1
$logFolders = @(
"C:\inetpub\logs\LogFiles",
"C:\Windows\Temp"
)
$daysToKeep = 30
foreach ($folder in $logFolders) {
Get-ChildItem $folder -Recurse -File | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-$daysToKeep)
} | Remove-Item -Force
}
Add-Content -Path "C:\Scripts\cleanup.log" -Value "$(Get-Date): Cleanup completed"
Disk Monitoring Scriptβ
# C:\Scripts\disk-check.ps1
$threshold = 80
$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'"
$usedPercent = [math]::Round(($disk.Size - $disk.FreeSpace) / $disk.Size * 100)
if ($usedPercent -gt $threshold) {
# Send an alert email
$smtpServer = "smtp.example.com"
$from = "server@example.com"
$to = "admin@example.com"
$subject = "VPS Disk Alert"
$body = "Drive C: is at $usedPercent% capacity."
Send-MailMessage -SmtpServer $smtpServer -From $from -To $to -Subject $subject -Body $body
}
Common Use Casesβ
Restart a Game Server Every 6 Hoursβ
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command Restart-Service -Name 'FiveM'"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 6) -RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName "Restart FiveM" -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest
Run a Script at Startupβ
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\startup.ps1"
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries
Register-ScheduledTask -TaskName "Startup Script" -Action $action -Trigger $trigger -Settings $settings -User "SYSTEM" -RunLevel Highest
View Execution Logsβ
# Task history
Get-ScheduledTask -TaskName "Daily Backup" | Get-ScheduledTaskInfo
# View in Event Viewer
eventvwr.msc
# Then: Applications and Services Logs > Microsoft > Windows > TaskScheduler > Operational
Troubleshootingβ
Task Doesn't Runβ
- Verify the user has permissions
- Check "Run whether user is logged on or not"
- Verify paths (use absolute paths)
- Check Event Viewer
Error 0x1β
The script ended with an error. Test the script manually.
"Access Denied" Errorβ
Run with highest privileges and/or use the SYSTEM account.
Tip
Always test your scripts manually before scheduling them, and use log files to track their execution.