about_Job_Details

Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0

TÓPICO

about_Job_Details

DESCRIÇÃO BREVE

Fornece detalhes sobre trabalhos em segundo plano nos computadores locais e remotos.

DESCRIÇÃO DETALHADA

Este tópico explica o conceito de um trabalho em segundo plano e fornece informações técnicas sobre como os trabalhos em segundo plano funcionam no Windows PowerShell®.

Este tópico é um complemento dos tópicos about_Jobs e about_Remote_Jobs.

SOBRE TRABALHOS EM SEGUNDO PLANO

Um trabalho em segundo plano executa um comando ou uma expressão de forma assíncrona. Ele pode executar um cmdlet, uma função, um script ou qualquer outra tarefa baseada em comando. Ele foi projetado para executar comandos que levam um longo período, mas você pode usá-lo para executar qualquer comando em segundo plano.

Quando um comando síncrono é executado, o prompt de comando do Windows PowerShell é suprimido até que o comando seja concluído. Mas um trabalho em segundo plano não suprime o prompt do Windows PowerShell. Um comando para iniciar um trabalho em segundo plano retorna um objeto de trabalho. O prompt retorna imediatamente, para que você possa trabalhar em outras tarefas enquanto o trabalho em segundo plano é executado.

No entanto, quando você inicia um trabalho em segundo plano, você não obtém os resultados imediatamente, mesmo se o trabalho for executado muito rapidamente. O objeto de trabalho retornado contém informações úteis sobre o trabalho, mas não contém os resultados dele. Você deve executar um comando separado para obter os resultados do trabalho. Você também pode executar comandos para interromper o trabalho, para aguardar até que o trabalho seja concluído e para excluir o trabalho.

Para tornar o tempo de um trabalho em segundo plano independente de outros comandos, cada trabalho em segundo plano é executado em seu próprio ambiente do Windows PowerShell (uma "sessão"). No entanto, isso pode ser uma conexão temporária que é criada apenas para executar o trabalho e, em seguida, é destruída, ou pode ser uma sessão persistente (uma PSSession) que pode ser usada para executar vários trabalhos ou comandos relacionados.

COMO USAR OS CMDLETS DE TRABALHO

Use um comando Start-Job para iniciar um trabalho em segundo plano em um computador local. O Start-Job retorna um objeto de trabalho. Você também pode obter objetos que representam os trabalhos que foram iniciados no computador local usando o cmdlet Get-Job.

Para obter os resultados do trabalho, use um comando Receive-Job. Se o trabalho não estiver concluído, o Receive-Job retornará resultados parciais. Você também pode usar o cmdlet Wait-Job para suprimir o prompt de comando até que um ou todos os trabalhos que foram iniciados na sessão sejam concluídos.

Para interromper um trabalho em segundo plano, use o cmdlet Stop-Job. Para excluir um trabalho, use o cmdlet Remove-Job.

Para obter mais informações sobre como os cmdlets funcionam, consulte o tópico de Ajuda para cada cmdlet e about_Jobs.

INICIAR TRABALHOS EM SEGUNDO PLANO EM COMPUTADORES REMOTOS

Você pode criar e gerenciar trabalhos em segundo plano em um computador local ou remoto. Para executar um trabalho em segundo plano remotamente, use o parâmetro AsJob de um cmdlet como Invoke-Command ou use o cmdlet Invoke-Command para executar um comando Start-Job remotamente. Você também pode iniciar um trabalho em segundo plano em uma sessão interativa.

Para obter mais informações sobre trabalhos remotos em segundo plano, consulte about_Remote_Jobs.

TRABALHOS FILHO

Cada trabalho em segundo plano consiste em um trabalho pai e um ou mais trabalhos filho. Em trabalhos iniciados usando Start-Job ou o parâmetro AsJob do Invoke-Command, o trabalho pai é um executivo. Ele não é executado em nenhum comando nem retorna resultados. Na verdade, os comandos são executados pelos trabalhos filho. (Trabalhos iniciados usando outros cmdlets talvez funcionem de forma diferente.)

Os trabalhos filho são armazenados na propriedade ChildJobs do objeto de trabalho pai. A propriedade ChildJobs pode conter um ou vários objetos de trabalho filho. Os objetos de trabalho filho têm um nome, ID e ID da instância que diferem do trabalho pai, para que você possa gerenciar os trabalhos pai e filho individualmente ou como uma unidade.

Para obter os trabalhos pai e filho de um trabalho, use o parâmetro IncludeChildJobs do cmdlet Get-Job. O parâmetro IncludeChildJob é introduzido no Windows PowerShell 3.0.

        C:\PS> Get-Job -IncludeChildJob

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        1     Job1   RemoteJob     Failed     True          localhost   Get-Process
        2     Job2                 Completed  True          Server01    Get-Process
        3     Job3                 Failed     False         localhost   Get-Process

