about_Scheduled_Jobs_Troubleshooting
Descrição breve
Explica como resolver problemas com trabalhos agendados
Descrição longa
Este documento descreve alguns dos problemas que você pode enfrentar ao usar os recursos de trabalho agendado do PowerShell e sugere soluções para esses problemas.
Antes de usar trabalhos agendados do PowerShell, consulte about_Scheduled_Jobs e os trabalhos agendados relacionados sobre tópicos.
Para obter mais informações sobre os cmdlets contidos no módulo PSScheduledJob , consulte PSScheduledJob.
Não é possível encontrar resultados de trabalho
Método básico para obter resultados de trabalho no PowerShell
Quando um trabalho agendado é executado, ele cria uma instância do trabalho agendado. Para exibir, gerenciar e obter os resultados de instâncias de trabalho agendadas, use os cmdlets Job.
Observação
Para usar os cmdlets Job em instâncias de trabalhos agendados, o módulo PSScheduledJob deve ser importado para a sessão. Para importar o módulo PSScheduledJob , digite Import-Module PSScheduledJob
ou use qualquer cmdlet de trabalho agendado, como Get-ScheduledJob
.
Para obter uma lista de todas as instâncias de um trabalho agendado, use o Get-Job
cmdlet.
Import-Module PSScheduledJob
Get-Job ProcessJob
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
43 ProcessJob PSScheduledJob Completed False localhost
44 ProcessJob PSScheduledJob Completed False localhost
45 ProcessJob PSScheduledJob Completed False localhost
46 ProcessJob PSScheduledJob Completed False localhost
47 ProcessJob PSScheduledJob Completed False localhost
48 ProcessJob PSScheduledJob Completed False localhost
49 ProcessJob PSScheduledJob Completed False localhost
50 ProcessJob PSScheduledJob Completed False localhost
O Get-Job
cmdlet envia objetos ProcessJob pelo pipeline. O Format-Table
cmdlet exibe as propriedades Name, ID e PSBeginTime de uma instância de trabalho agendada em uma tabela.
Get-Job ProcessJob | Format-Table -Property Name, ID, PSBeginTime -Auto
Name Id PSBeginTime
---- -- ---------
ProcessJob 43 11/2/2011 3:00:02 AM
ProcessJob 44 11/3/2011 3:00:02 AM
ProcessJob 45 11/4/2011 3:00:02 AM
ProcessJob 46 11/5/2011 3:00:02 AM
ProcessJob 47 11/6/2011 3:00:02 AM
ProcessJob 48 11/7/2011 12:00:01 AM
ProcessJob 49 11/7/2011 3:00:02 AM
ProcessJob 50 11/8/2011 3:00:02 AM
Para obter os resultados de uma instância de um trabalho agendado, use o Receive-Job
cmdlet. O comando a seguir obtém os resultados da instância mais recente do ProcessJob (ID = 50).
Receive-Job -ID 50
Método básico para localizar resultados de trabalho no disco
Para gerenciar trabalhos agendados, use os cmdlets de trabalho, como Get-Job
e Receive-Job
.
Se Get-Job
não obtiver a instância do trabalho ou Receive-Job
não obtiver os resultados do trabalho, você poderá pesquisar os arquivos de histórico de execução para o trabalho no disco.
O histórico de execução contém um registro de todas as instâncias de trabalho acionadas.
Verifique se há um diretório nomeado com carimbo de data/hora no diretório para um trabalho agendado no seguinte caminho:
$HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
Por exemplo:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob\<ScheduledJobName>\Output
Por exemplo, o Get-ChildItem
cmdlet obtém o histórico de execução em disco do trabalho agendado ProcessJob .
$Path = '$HOME\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output'
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/2/2011 3:00 AM 20111102-030002-260
d---- 11/3/2011 3:00 AM 20111103-030002-277
d---- 11/4/2011 3:00 AM 20111104-030002-209
d---- 11/5/2011 3:00 AM 20111105-030002-251
d---- 11/6/2011 3:00 AM 20111106-030002-174
d---- 11/7/2011 12:00 AM 20111107-000001-914
d---- 11/7/2011 3:00 AM 20111107-030002-376
Cada diretório nomeado com carimbo de data/hora representa uma instância de trabalho. Os resultados de cada instância de trabalho são salvos em um arquivo Results.xml no diretório nomeado com carimbo de data/hora.
Por exemplo, o comando a seguir obtém os arquivos Results.xml para cada instância salva do trabalho agendado ProcessJob . Se o arquivo Results.xml estiver ausente, o PowerShell não poderá retornar ou exibir os resultados do trabalho.
$Path = '$HOME\AppData\Local\Microsoft\Windows\PowerShell'
$Path += '\ScheduledJobs\ProcessJob\Output\*\Results.xml'
Get-ChildItem $Path
Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output
O cmdlet de trabalho pode não ser capaz de obter instâncias de trabalho agendadas ou seus resultados porque o módulo PSScheduledJob não é importado para a sessão.
Observação
Antes de usar um cmdlet de trabalho em instâncias de trabalho agendadas, verifique se o módulo PSScheduledJob está incluído na sessão. Sem o módulo PSScheduledJob , os cmdlets de trabalho não podem obter instâncias de trabalho agendadas ou seus resultados.
Para importar o módulo PSScheduledJob :
Import-Module PSScheduledJob
O cmdlet Receive-Job pode já ter retornado os resultados
Se Receive-Job
não retornar os resultados da instância de trabalho, pode ser porque um Receive-Job
comando foi executado para essa instância de trabalho na sessão atual sem o parâmetro Keep .
Quando você usa Receive-Job
sem o parâmetro Keep, Receive-Job
retorna os resultados do trabalho e define a propriedade HasMoreData da instância de trabalho como False. O valor False significa que Receive-Job
retornou os resultados do trabalho e a instância não tem mais resultados a serem retornados. Essa configuração é apropriada para trabalhos em segundo plano padrão, mas não para instâncias de trabalhos agendados, que são salvos no disco.
Para obter os resultados da instância de trabalho novamente, inicie uma nova sessão do PowerShell digitando PowerShell
. Importe o módulo PSScheduledJob e tente o Receive-Job
comando novamente.
Receive-Job -ID 50
#No results
PowerShell.exe
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.
Import-Module PSScheduledJob
Receive-Job -ID 50
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Usando o parâmetro Keep para obter resultados mais de uma vez em uma sessão
Para obter o resultado de uma instância de trabalho mais de uma vez em uma sessão, use o parâmetro Keep do Receive-Job
cmdlet.
Import-Module PSScheduledJob
Receive-Job -ID 50 -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
Receive-Job -ID 50 -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1213 33 12348 21676 88 25.71 1608 CcmExec
29 4 1168 2920 43 0.02 748 conhost
46 6 2208 4612 45 0.03 1640 conhost
O trabalho agendado pode estar corrompido
Se um trabalho agendado for corrompido, o PowerShell excluirá o trabalho agendado corrompido e seus resultados. Não é possível recuperar os resultados de um trabalho agendado corrompido.
Para determinar se ainda existe um trabalho agendado, use o Get-ScheduledJob
cmdlet.
Get-ScheduledJob
O número de resultados pode ter excedido o ExecutionHistoryLength
A propriedade ExecutionHistoryLength de um trabalho agendado determina quantas instâncias de trabalho e seus resultados são salvos no disco. O valor padrão é 32. Quando o número de instâncias de um trabalho agendado excede esse valor, o PowerShell exclui a instância de trabalho mais antiga para liberar espaço para cada nova instância de trabalho.
Para obter o valor da propriedade ExecutionHistoryLength de um trabalho agendado, use o seguinte formato de comando:
(Get-ScheduledJob <JobName>).ExecutionHistoryLength
Por exemplo, o comando a seguir obtém o valor da propriedade ExecutionHistoryLength do trabalho agendado ProcessJob .
(Get-ScheduledJob ProcessJob).ExecutionHistoryLength
Para definir ou alterar o valor da propriedade ExecutionHistoryLength , use o parâmetro MaxResultCount dos Register-ScheduledJob
cmdlets e Set-ScheduledJob
.
O comando a seguir aumenta o valor da propriedade ExecutionHistoryLength para 50.
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
Os resultados da instância de trabalho podem ter sido excluídos
O parâmetro ClearExecutionHistory do Set-ScheduledJob
cmdlet exclui o histórico de execução de um trabalho. Você pode usar esse recurso para liberar espaço em disco ou excluir resultados que não são necessários ou que já são usados, analisados ou salvos em um local diferente.
Para excluir o histórico de execução de um trabalho agendado, use o parâmetro ClearExecutionHistory do trabalho agendado.
O comando a seguir exclui o histórico de execução do trabalho agendado ProcessJob .
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
Além disso, o cmdlet exclui os resultados do Remove-Job
trabalho. Quando você usa Remove-Job
para excluir um trabalho agendado, ele exclui todas as instâncias do trabalho no disco, incluindo o histórico de execução e todos os resultados do trabalho.
Os trabalhos iniciados usando o cmdlet Start-Job não são salvos no disco
Quando você usa Start-Job
para iniciar um trabalho agendado, em vez de usar um gatilho de trabalho, Start-Job
inicia um trabalho em segundo plano padrão. O trabalho em segundo plano e seus resultados não são armazenados no histórico de execução do trabalho no disco.
Você pode usar o Get-Job
cmdlet para obter o trabalho e o Receive-Job
cmdlet para obter os resultados do trabalho, mas os resultados estão disponíveis somente até que você os receba, a menos que você use o parâmetro Keep do Receive-Job
cmdlet.
Além disso, os trabalhos em segundo plano e seus resultados são específicos da sessão; eles existem apenas na sessão em que são criados. Se você excluir o trabalho com Remove-Job
, feche a sessão ou feche o PowerShell, a instância do trabalho e seus resultados serão excluídos.
O trabalho agendado não é executado
Os trabalhos agendados não serão executados automaticamente se o trabalho for acionado ou o trabalho agendado estiver desabilitado.
Use o Get-ScheduledJob
cmdlet para obter o trabalho agendado. Verifique se o valor da propriedade Enabled do trabalho agendado é True.
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1, 2} Get-Process True
(Get-ScheduledJob ProcessJob).Enabled
True
Use o Get-JobTrigger
cmdlet para obter os gatilhos de trabalho do trabalho agendado.
Verifique se o valor da propriedade Enabled do gatilho de trabalho é True.
Get-ScheduledJob ProcessJob | Get-JobTrigger
Id Frequency Time DaysOfWeek Enabled
-- --------- ---- ---------- -------
1 Weekly 11/7/2011 5:00:00 AM {Monday, Thursday} True
2 Daily 11/7/2011 3:00:00 PM True
Get-ScheduledJob ProcessJob|Get-JobTrigger|Format-Table ID, Enabled -Auto
Id Enabled
-- -------
1 True
2 True
Os trabalhos agendados não serão executados automaticamente se os gatilhos de trabalho forem inválidos
Por exemplo, um gatilho de trabalho pode especificar uma data no passado ou uma data que não ocorre, como a 5ª segunda-feira do mês.
Os trabalhos agendados não serão executados automaticamente se as condições do gatilho de trabalho ou as opções de trabalho não forem atendidas.
Por exemplo, um trabalho agendado que é executado somente quando um determinado usuário faz logon no computador não será executado se esse usuário não fizer logon ou se conectar apenas remotamente.
Examine as opções do trabalho agendado e certifique-se de que elas estejam satisfeitas. Por exemplo, um trabalho agendado que exige que o computador esteja ocioso ou exija uma conexão de rede, ou tenha um IdleDuration longo ou um breve IdleTimeout pode nunca ser executado.
Use o Get-ScheduledJobOption
cmdlet para examinar as opções de trabalho e seus valores.
Get-ScheduledJobOption -Name ProcessJob
StartIfOnBatteries : False
StopIfGoingOnBatteries : True
WakeToRun : True
StartIfNotIdle : True
StopIfGoingOffIdle : False
RestartOnIdleResume : False
IdleDuration : 00:10:00
IdleTimeout : 01:00:00
ShowInTaskScheduler : True
RunElevated : False
RunWithoutNetwork : True
DoNotAllowDemandStart : False
MultipleInstancePolicy : IgnoreNew
JobDefinition : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition
Para obter descrições das opções de trabalho agendado, consulte New-ScheduledJobOption.
A instância de trabalho agendada pode ter falhado
Se um comando de trabalho agendado falhar, o PowerShell o relatará imediatamente gerando uma mensagem de erro. No entanto, se o trabalho falhar quando o Agendador de Tarefas tentar executá-lo, o erro não estará disponível para o PowerShell.
Use os seguintes métodos para detectar e corrigir falhas de trabalho:
Verifique se há erros no log de eventos do Agendador de Tarefas. Para verificar o log, use o Visualizador de Eventos ou um comando do PowerShell, como o seguinte:
Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational |
Where {$_.Message -like "fail"}
Verifique o registro do trabalho no Agendador de Tarefas. Os trabalhos agendados do PowerShell são armazenados na seguinte pasta Tarefa Agendada:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
O trabalho agendado pode não ser executado devido a permissão insuficiente
Os trabalhos agendados são executados com as permissões do usuário que criou o trabalho ou as permissões do usuário especificado pelo parâmetro Credential no Register-ScheduledJob
comando or Set-ScheduledJob
.
Se esse usuário não tiver permissão para executar os comandos ou scripts, o trabalho falhará.
Não é possível obter o trabalho agendado ou o trabalho agendado está corrompido
Em raras ocasiões, os trabalhos agendados podem ser corrompidos ou conter contradições internas que não podem ser resolvidas. Normalmente, isso acontece quando os arquivos XML do trabalho agendado são editados manualmente, resultando em XML inválido.
Quando um trabalho agendado é corrompido, o PowerShell tenta excluir o trabalho agendado, seu histórico de execução e seus resultados do disco.
Se ele não puder remover o trabalho agendado, você receberá uma mensagem de erro de trabalho corrompido sempre que executar o Get-ScheduledJob
cmdlet.
Para remover um trabalho agendado corrompido, use um dos seguintes métodos:
Exclua o <ScheduledJobName>
diretório do trabalho agendado. Não exclua o diretório ScheduledJob .
A localização do diretório:
$env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
Por exemplo:
C:\Users<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>.
Use o Agendador de Tarefas para excluir o trabalho agendado. As tarefas agendadas do PowerShell aparecem no seguinte caminho do Agendador de Tarefas:
Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs<ScheduledJobName>
Os cmdlets de trabalho não conseguem localizar trabalhos agendados de forma consistente
Quando o módulo PSScheduledJob não está na sessão atual, os cmdlets de trabalho não podem obter trabalhos agendados, iniciá-los ou obter seus resultados.
Para importar o módulo PSScheduledJob , digite Import-Module PSScheduledJob
ou execute ou obtenha qualquer cmdlet no módulo, como o Get-ScheduledJob
cmdlet.
A partir do PowerShell 3.0, os módulos são importados automaticamente quando você obtém ou usa qualquer cmdlet no módulo.
Quando o módulo PSScheduledJob não está na sessão atual, a sequência de comandos a seguir é possível.
Get-Job ProcessJob
Get-Job : The command cannot find the job because the job name
ProcessJob was not found.
Verify the value of the Name parameter, and then try the command again.
+ CategoryInfo : ObjectNotFound: (ProcessJob:String) [Get-Job],
PSArgumentException
+ FullyQualifiedErrorId : JobWithSpecifiedNameNotFound,Microsoft.PowerShell.
Commands.GetJobCommand
Get-Job
Get-ScheduledJob ProcessJob
Id Name Triggers Command Enabled
-- ---- -------- ------- -------
4 ProcessJob {1} Get-Process True
Get-Job ProcessJob
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
43 ProcessJob PSScheduledJob Completed True localhost
44 ProcessJob PSScheduledJob Completed True localhost
45 ProcessJob PSScheduledJob Completed True localhost
46 ProcessJob PSScheduledJob Completed True localhost
47 ProcessJob PSScheduledJob Completed True localhost
48 ProcessJob PSScheduledJob Completed True localhost
49 ProcessJob PSScheduledJob Completed True localhost
50 ProcessJob PSScheduledJob Completed True localhost
Esse comportamento ocorre porque o Get-ScheduledJob
comando importa automaticamente o módulo PSScheduledJob e, em seguida, executa o comando.