Acerca das Tarefas
BREVE DESCRIÇÃO
Fornece informações sobre como as tarefas em segundo plano do PowerShell executam um comando ou expressão em segundo plano sem interagir com a sessão atual.
DESCRIÇÃO LONGA
Este tópico explica como executar tarefas em segundo plano no PowerShell num computador local. Para obter informações sobre a execução de tarefas em segundo plano em computadores remotos, consulte about_Remote_Jobs.
Quando inicia uma tarefa em segundo plano, a linha de comandos regressa imediatamente, mesmo que a tarefa dedure um tempo prolongado a concluir. Pode continuar a trabalhar na sessão sem interrupções enquanto a tarefa é executada.
OS CMDLETS DA TAREFA
Cmdlet | Descrição |
---|---|
Start-Job |
Inicia uma tarefa em segundo plano num computador local. |
Get-Job |
Obtém as tarefas em segundo plano que foram iniciadas no |
sessão atual. | |
Receive-Job |
Obtém os resultados das tarefas em segundo plano. |
Stop-Job |
Para uma tarefa em segundo plano. |
Wait-Job |
Suprime a linha de comandos até que uma ou todas as tarefas sejam |
concluído. | |
Remove-Job |
Elimina uma tarefa em segundo plano. |
Invoke-Command |
O parâmetro AsJob executa qualquer comando como fundo |
num computador remoto. Também pode utilizar | |
Invoke-Command para executar qualquer comando de tarefa remotamente, |
|
incluindo um comando Start-Job. |
COMO INICIAR UMA TAREFA NO COMPUTADOR LOCAL
Para iniciar uma tarefa em segundo plano no computador local, utilize o cmdlet Start-Job.
Para escrever um comando Start-Job, coloque o comando que a tarefa executa em chavetas ( { } ). Utilize o parâmetro ScriptBlock para especificar o comando .
O comando seguinte inicia uma tarefa em segundo plano que executa um Get-Process
comando no computador local.
Start-Job -ScriptBlock {Get-Process}
O Start-Job
comando devolve um objeto que representa a tarefa. O objeto da tarefa contém informações úteis sobre a tarefa, mas não contém os resultados da tarefa.
Guarde o objeto de tarefa numa variável e, em seguida, utilize-o com os outros cmdlets job para gerir a tarefa em segundo plano. O comando seguinte inicia um objeto de tarefa e guarda o objeto de tarefa resultante na variável $job.
$job = Start-Job -ScriptBlock {Get-Process}
Também pode utilizar o Get-Job
cmdlet para obter objetos que representam as tarefas iniciadas na sessão atual. Get-Job
devolve o mesmo objeto de tarefa que Start-Job devolve.
OBTER OBJETOS DE TAREFA
Para obter o objeto que representa as tarefas em segundo plano iniciadas na sessão atual, utilize o Get-Job
cmdlet . Sem parâmetros, Get-Job
devolve todas as tarefas iniciadas na sessão atual.
Por exemplo, o comando seguinte obtém as tarefas na sessão atual.
PS C:> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
Também pode guardar o objeto de tarefa numa variável e utilizá-lo para representar a tarefa num comando posterior. O comando seguinte obtém a tarefa com o ID 1 e guarda-a na variável $job.
$job = Get-Job -Id 1
O objeto da tarefa contém o estado da tarefa, o que indica se a tarefa foi concluída. Uma tarefa concluída tem o estado "Complete" ou "Failed". Uma tarefa também pode estar bloqueada ou em execução.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
OBTER OS RESULTADOS DE UMA TAREFA
Quando executa uma tarefa em segundo plano, os resultados não são apresentados imediatamente.
Em vez disso, o cmdlet Start-Job devolve um objeto de tarefa que representa a tarefa, mas não contém os resultados. Para obter os resultados de uma tarefa em segundo plano, utilize o Receive-Job
cmdlet .
O comando seguinte utiliza o Receive-Job
cmdlet para obter os resultados da tarefa. Utiliza um objeto de tarefa guardado na variável $job para identificar a tarefa.
Receive-Job -Job $job
O cmdlet Receive-Job devolve os resultados da tarefa.
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
# ...
Também pode guardar os resultados de uma tarefa numa variável. O comando seguinte guarda os resultados da tarefa na variável $job para a variável $results.
$results = Receive-Job -Job $job
Além disso, pode guardar os resultados da tarefa num ficheiro com o operador de redirecionamento (>) ou o cmdlet Out-File. O comando seguinte utiliza o operador de redirecionamento para guardar os resultados da tarefa na variável $job no ficheiro de Results.txt.
Receive-Job -Job $job > results.txt
OBTER E MANTER RESULTADOS PARCIAIS DO TRABALHO
O cmdlet Receive-Job obtém os resultados de uma tarefa em segundo plano. Se a tarefa estiver concluída, Receive-Job
obtém todos os resultados da tarefa. Se a tarefa ainda estiver em execução, Receive-Job obtém os resultados que foram gerados até agora.
Pode executar Receive-Job
comandos novamente para obter os resultados restantes.
Quando Receive-Job
devolve resultados, por predefinição, elimina esses resultados da cache onde os resultados da tarefa são armazenados. Se executar outro Receive-Job
comando, obtém apenas os resultados que ainda não foram recebidos.
Os comandos seguintes mostram os resultados dos Receive-Job
comandos executados antes de a tarefa ser concluída.
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Para impedir Receive-Job
a eliminação dos resultados da tarefa devolvidos, utilize o parâmetro Manter . Como resultado, Receive-Job
devolve todos os resultados que foram gerados até essa altura.
Os comandos seguintes mostram o efeito da utilização do parâmetro Manter numa tarefa que ainda não está concluída.
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
A AGUARDAR PELOS RESULTADOS
Se executar um comando que demora muito tempo a ser concluído, pode utilizar as propriedades do objeto de tarefa para determinar quando a tarefa está concluída. O comando seguinte utiliza o Get-Job
objeto para obter todas as tarefas em segundo plano na sessão atual.
Get-Job
Os resultados são apresentados numa tabela. O estado da tarefa é apresentado na coluna Estado.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
Neste caso, a propriedade Estado revela que a Tarefa 2 ainda está em execução. Se utilizasse o Receive-Job
cmdlet para obter os resultados da tarefa agora, os resultados estariam incompletos. Pode utilizar o Receive-Job
cmdlet repetidamente para obter todos os resultados. Por predefinição, sempre que o utilizar, obtém apenas os resultados que ainda não foram recebidos, mas pode utilizar o parâmetro Manter do cmdlet Receive-Job para manter os resultados, mesmo que já tenham sido recebidos.
Pode escrever os resultados parciais num ficheiro e, em seguida, acrescentar resultados mais recentes à medida que chegam ou pode esperar e verificar o estado da tarefa mais tarde.
Pode utilizar o parâmetro Aguardar do Receive-Job
cmdlet, que não devolve a linha de comandos até que a tarefa esteja concluída e todos os resultados estejam disponíveis.
Também pode utilizar o Wait-Job
cmdlet para aguardar por qualquer ou todos os resultados da tarefa. Wait-Job
permite-lhe esperar por um trabalho específico, por todas as tarefas ou por qualquer uma das tarefas a ser concluída.
O comando seguinte utiliza o cmdlet Wait-Job para aguardar uma tarefa com o ID 10.
Wait-Job -ID 10
Como resultado, o pedido do PowerShell é suprimido até que a tarefa seja concluída.
Também pode esperar por um período de tempo predeterminado. Este comando utiliza o parâmetro Tempo Limite para limitar a espera a 120 segundos. Quando o tempo expirar, a linha de comandos é devolvida, mas a tarefa continua a ser executada em segundo plano.
Wait-Job -ID 10 -Timeout 120
PARAR UMA TAREFA
Para parar uma tarefa em segundo plano, utilize o Stop-Job
cmdlet . O comando seguinte inicia uma tarefa para obter todas as entradas no registo de eventos do Sistema. Guarda o objeto de tarefa na variável $job.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
O comando seguinte para a tarefa. Utiliza um operador de pipeline (|) para enviar a tarefa na variável $job para Stop-Job
.
$job | Stop-Job
ELIMINAR UMA TAREFA
Para eliminar uma tarefa em segundo plano, utilize o Remove-Job
cmdlet . O comando seguinte elimina a tarefa na variável $job.
Remove-Job -Job $job
INVESTIGAR UMA TAREFA FALHADA
Para descobrir por que motivo uma tarefa falhou, utilize a subpropriedade Reason do objeto de tarefa.
O comando seguinte inicia uma tarefa sem as credenciais necessárias. Guarda o objeto de tarefa na variável $job.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
O comando seguinte utiliza a propriedade Motivo para encontrar o erro que causou a falha da tarefa.
$job.ChildJobs[0].JobStateInfo.Reason
Neste caso, a tarefa falhou porque o computador remoto necessitava de credenciais explícitas para executar o comando. O valor da propriedade Reason é:
A ligação ao servidor remoto falhou com a seguinte mensagem de erro: Acesso negado.