Para obter o trabalho pai e apenas os trabalhos filho com um determinado valor State, use o parâmetro ChildJobState do cmdlet Get-Job. O parâmetro ChildJobState é introduzido no Windows PowerShell 3.0.

        C:\PS> Get-Job -ChildJobState Failed

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        1     Job1   RemoteJob     Failed     True          localhost   Get-Process
        3     Job3                 Failed     False         localhost   Get-Process

Para obter os trabalhos filho de um trabalho em todas as versões do Windows PowerShell, use a propriedade ChildJob do trabalho pai.

        C:\PS> (Get-Job Job1).ChildJobs

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        2     Job2                 Completed  True          Server01    Get-Process
        3     Job3                 Failed     False         localhost   Get-Process

Você também pode usar um comando Get-Job no trabalho filho, conforme exibido no comando a seguir:

        C:\PS> Get-Job Job3

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        3     Job3                 Failed     False         localhost   Get-Process

A configuração do trabalho filho depende do comando que você usar para iniciar o trabalho.

Quando você usar Start-Job para iniciar um trabalho em um computador local, o trabalho consistirá em um trabalho pai executivo e um trabalho filho que executa o comando.

Quando você usar o parâmetro AsJob do Invoke-Command para iniciar um trabalho em um ou mais computadores, o trabalho consistirá em um trabalho pai executivo e um trabalho filho para cada trabalho executado em cada computador.

Quando você usar o Invoke-Command para executar um comando Start-Job em um ou mais computadores remotos, o resultado será igual ao de um comando local executado em cada computador remoto. O comando retorna um objeto de trabalho para cada computador. O objeto de trabalho consiste em um trabalho pai executivo em um trabalho filho que executa o comando.

O trabalho pai representa todos os trabalhos filho. Quando você gerencia um trabalho pai, também gerencia os trabalhos filho associados. Por exemplo, se você interromper um trabalho pai, todos os trabalhos filho serão interrompidos. Se você receber os resultados de um trabalho pai, obterá os resultados de todos os trabalhos filho.

