Compartilhar via


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.

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