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




Sumário