No entanto, você também pode gerenciar trabalhos filho individualmente. Isso é mais útil quando você deseja investigar um problema com um trabalho ou obter os resultados de apenas um dos vários trabalhos filho iniciado usando o parâmetro AsJob do Invoke-Command. (O caractere backtick [`] é o caractere de continuação).

O comando a seguir usa o parâmetro AsJob do Invoke-Command para iniciar trabalhos em segundo plano no computador local e em dois computadores remotos. O comando salva o trabalho na variável $j.

        PS C:> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
               -Command {Get-Date} -AsJob

Quando você exibe as propriedades Name e ChildJob do trabalho em $j, ele mostra que o comando retornou um objeto de trabalho com três trabalhos filho, um para cada computador.

        CPS C:> $j | Format-List Name, ChildJobs

        Name      : Job3
        ChildJobs : {Job4, Job5, Job6}

Quando você exibe o trabalho pai, ele mostra que o trabalho falhou.

        C:\PS> $j

        Id    Name   PSJobTypeName State      HasMoreData   Location    
        --    ----   ------------- -----      -----------   --------   
        3     Job3   RemotingJob   Failed     False         localhost,Server...

Mas quando você executa um comando Get-Job que obtém os trabalhos filho, a saída mostra que somente um trabalho filho falhou.

        PS C:\> Get-Job -IncludeChildJobs

        Id    Name   PSJobTypeName State      HasMoreData   Location    Command
        --    ----   ------------- -----      -----------   --------    -------
        3     Job3   RemotingJob   Failed     False         localhost,Server...
        4     Job4                 Completed  True          localhost   Get-Date
        5     Job5                 Failed     False         Server01    Get-Date
        6     Job6                 Completed  True          Server02    Get-Date

Para obter os resultados de todos os trabalhos filho, use o cmdlet Receive-Job para obter os resultados do trabalho pai. No entanto, você também pode obter os resultados de um trabalho filho específico, conforme exibido no comando a seguir.

        C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto

        ComputerName DateTime
        ------------ --------
        Server02     Thursday, March 13, 2008 4:16:03 PM

O recurso de trabalhos filho dos trabalhos em segundo plano do Windows PowerShell oferece mais controle sobre os trabalhos que você executa.

TIPOS DE TRABALHO

O Windows PowerShell dá suporte a diferentes tipos de trabalhos para tarefas diferentes. A partir do Windows PowerShell 3.0, os desenvolvedores podem gravar "adaptadores de fonte de trabalho" que adicionam novos tipos de trabalho ao Windows PowerShell e que incluem os adaptadores de fonte dos trabalhos em módulos. Quando você importar o módulo, poderá usar o novo tipo de trabalho em sua sessão.

Por exemplo, o módulo PSScheduledJob adiciona trabalhos agendados e, o PSWorkflow, adiciona tarefas de fluxo de trabalho.

Os tipos de trabalhos personalizados podem diferir significativamente dos trabalhos padrão em segundo plano do Windows PowerShell. Por exemplo, os trabalhos agendados são salvos no disco; eles não existem apenas em uma determinada sessão. As tarefas de fluxo de trabalho podem ser suspensas e retomadas.

Os cmdlets que você usa para gerenciar trabalhos personalizados dependem do tipo de trabalho. Para alguns, você deve usar os cmdlets de trabalho padrão, como Get-Job e Start-Job. Outros vêm com cmdlets especializados que gerenciar somente um determinado tipo de trabalho. Para obter informações detalhadas sobre os tipos de trabalho personalizados, consulte os tópicos de ajuda sobre o tipo de trabalho.

Para localizar o tipo de um trabalho, use o cmdlet Get-Job. O Get-Job retorna objetos de trabalho diferentes para diferentes tipos de trabalhos. O valor da propriedade PSJobTypeName dos objetos de trabalho que o Get-Job retorna o tipo de trabalho.

A tabela a seguir lista os tipos de trabalho que acompanham o Windows PowerShell.

      Job Type         Description
      --------         -----------
      BackgroundJob    Started by using the Start-Job cmdlet.
      RemoteJob        Started by using the AsJob parameter of the 
                       Invoke-Command cmdlet.
      PSWorkflowJob    Started by using the AsJob parameter of a
                       workflow.
      PSScheduledJob   An instance of a scheduled job started by
                       a job trigger.
      CIMJob           Started by using the AsJob parameter of 
                       a cmdlet from a CDXML module.
      WMIJob           Started by using the AsJob parameter of 
                       a cmdlet from a WMI module.
      PSEventJob       Created by running Register-ObjectEvent 
                       and specifying an action with the Action
                       parameter.

OBSERVAÇÃO:

Antes de usar o cmdlet Get-Job para obter trabalhos de um tipo específico, verifique se o módulo que adiciona o tipo de trabalho é importado para a sessão atual. Caso contrário, o Get-Job não obtém trabalhos desse tipo.

EXEMPLO

Os seguintes comandos criam um trabalho local em segundo plano, um trabalho remoto em segundo plano, uma tarefa de fluxo de trabalho e um trabalho agendado. Em seguida, ele usa o cmdlet Get-Job para obter os trabalhos. O Get-Job não obterá o trabalho agendado, mas obterá todas as suas instâncias iniciadas.

    # Start a background job on the local computer.
    PS C:\> Start-Job -Name LocalData {Get-Process}

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    LocalData   BackgroundJob   Running        True     localhost  Get-Process
    # Start a background job that runs on a remote computer.
    PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    RemoteData  RemoteJob       Running        True     Server01   Get-Process
    # Create a scheduled job
    PS C:\>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock {Get-Process} `
             -Trigger (New-JobTrigger -Once -At "3 PM")

    Id         Name            JobTriggers     Command       Enabled
    --         ----            -----------     -------       -------
    1          ScheduledJob    1               Get-Process   True
    # Create a workflow. 
    PS C:\> workflow Test-Workflow {Get-Process}

    # Run the workflow as a job.
    PS C:\> Test-Workflow -AsJob -JobName TestWFJob

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    TestWFJob   PSWorkflowJob   NotStarted     True     localhost  Get-Process
    # Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
      instances of the scheduled job that are started.

    PS C:\> Get-Job

    Id   Name         PSJobTypeName   State     HasMoreData     Location  Command
    --   ----         -------------   -----     -----------     --------  -------
    2    LocalData    BackgroundJob   Completed True            localhost Get-Process
    4    RemoteData   RemoteJob       Completed True            Server01  Get-Process
    6    TestWFJob    PSWorkflowJob   Completed True            localhost WorkflowJob
    8    ScheduledJob PSScheduledJob  Completed True            localhost Get-Process
    # To get scheduled jobs, use the Get-ScheduledJob cmdlet.
    PS C:\> Get-ScheduledJob

    Id         Name            JobTriggers     Command       Enabled
    --         ----            -----------     -------       -------
    1          ScheduledJob    1               Get-Process   True

CONSULTE TAMBÉM

about_Jobs

about_Remote_Jobs

about_Remote

about_Scheduled_Jobs

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

Suspend-Job

Resume-Job

New-PSSession

Enter-PSSession

Exit-PSSession

Register-ScheduledJob

Get-ScheduleJob