Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
BREVE DESCRIÇÃO
Fornece informações sobre como os trabalhos 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 trabalhos em segundo plano no 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 que o trabalho demore muito tempo para ser concluído. Você pode continuar a trabalhar na sessão sem interrupção enquanto a tarefa está a ser executada.
OS CMDLETS DE TRABALHO
| Cmdlet | Descrição |
|---|---|
Start-Job |
Inicia um trabalho em segundo plano em um computador local. |
Get-Job |
Obtém os trabalhos em segundo plano que foram iniciados no |
| 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 |
| completo. | |
Remove-Job |
Exclui um trabalho em segundo plano. |
Invoke-Command |
O parâmetro AsJob executa qualquer comando como plano de fundo |
| trabalho em um computador remoto. Você também pode usar | |
Invoke-Command para executar qualquer comando de trabalho remotamente, |
|
| incluindo um comando Start-Job. |
COMO INICIAR UM TRABALHO NO COMPUTADOR LOCAL
Para iniciar um trabalho em segundo plano no computador local, use o cmdlet Start-Job.
Para escrever um comando Start-Job, coloque o comando que o trabalho executa em 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 não contém os resultados do trabalho.
Salve o objeto de trabalho em uma variável e use-o com os outros cmdlets Job 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 Get-Job cmdlet para obter objetos que representam 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 um objeto que represente os trabalhos em segundo plano iniciados na sessão atual, use o Get-Job cmdlet. 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ê também pode salvar o objeto de trabalho em uma variável e usá-lo para representar o trabalho em um comando posterior. O comando a seguir obtém o trabalho com ID 1 e o salva 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 de "Concluído" ou "Reprovado". Um trabalho também pode estar bloqueado 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 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 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 na variável $job na variável $results.
$results = Receive-Job -Job $job
Além disso, 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 RESULTADOS PARCIAIS DO TRABALHO
O cmdlet Receive-Job obtém os resultados de um trabalho em segundo plano. Se o trabalho estiver concluído, Receive-Job obterá todos os resultados do trabalho. Se o trabalho ainda estiver em execução, Receive-Job obtém os resultados que foram gerados até agora.
Você pode executar comandos Receive-Job novamente para obter os resultados restantes.
Quando Receive-Job retorna resultados, por padrão, ele exclui esses resultados do cache onde os resultados do trabalho são armazenados. Se você executar outro Receive-Job comando, obterá apenas os resultados que ainda não foram recebidos.
Os comandos a seguir mostram os resultados de Receive-Job comandos executados antes que o trabalho seja concluído.
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 evitar Receive-Job a exclusão dos resultados do trabalho retornados, use o parâmetro Keep . Como resultado, Receive-Job retorna todos os resultados que foram gerados até esse momento.
Os comandos a seguir mostram o efeito do uso do 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
À ESPERA DOS RESULTADOS
Se você executar um comando que leva muito tempo para ser concluído, poderá usar as propriedades do objeto de trabalho para determinar quando o trabalho será concluído. O comando a seguir usa o Get-Job objeto para obter todos os trabalhos em segundo plano na sessão atual.
Get-Job
Os resultados aparecem numa tabela. O status do trabalho aparece 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 do Estado revela que o Job 2 ainda está em execução. Se você usasse o cmdlet Receive-Job para obter os resultados do trabalho agora, os resultados seriam incompletos. Você pode usar o cmdlet Receive-Job repetidamente para obter todos os resultados. Por padrão, cada vez que você o usa, obtém apenas os resultados que ainda não foram recebidos, mas pode usar o parâmetro Keep do cmdlet Receive-Job para reter os resultados, mesmo que eles já tenham sido recebidos.
Você pode gravar os resultados parciais em um arquivo e, em seguida, anexar resultados mais recentes à medida que eles chegam ou você pode esperar e verificar o estado do trabalho mais tarde.
Você pode usar o parâmetro Wait do cmdlet, que não retorna o prompt de Receive-Job comando até que o trabalho seja concluído e todos os resultados estejam disponíveis.
Você também pode usar o cmdlet Wait-Job para aguardar qualquer um ou todos os resultados do trabalho.
Wait-Job permite aguardar por um trabalho específico, por todos os trabalhos ou por qualquer um dos trabalhos a ser concluído.
O comando a seguir usa o cmdlet Wait-Job para aguardar um trabalho com ID 10.
Wait-Job -ID 10
Como resultado, o prompt do PowerShell é suprimido até que o trabalho seja concluído.
Você também pode esperar por um período de tempo predeterminado. Este comando usa o parâmetro Timeout para limitar a espera a 120 segundos. Quando o tempo expira, o prompt de comando retorna, mas o trabalho continua a ser executado em segundo plano.
Wait-Job -ID 10 -Timeout 120
PARAR 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 de 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
ELIMINAR 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 REPROVADO
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 de 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:...
O comando a seguir usa a propriedade Reason para localizar o erro que causou a falha do 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 é:
A ligação ao servidor remoto falhou com a seguinte mensagem de erro: Acesso negado.