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.
Articoli correlati
Windows Server
Windows VPS: Performance Tweaks
Optimizations and tweaks to improve Windows Server VPS performance
4 min di lettura
Windows Server
Change Language to English on Windows Server
How to set English as primary language on Windows Server VPS
2 min di lettura
Windows Server
RDP: Access, Port, Multi-User and Issues
Complete guide to Remote Desktop on Windows Server - connection, port change, multiple simultaneous users and troubleshooting
4 min di lettura
