Sobre trabalhos
DESCRIÇÃO BREVE
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 leve um tempo estendido para ser concluído. É possível continuar a trabalhar na sessão sem interrupção enquanto o trabalho é executado.
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 |
Completa. | |
Remove-Job |
Exclui um trabalho em segundo plano. |
Invoke-Command |
O parâmetro AsJob executa qualquer comando como um plano de fundo |
trabalho em um computador remoto. Você também pode usar o | |
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 entre chaves ( { } ). Use o parâmetro ScriptBlock para especificar o comando .
O comando a seguir inicia um trabalho em segundo plano que executa um Get-Process
comando no computador local.
Start-Job -ScriptBlock {Get-Process}
O Start-Job
comando 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 deste.
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 o objeto que representa os trabalhos em segundo plano que foram 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 a 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 o estado "Concluído" ou "Falha". 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
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 não contém os resultados. Para obter os resultados de um trabalho em segundo plano, use o Receive-Job
cmdlet .
O comando a seguir usa o Receive-Job
cmdlet 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 obterá os resultados que foram gerados até agora.
Você pode executar Receive-Job
comandos novamente para obter os resultados restantes.
Quando Receive-Job
retorna resultados, por padrão, ele exclui esses resultados do cache em que 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 dos Receive-Job
comandos 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 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 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 leva muito tempo para ser concluído, poderá usar as propriedades do objeto de trabalho para determinar quando o trabalho é 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 em uma 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...
Nesse caso, a propriedade State revela que o Trabalho 2 ainda está em execução. Se você usar o Receive-Job
cmdlet para obter os resultados do trabalho agora, os resultados estarão incompletos. Você pode usar o Receive-Job
cmdlet repetidamente para obter todos os resultados. Por padrão, sempre que usá-lo, você obtém apenas os resultados que ainda não foram recebidos, mas pode usar o parâmetro Keep do cmdlet Receive-Job para manter os resultados, mesmo que eles já tenham sido recebidos.
Você pode gravar os resultados parciais em um arquivo e acrescentar resultados mais recentes à medida que eles chegam ou pode esperar e marcar o estado do trabalho mais tarde.
Você pode usar o parâmetro Wait do Receive-Job
cmdlet , que não retorna o prompt de comando até que o trabalho seja concluído e todos os resultados estejam disponíveis.
Você também pode usar o Wait-Job
cmdlet para aguardar qualquer um ou todos os resultados do trabalho. Wait-Job
permite que você aguarde um trabalho específico, para todos os trabalhos ou para qualquer um dos trabalhos a serem concluídos.
O comando a seguir usa o cmdlet Wait-Job para aguardar um trabalho com a 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 predeterminado de tempo. Esse comando usa o parâmetro Timeout para limitar a espera a 120 segundos. Quando o tempo expirar, o prompt de comando retornará, mas o trabalho continuará sendo executado em segundo plano.
Wait-Job -ID 10 -Timeout 120
PARANDO UM TRABALHO
Para interromper um trabalho em segundo plano, use o Stop-Job
cmdlet . O comando a seguir inicia um trabalho para obter cada entrada 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
EXCLUINDO UM TRABALHO
Para excluir um trabalho em segundo plano, use o Remove-Job
cmdlet . 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 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 exigia credenciais explícitas para executar o comando. O valor da propriedade Reason é:
Falha ao conectar-se ao servidor remoto com a seguinte mensagem de erro: Acesso negado.