- Visão geral
- Convenção de variáveis
- Passo 1: Registro da tarefa e configurações básicas
- Passo 2: Execução acionada por evento (com modelo XML)
- Passo 3: Combinação de gatilhos condicionais e condições de execução
- Passo 4: Controle de tarefas existentes
- Habilitar o log operacional (Operational)
- Passo 5: Troubleshooting e verificação de logs
- Passo 6: Configurações recomendadas
- Conclusão
Visão geral
Este artigo explica técnicas avançadas de automação com o Agendador de Tarefas do Windows.
Cobrimos gatilhos condicionais, execução acionada por logs de eventos, registro e controle de tarefas via PowerShell e práticas de operação com foco em segurança.
Convenção de variáveis
| Variável | Exemplo | Observação |
|---|---|---|
<<TASK_NAME>> |
Daily-Backup |
Nome da tarefa |
<<SCRIPT_PATH>> |
C:\Scripts\backup.ps1 |
Caminho do script |
<<EVENT_ID>> |
4625 |
ID de evento alvo |
<<USERNAME>> |
Administrator |
Usuário executor |
<<TASK_PATH>> |
\MyCompany\Maintenance |
Pasta de registro da tarefa (opcional) |
Passo 1: Registro da tarefa e configurações básicas
Para registrar tarefas com PowerShell, combine principalmente três cmdlets:
| Cmdlet | Função principal |
|---|---|
New-ScheduledTaskAction |
Define o programa/script a executar |
New-ScheduledTaskTrigger |
Define o momento de execução (tempo/evento) |
Register-ScheduledTask |
Registra a tarefa completa (Action + Trigger + Settings) |
① Opções de New-ScheduledTaskAction
| Opção | Descrição | Exemplo |
|---|---|---|
-Execute |
Executável | "powershell.exe" |
-Argument |
Argumentos de linha de comando | "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>" |
-WorkingDirectory |
Diretório de trabalho | "C:\Scripts" |
-Id |
Identificador da ação (quando múltiplas) | "Action1" |
💡 Para várias ações, crie múltiplos objetos
New-ScheduledTaskActione passe-os como uma matriz.
② Opções de New-ScheduledTaskTrigger
| Opção | Descrição | Exemplo |
|---|---|---|
-Daily |
Executa diariamente | usar com -At 3:00AM |
-Weekly |
Executa semanalmente | -DaysOfWeek Monday,Wednesday |
-Once |
Executa uma vez | -At (Get-Date).AddHours(1) |
-AtStartup |
Na inicialização do sistema | — |
-AtLogOn |
No logon do usuário | — |
-RepetitionInterval |
Intervalo de repetição | (New-TimeSpan -Minutes 30) |
-RepetitionDuration |
Duração total da repetição | (New-TimeSpan -Days 1) |
-RandomDelay |
Atraso aleatório | (New-TimeSpan -Minutes 5) |
-StartBoundary / -EndBoundary |
Período de validade | "2025-01-01T00:00:00" |
⚠️
-RepetitionIntervale-RepetitionDurationsó se aplicam a certos tipos de gatilho (p.ex., Daily/Once).
③ New-ScheduledTaskSettingsSet (opcional)
| Opção | Descrição | Exemplo |
|---|---|---|
-AllowStartIfOnBatteries |
Permitir execução com bateria | $false |
-DontStopIfGoingOnBatteries |
Continuar ao alternar para bateria | $false |
-StartWhenAvailable |
Iniciar quando possível | $true |
-Hidden |
Ocultar tarefa | $true |
-RunOnlyIfNetworkAvailable |
Exigir rede disponível | $true |
-ExecutionTimeLimit |
Tempo máx. de execução | (New-TimeSpan -Hours 2) |
-MultipleInstances |
Política de múltiplas instâncias (IgnoreNew/Parallel/Queue) | "IgnoreNew" |
-RestartCount / -RestartInterval |
Tentativas de reinício e intervalo | 3, (New-TimeSpan -Minutes 5) |
💡
New-ScheduledTaskSettingsSetgera o objeto de configurações que vai em-Settings, centralizando energia, rede e retentativas.
④ Opções de Register-ScheduledTask
| Opção | Descrição | Exemplo |
|---|---|---|
-TaskName |
Nome de registro | "Daily-Backup" |
-TaskPath |
Pasta da tarefa | "\MyCompany\Maintenance" |
-Action |
Ação(ões) definidas | $action |
-Trigger |
Gatilho(s) definido(s) | $trigger |
-Settings |
Configurações adicionais | $settings |
-Description |
Descrição administrativa | "Daily maintenance backup task" |
-User |
Usuário executor | "SYSTEM" ou "Administrator" |
-RunLevel |
Nível de privilégios | Highest |
-Force |
Sobrescrever se existir | — |
💡 A tarefa completa resulta da combinação de Action, Trigger e Settings.
⑤ Exemplo de configuração
# Ação
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
# Gatilho (diariamente às 03:00)
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM
# Registro
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
-TaskPath "<<TASK_PATH>>\Daily" `
-Action $action -Trigger $trigger `
-User "<<USERNAME>>" -Description "Tarefa diária agendada às 03:00"
⑥ Pontos de atenção
- Use
-ExecutionPolicy Bypassapenas internamente; considere scripts assinados. - Prefira SYSTEM ou uma conta de serviço dedicada.
-RepetitionIntervalmínimo é 1 minuto; limite padrão de-RepetitionDurationé 1 dia.- Para sobrescrever, especifique
-Force. -RunLevel Highestsó para rotinas que exigem privilégios de administrador.
Passo 2: Execução acionada por evento (com modelo XML)
O New-ScheduledTaskTrigger do PowerShell ainda não aceita gatilho por evento (p.ex., -OnEvent).
Para usar gatilho por evento, importe uma definição XML.
Registro:
$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author><<USERNAME>></Author>
<Description>Executa o script quando ocorrer a EventID <<EVENT_ID>></Description>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><![CDATA[
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=<<EVENT_ID>>)]]</Select>
</Query>
</QueryList>
]]></Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>SYSTEM</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>-NoProfile -ExecutionPolicy Bypass -File "<<SCRIPT_PATH>>"</Arguments>
</Exec>
</Actions>
</Task>
'@
Register-ScheduledTask -TaskName "<<TASK_NAME>>" -TaskPath "<<TASK_PATH>>\OnEvent" -Xml $xml -User "SYSTEM"
Passo 3: Combinação de gatilhos condicionais e condições de execução
Defina as “condições” da tarefa (energia, rede, ociosidade) com New-ScheduledTaskSettingsSet.
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries:$false `
-DontStopIfGoingOnBatteries:$false `
-StartWhenAvailable:$true `
-Hidden:$false `
-RunOnlyIfNetworkAvailable:$true `
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
Register-ScheduledTask -TaskName "<<TASK_NAME>>_Cond" `
-TaskPath "<<TASK_PATH>>\Conditional" `
-Action $action -Trigger $trigger -Settings $settings `
-User "<<USERNAME>>" -Description "Tarefa condicional (rede obrigatória / alimentação AC)"
Exemplos de condições
| Condição | Parâmetro | Descrição |
|---|---|---|
| Somente com alimentação AC | -AllowStartIfOnBatteries:$false |
Não executa na bateria |
| Rede obrigatória | -RunOnlyIfNetworkAvailable:$true |
Falha quando sem conectividade |
| Executar apenas em idle | XML ou via COM | Suporte nativo limitado no PowerShell |
| Tempo máximo de execução | -ExecutionTimeLimit |
Evita processos sem fim |
| Retentativas | Edição via XML ou trigger de repetição | Há limitações no PowerShell puro |
Passo 4: Controle de tarefas existentes
Gerencie e monitore tarefas em operação via PowerShell.
# Listar tarefas
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"
# Habilitar / desabilitar
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"
# Estado de execução
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult
Habilitar o log operacional (Operational)
O canal Microsoft-Windows-TaskScheduler/Operational pode vir desabilitado por padrão.
Habilite-o para troubleshooting e histórico detalhado.
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
Passo 5: Troubleshooting e verificação de logs
Procedimento quando a tarefa não funciona como esperado.
# Último resultado de execução
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"
# Consultar o log operacional do Agendador
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
Where-Object { $_.Message -match "<<TASK_NAME>>" } |
Select-Object TimeCreated, Id, Message | Format-Table -AutoSize
Causas comuns e contramedidas
| Causa | Ação |
|---|---|
| Falta de permissões | Revisar privilégios / usar conta de serviço |
| ExecutionPolicy bloqueia | Script assinado ou -ExecutionPolicy Bypass |
TaskPath/descrição ausentes |
Definir -TaskPath e -Description para gestão clara |
| Gatilho de evento inoperante | Validar XML e filtro do evento |
| Condições em conflito | Revisar lógica de triggers e condições |
Passo 6: Configurações recomendadas
- Use SYSTEM ou conta de serviço dedicada, seguindo princípio do menor privilégio.
- Adicione logging e tratamento de exceções aos scripts; registre sucesso/falha.
- Versione definições de tarefas como modelos XML (p.ex., GitHub).
- Monitore periodicamente com
Get-ScheduledTaskInfoe gere alertas em anomalias. - Remova tarefas obsoletas com
Unregister-ScheduledTaske mantenha a biblioteca organizada.
Conclusão
O Agendador de Tarefas do Windows vai além de execuções cronometradas.
Com gatilhos por evento, execução condicional e integração ao PowerShell, ele se torna uma base robusta de automação.
Ao padronizar registro, gestão e monitoramento por código, você obtém reprodutibilidade, governança e segurança na operação.
