Partilhar via


about_Scheduled_Jobs_Troubleshooting

Breve descrição

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.

Nota

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 para o 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 em 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 do 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 com nome de 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 com nome de 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 conseguir obter instâncias de trabalho agendadas ou seus resultados porque o módulo PSScheduledJob não é importado para a sessão.

Nota

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 do trabalho como False. O valor False significa que Receive-Job retornou os resultados do trabalho e a instância não tem mais resultados para retornar. 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 um trabalho agendado ainda existe, 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 abrir 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 and 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 já 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 estarã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-Jobo , 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 são executados automaticamente se o trabalho for acionado ou o trabalho agendado estiver desativado.

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 sã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 são executados automaticamente se as condições do gatilho de trabalho ou as opções de trabalho não forem satisfeitas.

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 estão satisfeitas. Por exemplo, um trabalho agendado que requer 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 detetar 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 trabalho agendado ou trabalho agendado está corrompido

Em raras ocasiões, os trabalhos agendados podem ficar corrompidos ou conter contradições internas que não podem ser resolvidas. Normalmente, isso acontece quando os arquivos XML para o trabalho agendado são editados manualmente, resultando em XML inválido.

Quando um trabalho agendado está corrompido, o PowerShell tenta excluir o trabalho agendado, seu histórico de execução e seus resultados do disco.

Se não for possível 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 .

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 encontrar consistentemente trabalhos agendados

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.

Consulte também