about_Jobs
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
O PowerShell executa simultaneamente comandos e scripts através de tarefas. Existem três tipos de tarefas fornecidos pelo PowerShell para suportar a simultaneidade.
RemoteJob
- Os comandos e scripts são executados numa sessão remota. Para obter informações, consulte about_Remote_Jobs.BackgroundJob
- Os comandos e scripts são executados num processo separado no computador local.PSTaskJob
ouThreadJob
- Os comandos e scripts são executados num thread separado no mesmo processo no computador local. Para obter mais informações, veja about_Thread_Jobs.
Executar scripts remotamente, num computador separado ou num processo separado, proporciona um grande isolamento. Quaisquer erros que ocorram na tarefa remota não afetam outros trabalhos em execução ou a sessão principal que iniciou a tarefa. No entanto, a camada remota adiciona sobrecarga, incluindo a serialização de objetos. Todos os objetos são serializados e serializados à medida que são transmitidos entre a sessão principal e a sessão remota (tarefa). A serialização de objetos de dados grandes e complexos pode consumir grandes quantidades de recursos de computação e memória e transferir grandes quantidades de dados pela rede.
As tarefas baseadas em threads não são tão robustas como as tarefas remotas e em segundo plano, porque são executadas no mesmo processo em threads diferentes. Se uma tarefa tiver um erro crítico que falhe no processo, todas as outras tarefas no processo serão terminadas.
No entanto, as tarefas baseadas em threads requerem menos sobrecarga. Não utilizam a camada remota nem a serialização. Os objetos de resultado são devolvidos como referências a objetos dinâmicos na sessão atual. Sem esta sobrecarga, as tarefas baseadas em threads são executadas mais rapidamente e utilizam menos recursos do que os outros tipos de tarefas.
Importante
A sessão principal que criou a tarefa também monitoriza o estado da tarefa e recolhe dados do pipeline. O processo subordinado da tarefa é terminado pelo processo principal assim que a tarefa atingir um estado concluído. Se a sessão principal for terminada, todas as tarefas subordinadas em execução serão terminadas juntamente com os processos subordinados.
Existem duas formas de contornar esta situação:
- Utilize
Invoke-Command
para criar tarefas executadas em sessões desligadas. Para obter mais informações, veja about_Remote_Jobs. - Utilize
Start-Process
para criar um novo processo em vez de uma tarefa. Para obter mais informações, veja Iniciar Processo.
Os cmdlets da tarefa
Start-Job
- Inicia uma tarefa em segundo plano num computador local.Get-Job
- Obtém as tarefas em segundo plano que foram iniciadas na 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 estejam concluídas.Remove-Job
- Elimina uma tarefa em segundo plano.Invoke-Command
- O parâmetro AsJob cria uma tarefa em segundo plano num computador remoto. Pode utilizarInvoke-Command
para executar qualquer comando de tarefa remotamente, incluindoStart-Job
.
Como iniciar uma tarefa no computador local
Para iniciar uma tarefa em segundo plano no computador local, utilize o Start-Job
cmdlet .
Para escrever um Start-Job
comando, 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}
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.
O Start-Job
comando devolve um objeto que representa a tarefa. O objeto de tarefa contém informações úteis sobre a tarefa, mas não contém os resultados da tarefa.
Pode guardar o objeto de tarefa numa variável e, em seguida, utilizá-lo com os outros cmdlets de Tarefa para gerir a tarefa em segundo plano. O comando seguinte inicia um objeto de tarefa e guarda o objeto de tarefa resultante na $job
variável .
$job = Start-Job -ScriptBlock {Get-Process}
A partir do PowerShell 6.0, pode utilizar o operador em segundo plano (&
) no final de um pipeline para iniciar uma tarefa em segundo plano. Para obter mais informações, veja Operador em segundo plano.
Utilizar o operador em segundo plano é funcionalmente equivalente à utilização do Start-Job
cmdlet no exemplo anterior.
$job = Get-Process &
Obter objetos de tarefa
O Get-Job
cmdlet devolve objetos que representam as tarefas em segundo plano que foram iniciadas na sessão atual. Sem parâmetros, Get-Job
devolve todas as tarefas iniciadas na sessão atual.
Get-Job
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 Concluído ou Com Falhas. Uma tarefa também pode ser Bloqueada ou Em Execução.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
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 $job
na variável .
$job = Get-Job -Id 1
Obter os resultados de uma tarefa
Quando executa uma tarefa em segundo plano, os resultados não são apresentados imediatamente. Para obter os resultados de uma tarefa em segundo plano, utilize o Receive-Job
cmdlet .
No exemplo seguinte, o Receive-Job
cmdlet obtém os resultados da tarefa com o objeto de tarefa na $job
variável .
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
668 7 2672 6168 104 32.26 488 csrss
...
Pode guardar os resultados de uma tarefa numa variável. O comando seguinte guarda os resultados da tarefa na $job
variável para a $results
variável .
$results = Receive-Job -Job $job
Obter e manter resultados parciais de tarefas
O Receive-Job
cmdlet 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.
Por predefinição, Receive-Job
elimina os resultados da cache onde os resultados da tarefa são armazenados. Quando volta a executar Receive-Job
, obtém apenas os novos resultados que chegaram após a primeira execução.
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
Utilize o parâmetro Manter para impedir Receive-Job
a eliminação dos resultados da tarefa que são devolvidos. 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. Utilize a propriedade Estado para determinar quando a tarefa está concluída.
Também pode utilizar o parâmetro Aguardar do Receive-Job
cmdlet . Quando utiliza este parâmetro, o cmdlet 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 ou mais trabalhos específicos ou por todos os trabalhos.
O comando seguinte utiliza o Wait-Job
cmdlet para aguardar por 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 $job
variável.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
O seguinte comando para a tarefa. Utiliza um operador de pipeline (|
) para enviar a tarefa na $job
variável para Stop-Job
.
$job | Stop-Job
Eliminar um trabalho
Para eliminar uma tarefa em segundo plano, utilize o Remove-Job
cmdlet. O seguinte comando elimina a tarefa na $job
variável.
Remove-Job -Job $job
Investigar uma tarefa falhada
As tarefas podem falhar por vários motivos. O objeto da tarefa contém uma propriedade Reason que contém informações sobre a causa da falha.
O exemplo seguinte inicia uma tarefa sem as credenciais necessárias.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Inspecione a propriedade Razão 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. A propriedade Reason contém a seguinte mensagem:
A ligação ao servidor remoto falhou com a seguinte mensagem de erro: "Acesso negado".