Agendando tarefas no Windows com PowerShell e Task Scheduler
1. Introdução ao Task Scheduler e PowerShell
O Agendador de Tarefas do Windows (Task Scheduler) é um componente essencial para automação de processos no sistema operacional Windows. Ele permite executar programas, scripts e comandos em horários específicos, em resposta a eventos do sistema ou em intervalos regulares. Quando combinado com o PowerShell, o Task Scheduler se torna ainda mais poderoso, oferecendo automação programática completa.
Utilizar o PowerShell para gerenciar tarefas agendadas oferece diversas vantagens: repetibilidade, versionamento de scripts, integração com pipelines de CI/CD e a capacidade de criar, modificar e remover tarefas em lote. O módulo ScheduledTasks fornece cmdlets nativos para essa finalidade, disponível no Windows 10, Windows Server 2016 e versões posteriores.
Pré-requisitos:
- Windows PowerShell 5.1 ou PowerShell 7+
- Módulo ScheduledTasks (carregado automaticamente)
- Permissões administrativas para criar/alterar tarefas no sistema
- Política de execução que permita scripts (Set-ExecutionPolicy RemoteSigned)
Para verificar se o módulo está disponível:
Get-Module -ListAvailable -Name ScheduledTasks
Import-Module ScheduledTasks
2. Criando tarefas básicas com cmdlets do PowerShell
A criação de uma tarefa agendada envolve três componentes principais: gatilho (trigger), ação (action) e o registro da tarefa propriamente dito.
Exemplo básico: Executar um script de backup toda noite às 23h.
$trigger = New-ScheduledTaskTrigger -Daily -At "23:00"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-File `"C:\Scripts\backup.ps1`""
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "BackupDiario" `
-Trigger $trigger `
-Action $action `
-Principal $principal `
-Description "Backup automático de arquivos"
Gatilhos comuns:
- -Daily -At "08:00" — execução diária
- -Weekly -WeeksInterval 1 -DaysOfWeek Monday -At "06:00" — semanal
- -AtLogOn — quando o usuário faz logon
- -AtStartup — na inicialização do sistema
Ações suportadas: executar programa, enviar email (obsoleto) ou exibir mensagem.
3. Gerenciando tarefas existentes
O PowerShell oferece cmdlets intuitivos para gerenciar tarefas já registradas.
Listando tarefas:
Get-ScheduledTask | Where-Object {$_.State -eq "Ready"} | Format-Table TaskName, State
Habilitando/desabilitando:
Disable-ScheduledTask -TaskName "BackupDiario"
Enable-ScheduledTask -TaskName "BackupDiario"
Removendo tarefas:
Unregister-ScheduledTask -TaskName "BackupDiario" -Confirm:$false
Obtendo detalhes completos:
Get-ScheduledTask -TaskName "BackupDiario" | Select-Object *
4. Configurações avançadas de gatilhos e condições
Para cenários mais complexos, é possível criar gatilhos baseados em eventos específicos do sistema.
Gatilho por evento do sistema (ID 100 do log System):
$trigger = New-ScheduledTaskTrigger -AtStartup
$trigger = New-ScheduledTaskTrigger -Custom -RepetitionInterval (New-TimeSpan -Minutes 30) `
-RepetitionDuration (New-TimeSpan -Days 1)
Condições de execução avançadas: controlam quando a tarefa deve ou não executar.
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries:$false `
-StopIfGoingOnBatteries:$true `
-RunOnlyIfNetworkAvailable:$true `
-IdleDuration (New-TimeSpan -Minutes 10) `
-IdleWaitTimeout (New-TimeSpan -Minutes 30)
Register-ScheduledTask -TaskName "LimpezaLogs" `
-Trigger $trigger `
-Action $action `
-Settings $settings
Repetição e duração: útil para tarefas que devem ser executadas múltiplas vezes.
$trigger.RepetitionInterval = New-TimeSpan -Minutes 15
$trigger.RepetitionDuration = New-TimeSpan -Hours 2
5. Trabalhando com credenciais e segurança
Executar tarefas com contas específicas e privilégios adequados é crucial para segurança.
Usando New-ScheduledTaskPrincipal:
$principal = New-ScheduledTaskPrincipal -UserId "DOMINIO\Usuario" `
-LogonType Password `
-RunLevel Highest
Armazenando credenciais de forma segura:
$cred = Get-Credential
$cred | Export-Clixml -Path "C:\Segredos\credencial.xml"
# Recuperando posteriormente
$cred = Import-Clixml -Path "C:\Segredos\credencial.xml"
Executando com conta de sistema:
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
6. Automação de scripts PowerShell como tarefas agendadas
Scripts .ps1 são os candidatos ideais para automação via Task Scheduler.
Criando tarefa que executa script com argumentos:
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File `"C:\Scripts\relatorio.ps1`" -Param1 Valor1 -Param2 Valor2"
Configurando política de execução: para evitar erros, configure o sistema para permitir scripts.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
Logging e saída: redirecione a saída para arquivos de log.
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-File `"C:\Scripts\processo.ps1`" >> `"C:\Logs\processo_$(Get-Date -Format yyyyMMdd).log`" 2>&1"
7. Monitoramento e manutenção de tarefas
Manter o controle sobre a execução das tarefas é fundamental para garantir que a automação está funcionando.
Verificando histórico de execução:
Get-ScheduledTaskInfo -TaskName "BackupDiario" | Format-List *
Tratamento de falhas e notificações: inclua lógica de notificação no próprio script.
try {
# Código do backup
# Se falhar, envia email
Send-MailMessage -To "admin@empresa.com" `
-Subject "Falha no backup" `
-Body "O backup não foi concluído." `
-SmtpServer "smtp.empresa.com"
} catch {
Write-EventLog -LogName Application -Source "BackupScript" `
-EventId 1001 -EntryType Error -Message $_.Exception.Message
}
Exportando e importando tarefas (XML):
# Exportar
Export-ScheduledTask -TaskName "BackupDiario" | Out-File "C:\BackupTarefas\BackupDiario.xml"
# Importar
Register-ScheduledTask -Xml (Get-Content "C:\BackupTarefas\BackupDiario.xml" -Raw) `
-TaskName "BackupDiario"
8. Exemplos práticos e boas práticas
Exemplo 1: Backup automático de diretório toda noite
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-File `"C:\Scripts\backup_diario.ps1`""
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount
Register-ScheduledTask -TaskName "Backup_Arquivos_Criticos" `
-Trigger $trigger -Action $action -Principal $principal `
-Description "Backup dos arquivos do servidor"
Exemplo 2: Limpeza de logs do sistema semanalmente
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At "03:00"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-Command `"Get-EventLog -LogName System -After (Get-Date).AddDays(-7) | Clear-EventLog`""
Register-ScheduledTask -TaskName "Limpeza_Logs_Sistema" `
-Trigger $trigger -Action $action
Boas práticas:
- Nomenclatura consistente: use prefixos como Backup_, Limpeza_, Monitor_
- Documentação: mantenha um script mestre com todas as tarefas registradas
- Testes: execute cada tarefa manualmente antes de agendar
- Versionamento: salve os scripts de criação em repositório Git
- Logs centralizados: configure todas as tarefas para escrever logs no mesmo diretório
- Notificações: implemente alertas para falhas críticas
Referências
- Documentação oficial do módulo ScheduledTasks (Microsoft) — Referência completa de todos os cmdlets para gerenciamento de tarefas agendadas com PowerShell
- Agendador de Tarefas do Windows: guia completo (Microsoft Learn) — Documentação técnica sobre o Task Scheduler, incluindo conceitos e APIs
- PowerShell: Criando e gerenciando tarefas agendadas (4sysops) — Tutorial prático com exemplos de criação e gerenciamento de tarefas
- Automatizando tarefas com PowerShell e Task Scheduler (Scripting Guy) — Artigo do blog oficial da Microsoft com dicas avançadas
- Segurança em tarefas agendadas: boas práticas (Petri IT Knowledgebase) — Guia sobre como configurar credenciais e permissões de forma segura
- Exportando e importando tarefas agendadas (Windows OS Hub) — Tutorial sobre backup e restauração de tarefas usando XML