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