Você está na página 1de 6

TÓPICO

about_Jobs

DESCRIÇÃO RESUMIDA
Fornece informações sobre como os trabalhos de segundo plano do
Windows PowerShell executam um comando ou expressão em segundo
plano sem interação com a sessão atual.

DESCRIÇÃO LONGA
Este tópico explica como executar trabalhos de segundo plano no
Windows PowerShell em um computador local. Para obter informações
sobre a execução de trabalhos de segundo plano em computadores
remotos, consulte about_Remote_Jobs.

Quando você inicia um trabalho de segundo plano, o prompt de


comando é retornado imediatamente, mesmo se o trabalho ainda
demorar um longo tempo para ser concluído. Você pode continuar a
trabalhar na sessão sem interrupções enquanto o trabalho é executado.

Importante: os trabalhos de segundo plano iniciados utilizando o


parâmetro Start-Job ou AsJob de Invoke-Command contam com a
infraestrutura remota do Windows PowerShell. Para usar esses
recursos, o Windows PowerShell deve ser configurado para execução
remota, mesmo se o trabalho de segundo plano for executado
somente no computador local. Para obter mais informações,
consulte about_Remote_Requirements.

COMO INICIAR UM TRABALHO EM UM COMPUTADOR LOCAL


Para iniciar um trabalho de segundo plano em um computador local,
use o cmdlet Start-Job.

Para gravar 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 de 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, em seguida, use-o


com outros cmdlets para gerenciar o trabalho de 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
representam os trabalhos iniciados na sessão atual. O Get-Job
retorna o mesmo objeto de trabalho que Start-Job.

OBTENDO OBJETOS DE TRABALHO


Para obter objetos que representam os trabalhos de segundo plano
que foram iniciados na sessão atual, use o cmdlet Get-Job. Sem
parâmetros, Get-Job retorna todos os trabalhos iniciados na
sessão atual.

Por exemplo, o comando a seguir obtém os trabalhos na sessão atual.

get-job

Id Name State HasMoreData Location Command


-- ---- ----- ----------- -------- -------
1 Job1 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
"Complete" ou "Failed". Um trabalho também pode ser bloqueado ou
executado.

get-job

Id Name State HasMoreData Location Command


-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process

OBTENDO OS RESULTADOS DE UM TRABALHO

Quando você executa um trabalho de 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
de 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 para a variável $results.

$results = receive-job -job $job

E você pode salvar os resultados do trabalho em um arquivo


utilizando 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 DE TRABALHO PARCIAIS

O cmdlet Receive-Job retorna os resultados de um trabalho de


segundo plano. Se o trabalho estiver concluído, Receive-Job
retornará os resultados completos do trabalho. Se o trabalho
ainda estiver em execução, Receive-Job obtém os resultados que
foram gerados posteriormente. Você pode executar os comandos
Receive-Job novamente para obter os resultados restantes.

Quando o Receive-Job retorna os resultados, por padrão, ele


exclui os resultados do cache em que os trabalhos estão
armazenados. Se você executar outro comando Receive-Job, obterá
somente 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 ele retornou, use o parâmetro Keep. Consequentemente, o
Receive-Job retorna todos os resultados que foram gerados até
aquele momento.

Os comandos a seguir mostram o efeito do uso do parâmetro Keep em


um trabalho que ainda não está 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 RESULTADOS

Se você executar um comando que demora um longo período 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 objeto Get-Job para obter todos os trabalhos de segundo plano
na sessão atual.

get-job

O resultado aparece na tabela. O status do trabalho é exibido na


coluna State.

Id Name State HasMoreData Location Command


-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
2 Job2 Running True localhost get-eventlog -log syst...
3 Job3 Complete True localhost dir -path c:\* -recurse

Nesse caso, a propriedade State revela que o Job2 ainda está em


execução. Se você usou o cmdlet Receive-Job para obter os
resultados de trabalho agora, os resultados ficariam incompletos.
Você pode usar o cmdlet Receive-Job várias vezes para obter todos
os resultados. Por padrão, sempre que usá-lo, você obtém somente
os resultados que ainda não foram recebidos, mas você pode usar o
parâmetro Keep do cmdlet Receive-Job para manter os resultados,
embora já tenham sido recebidos.

Neste momento, você pode gravar os resultados em um arquivo e, em


seguida, anexá-lo aos resultados recebidos recentemente, conforme
eles chegam. Ou você pode aguardar e verificar o estado desse
trabalho posteriormente.

Também é possível usar o cmdlet Wait-Job para aguardar qualquer


um ou todos os resultados de trabalho. O Wait-Job permite
aguardar um trabalho específico, 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 10.

wait-job -ID 10

Consequentemente, o prompt do Windows PowerShell é suprimido até


que o trabalho esteja concluído.

Você também pode aguardar por um período predeterminado. Esse


comando usar o parâmetro Timeout para limitar a espera em 120
segundos. Quando o tempo expira, o prompt de comando é retornado,
mas o trabalho continua a ser executado no segundo plano.

wait-job -ID 10 -timeout 120

PARANDO UM TRABALHO

Para parar um trabalho de segundo plano, use o cmdlet Stop-Job. 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 para 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 de segundo plano, use o cmdlet Remove-Job.


O comando a seguir exclui o trabalho da variável $job.

remove-job -job $job

INVESTIGANDO UM TRABALHO COM FALHA

Para descobrir porque um trabalho falhou, use a subpropriedade


Reason do objeto de trabalho.

O comando a seguir inicia um trabalho sem as credenciais


exigidas. Ele salva o objeto de trabalho na variável $job.

$job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}

Id Name State HasMoreData Location Command


-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost new-item -path HKLM:\S...

O comando a seguir usa a propriedade Reason para localizar 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 é:

Falha ao conectar ao servidor remoto com a seguinte mensagem


de erro: Acesso negado.

OS CMDLETS DE TRABALHO

Start-Job Inicia um trabalho de segundo plano em um


computador local.

Get-Job Obtém os trabalhos de segundo plano iniciados


na sessão atual.

Receive-Job Obtém os resultados dos trabalhos de segundo plano.

Stop-Job Para um trabalho de segundo plano.

Wait-Job Suprime o prompt de comando até a conclusão de um


ou todos os trabalhos.

Remove-Job Exclui um trabalho de segundo plano.

Invoke-Command O parâmetro AsJob executa qualquer comando como


um trabalho de segundo plano em um computador remoto.
Você também pode usar o Invoke-Command para executar
qualquer comando de trabalho remotamente, incluindo um
comando Start-Job.

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

Você também pode gostar