about_Jobs
Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
TÓPICO
about_Jobs
DESCRIÇÃO BREVE
Fornece informações sobre como Windows PowerShell trabalhos em segundo plano executam um comando ou uma expressão em segundo plano sem interagir com a sessão atual.
DESCRIÇÃO LONGA
Este tópico explica como executar trabalhos em segundo plano em Windows PowerShell em um computador local. Para obter informações sobre como executar trabalhos em segundo plano em computadores remotos, consulte about_Remote_Jobs.
Quando você inicia um trabalho em segundo plano, o prompt de comando retorna imediatamente, mesmo se o trabalho demora muito tempo para concluir. É possível continuar a trabalhar na sessão sem interrupção enquanto o trabalho é concluído.
OS CMDLETS DE TRABALHO
Start-Job
Inicia um trabalho em segundo plano em um computador local.
Get-Job
Obtém os trabalhos em segundo plano que foram iniciados na sessão atual.
Receive-Job
Obtém os resultados de trabalhos em segundo plano.
Stop-Job
Interrompe um trabalho em segundo plano.
Wait-Job
Suprime o prompt de comando até que um ou todos os trabalhos sejam concluídos.
Remove-Job
Exclui um trabalho em segundo plano.
Invoke-Command
O parâmetro AsJob executa qualquer comando como um trabalho em segundo plano em um computador remoto. Você também pode usar Invoke-Command para executar qualquer comando de trabalho remotamente, incluindo um comando de trabalho inicial.
COMO INICIAR UM TRABALHO NO COMPUTADOR LOCAL
Para iniciar um trabalho em segundo plano em um computador local, use o cmdlet Start-Job.
Para gravar um comando Start-Job, coloque o comando no qual o trabalho é executado entre chaves ({ }). Use o parâmetro ScriptBlock para especificar o comando.
O comando a seguir inicia um trabalho em segundo plano que executa um comando Get-Process no computador local.
Start-Job -ScriptBlock {Get-Process}
O comando Start-Job retorna um objeto que representa o trabalho. O objeto de trabalho contém informações úteis sobre o trabalho, mas ele não contém os resultados do trabalho.
Salve o objeto de trabalho em uma variável e, em seguida, use com outros cmdlets de trabalho para gerenciar o trabalho em segundo plano. O comando a seguir inicia um objeto de trabalho e salva o objeto de trabalho resultante na variável $job.
$job = Start-Job -ScriptBlock {Get-Process}
Você também pode usar o cmdlet Get-Job para obter objetos que representem os trabalhos iniciados na sessão atual. Get-Job retorna o mesmo objeto de trabalho que Start-Job retorna.
OBTENDO OBJETOS DE TRABALHO
Para obter o objeto que representam os trabalhos em segundo plano que foram iniciados na sessão atual, use o cmdlet Get-Job. Sem parâmetros, Get-Job retorna todos os trabalhos que foram iniciados na sessão atual.
Por exemplo, o comando a seguir obtém os trabalhos na sessão atual.
PS C:\>Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
Você pode também salvar o objeto de trabalho em uma variável e usá-la para representar o trabalho em um comando posterior. O comando a seguir obtém o trabalho com ID 1 e salva-o na variável $job.
$job = Get-Job -Id 1
O objeto de trabalho contém o estado do trabalho, que indica se o trabalho foi concluído. Um trabalho concluído tem um estado "Complete" ou "Failed". Um trabalho também pode ser bloqueado ou estar em execução.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
OBTENDO OS RESULTADOS DE UM TRABALHO
Quando você executa um trabalho em segundo plano, os resultados não aparecem imediatamente. Em vez disso, o cmdlet Start-Job retorna um objeto de trabalho que representa o trabalho, mas ele não contém os resultados. Para obter os resultados de um trabalho em segundo plano, use o cmdlet Receive-Job.
O comando a seguir usa o cmdlet Receive-Job para obter os resultados do trabalho. Ele usa um objeto de trabalho salvo na variável $job para identificar o trabalho.
Receive-Job -Job $job
O cmdlet Receive-Job retorna os resultados do trabalho.
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
...
Você também pode salvar os resultados de um trabalho em uma variável. O comando a seguir salva os resultados do trabalho da variável $job na variável $results.
$results = Receive-Job -Job $job
E você pode salvar os resultados do trabalho em um arquivo usando o operador de redirecionamento (>) ou o cmdlet Out-File. O comando a seguir usa o operador de redirecionamento para salvar os resultados do trabalho na variável $job no arquivo Results.txt.
Receive-Job -Job $job > results.txt
OBTENDO E MANTENDO OS RESULTADOS PARCIAIS DO TRABALHO
O cmdlet Receive-Job obtém os resultados de um trabalho em segundo plano. Se o trabalho for concluído, Receive-Job obtém todos os resultados do trabalho. Se o trabalho ainda está em execução, Receive-Job obtém os resultados gerados até o momento. Você pode executar os comandos Receive-Job novamente para obter os resultados restantes.
Quando Receive-Job retorna resultados, por padrão, ele exclui os resultados do cache no qual os resultados do trabalho estão armazenados. Se você executar outro comando Receive-Job, pode obter apenas os resultados que ainda não foram recebidos.
Os comandos a seguir mostram os resultados dos comandos Receive-Job executados antes da conclusão do trabalho.
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 que o Receive-Job exclua os resultados do trabalho que retornou, use o parâmetro Keep. Como resultado, Receive-Job retorna todos os resultados gerados até esse momento.
Os comandos a seguir mostram o efeito de usar o parâmetro Keep em um trabalho que ainda não foi concluído.
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
AGUARDANDO OS RESULTADOS
Se você executar um comando que demora muito para ser concluído, pode usar as propriedades do objeto de trabalho para determinar quando o trabalho for concluído. O comando a seguir usa o objeto Get-Job para obter todos os trabalhos em segundo plano na sessão atual.
Get-Job
Os resultados são exibidos em uma tabela. O status do trabalho aparece na coluna State.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log Syst...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Recurse
Nesse caso, a propriedade State revela que o trabalho 2 ainda está em execução. Se você usar o cmdlet Receive-Job para obter os resultados do trabalho agora, os resultados serão incompletos. Você pode usar o cmdlet Receive-Job repetidamente para obter todos os resultados. Por padrão, cada vez que você usá-lo, obterá apenas os resultados que não foram recebidos, mas você pode usar o parâmetro Keep do cmdlet Receive-Job para manter os resultados, mesmo aqueles que já foram recebidos.
Você pode gravar os resultados parciais em um arquivo e, em seguida, acrescentar resultados mais recentes que chegam ou pode esperar e verificar o estado do trabalho mais tarde.
Você pode usar o parâmetro Wait do cmdlet Receive-Job, que não retorna o prompt de comando até o trabalho ser concluído e todos os resultados estarem disponíveis.
Você também pode usar o cmdlet Wait-Job para aguardar um ou todos os resultados do trabalho. Wait-Job permite que você espere um determinado trabalho, todos os trabalhos ou qualquer um dos trabalhos a serem concluídos.
O comando a seguir usa o cmdlet Wait-Job para aguardar um trabalho com ID de 10.
Wait-Job -ID 10
Como resultado, o Windows PowerShell prompt é suprimido até o trabalho ser concluído.
Você também pode aguardar um período de tempo predeterminado. Esse comando usa o parâmetro Timeout para limitar o tempo de espera em 120 segundos. Quando o tempo expirar, o prompt de comando retorna, mas o trabalho continua a ser executado em segundo plano.
Wait-Job -ID 10 -Timeout 120
INTERROMPENDO UM TRABALHO
Para interromper um trabalho em segundo plano, use o cmdlet Stop-Job. O comando a seguir inicia um trabalho para obter todas as entradas no log de eventos do sistema. Ele salva o objeto do trabalho na variável $job.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
O comando a seguir interrompe o trabalho. Ele usa um operador de pipeline (|) para enviar o trabalho na variável $job para Stop-Job.
$job | Stop-Job
EXCLUINDO UM TRABALHO
Para excluir um trabalho em segundo plano, use o cmdlet Remove-Job. O comando a seguir exclui o trabalho na variável $job.
Remove-Job -Job $job
INVESTIGANDO UM TRABALHO COM FALHA
Para descobrir por que um trabalho falhou, use a subpropriedade Reason do objeto de trabalho.
O comando a seguir inicia um trabalho sem as credenciais necessárias. Ele salva o objeto do trabalho 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:\S...
O comando a seguir usa a propriedade Reason para descobrir o erro que causou a falha no trabalho.
$job.ChildJobs[0].JobStateInfo.Reason
Nesse caso, o trabalho falhou porque o computador remoto exigiu credenciais explícitas para executar o comando. O valor da propriedade Reason é:
Connecting to remote server failed with the following error
message : Access is denied.
CONSULTE TAMBÉM
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command