Compartilhar via


Receive-Job

Obtém os resultados dos trabalhos em segundo plano do PowerShell na sessão atual.

Sintaxe

Receive-Job
       [-Job] <Job[]>
       [[-Location] <string[]>]
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [<CommonParameters>]
Receive-Job
       [-Job] <Job[]>
       [[-ComputerName] <string[]>]
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [<CommonParameters>]
Receive-Job
       [-Job] <Job[]>
       [[-Session] <PSSession[]>]
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [<CommonParameters>]
Receive-Job
       [-Name] <string[]>
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [<CommonParameters>]
Receive-Job
       [-InstanceId] <guid[]>
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [<CommonParameters>]
Receive-Job
       [-Id] <int[]>
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [<CommonParameters>]

Description

O Receive-Job cmdlet obtém os resultados de trabalhos em segundo plano do PowerShell, como aqueles iniciados usando o Start-Job cmdlet ou o parâmetro AsJob de qualquer cmdlet. Você pode obter os resultados de todos os trabalhos ou identificar trabalhos pelo nome, ID, ID de instância, nome do computador, local ou sessão ou enviando um objeto de trabalho.

Quando você inicia um trabalho em segundo plano do PowerShell, o trabalho é iniciado, mas os resultados não aparecem imediatamente. Em vez disso, o comando retorna um objeto que representa o trabalho em segundo plano. O objeto de trabalho contém informações úteis sobre o trabalho, mas não contém os resultados. Esse método permite que você continue a trabalhar na sessão enquanto o trabalho é executado. Para obter mais informações sobre trabalhos em segundo plano no PowerShell, consulte about_Jobs.

O Receive-Job cmdlet obtém os resultados que foram gerados no momento em que o Receive-Job comando é enviado. Se os resultados ainda não estiverem concluídos, você poderá executar comandos adicionais Receive-Job para obter os resultados restantes.

Por padrão, os resultados do trabalho são excluídos do sistema quando você os recebe, mas você pode usar o parâmetro Keep para salvar os resultados para que possa recebê-los novamente. Para excluir os resultados do trabalho, execute o Receive-Job comando novamente sem o parâmetro Keep , feche a sessão ou use o Remove-Job cmdlet para excluir o trabalho da sessão.

A partir do Windows PowerShell 3.0, Receive-Job também obtém os resultados de tipos de trabalho personalizados, como trabalhos de fluxo de trabalho e instâncias de trabalhos agendados. Para habilitar Receive-Job a obtenção dos resultados de um tipo de trabalho personalizado, importe o módulo que dá suporte ao tipo de trabalho personalizado para a sessão antes de executar um Receive-Job comando, usando o Import-Module cmdlet ou obtendo um cmdlet no módulo. Para obter informações sobre um tipo específico de trabalho personalizado, consulte a documentação do recurso de tipo de trabalho personalizado.

Exemplos

Exemplo 1: Obter resultados para um trabalho específico

$job = Start-Job -ScriptBlock {Get-Process}
Start-Sleep -Seconds 1
Receive-Job -Job $job

Esses comandos usam o parâmetro Job de Receive-Job para obter os resultados de um trabalho específico.

O primeiro comando inicia um trabalho e Start-Job armazena o objeto de trabalho na $job variável.

O segundo comando usa o Receive-Job cmdlet para obter os resultados do trabalho. Ele usa o parâmetro Job para especificar o trabalho.

Exemplo 2: Usar o parâmetro Keep

$job = Start-Job -ScriptBlock {Get-Service dhcp, fakeservice}
Start-Sleep -Seconds 1
$job | Receive-Job -Keep

Cannot find any service with service name 'fakeservice'.
    + CategoryInfo          : ObjectNotFound: (fakeservice:String) [Get-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand
    + PSComputerName        : localhost

Status   Name               DisplayName
------   ----               -----------
Running  dhcp               DHCP Client

$job | Receive-Job -Keep

Cannot find any service with service name 'fakeservice'.
    + CategoryInfo          : ObjectNotFound: (fakeservice:String) [Get-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand
    + PSComputerName        : localhost

Status   Name               DisplayName
------   ----               -----------
Running  dhcp               DHCP Client

Este exemplo armazena um trabalho na $job variável e canaliza o trabalho para o Receive-Job cmdlet. O -Keep parâmetro também é usado para permitir que todos os dados de fluxo agregados sejam recuperados novamente após a primeira exibição.

Exemplo 3: Obter resultados de vários trabalhos em segundo plano

Quando você usa o parâmetro AsJob de para iniciar um trabalho, o objeto de Invoke-Command trabalho é criado no computador local, mesmo que o trabalho seja executado nos computadores remotos. Como resultado, você deve usar comandos locais para gerenciar o trabalho.

Além disso, quando você usa AsJob, o PowerShell retorna um objeto de trabalho que contém um trabalho filho para cada trabalho que foi iniciado. Nesse caso, o objeto de trabalho contém três trabalhos filho, um para cada trabalho em cada computador remoto.

# Use the Invoke-Command cmdlet with the -AsJob parameter to start a background job that
# runs a Get-Service command on three remote computers. Store the resulting job object in
# the $j variable
$j = Invoke-Command -ComputerName Server01, Server02, Server03 -ScriptBlock {Get-Service} -AsJob
# Display the value of the **ChildJobs** property of the job object in $j. The display
# shows that the command created three child jobs, one for the job on each remote
# computer. You could also use the -IncludeChildJobs parameter of the Get-Job cmdlet.
$j.ChildJobs

Id   Name     State      HasMoreData   Location       Command
--   ----     -----      -----------   --------       -------
2    Job2     Completed  True          Server01       Get-Service
3    Job3     Completed  True          Server02       Get-Service
4    Job4     Completed  True          Server03       Get-Service

# Use the Receive-Job cmdlet to get the results of just the Job3 child job that ran on the
# Server02 computer. Use the *Keep* parameter to allow you to view the aggregated stream
# data more than once.
Receive-Job -Name Job3 -Keep

Status  Name        DisplayName                        PSComputerName
------  ----------- -----------                        --------------
Running AeLookupSvc Application Experience             Server02
Stopped ALG         Application Layer Gateway Service  Server02
Running Appinfo     Application Information            Server02
Running AppMgmt     Application Management             Server02

Exemplo 4: Obter resultados de trabalhos em segundo plano em vários computadores remotos

# Use the New-PSSession cmdlet to create three user-managed PSSessions on three servers,
# and save the sessions in the $s variable.
$s = New-PSSession -ComputerName Server01, Server02, Server03
# Use Invoke-Command run a Start-Job command in each of the PSSessions in the $s variable.
# The code creates a new job with a custom name to each server. The job outputs the
# datetime from each server. Save the job objects in the $j variable.
$invokeCommandSplat = @{
    Session = $s
    ScriptBlock = {
        Start-Job -Name $('MyJob-' +$env:COMPUTERNAME) -ScriptBlock {
            (Get-Date).ToString()
        }
    }
}
$j = Invoke-Command @invokeCommandSplat
# To confirm that these job objects are from the remote machines, run Get-Job to show no
# local jobs running.
Get-Job`
# Display the three job objects in $j. Note that the Localhost location is not the local
# computer, but instead localhost as it relates to the job on each Server.
$j

Id   Name               State      HasMoreData   Location   Command
--   ----               -----      -----------   --------   -------
1    MyJob-Server01     Completed  True          Localhost  (Get-Date).ToString()
2    MyJob-Server02     Completed  True          Localhost  (Get-Date).ToString()
3    MyJob-Server03     Completed  True          Localhost  (Get-Date).ToString()

# Use Invoke-Command to run a Receive-Job command in each of the sessions in the $s
# variable and save the results in the $results variable. The Receive-Job command must be
# run in each session because the jobs were run locally on each server.
$results = Invoke-Command -Session $s -ScriptBlock {
    Receive-Job -Name $('MyJob-' +$env:COMPUTERNAME)
}

3/22/2021 7:41:47 PM
3/22/2021 7:41:47 PM
3/22/2021 9:41:47 PM

Este exemplo mostra como obter os resultados de trabalhos em segundo plano executados em três computadores remotos. Ao contrário do exemplo anterior, usar Invoke-Command para executar o Start-Job comando na verdade iniciou três trabalhos independentes em cada um dos três computadores. Como resultado, o comando retornou três objetos de trabalho representando três trabalhos executados localmente em três computadores diferentes.

Exemplo 5: Acessar trabalhos filho

O -Keep parâmetro preserva o estado dos fluxos agregados de um trabalho para que ele possa ser visualizado novamente. Sem esse parâmetro, todos os dados de fluxo agregados são apagados quando o trabalho é recebido. Para obter mais informações, consulte about_Job_Details

Observação

Os fluxos agregados incluem os fluxos de todos os trabalhos filhos. Você ainda pode acessar os fluxos individuais de dados por meio do objeto de trabalho e dos objetos de trabalho filho.

Start-Job -Name TestJob -ScriptBlock {dir C:\, Z:\}
# Without the Keep parameter, aggregated child job data is displayed once.
# Then destroyed.
Receive-Job -Name TestJob

Directory: C:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-r---        1/24/2019   7:11 AM                Program Files
d-r---        2/13/2019   8:32 AM                Program Files (x86)
d-r---        10/3/2018  11:47 AM                Users
d-----         2/7/2019   1:52 AM                Windows
Cannot find drive. A drive with the name 'Z' does not exist.
    + CategoryInfo          : ObjectNotFound: (Z:String) [Get-ChildItem], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : localhost

# It would seem that the child job data is gone.
Receive-Job -Name TestJob



# Using the object model, you can still retrieve child job data and streams.
$job = Get-Job -Name TestJob
$job.ChildJobs[0].Error

Cannot find drive. A drive with the name 'Z' does not exist.
    + CategoryInfo          : ObjectNotFound: (Z:String) [Get-ChildItem], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : localhost

Parâmetros

-AutoRemoveJob

Indica que esse cmdlet exclui o trabalho depois de retornar os resultados do trabalho. Se o trabalho tiver mais resultados, ele ainda será excluído, mas Receive-Job exibirá uma mensagem.

Esse parâmetro só funciona em tipos de trabalho personalizados. Ele foi projetado para instâncias de tipos de trabalho que salvam o trabalho ou o tipo fora da sessão, como instâncias de trabalhos agendados.

Esse parâmetro não pode ser usado sem o parâmetro Wait .

Este parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-ComputerName

Especifica uma matriz de nomes de computadores.

Esse parâmetro seleciona entre os resultados do trabalho que estão armazenados no computador local. Ele não obtém dados para trabalhos executados em computadores remotos. Para obter resultados de trabalho armazenados em computadores remotos, use o Invoke-Command cmdlet para executar um Receive-Job comando remotamente.

Tipo:String[]
Aliases:Cn
Cargo:1
Valor padrão:All computers available
Obrigatório:False
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:True

-Force

Indica que esse cmdlet continua aguardando se os trabalhos estiverem no estado Suspenso ou Desconectado . Por padrão, o parâmetro Wait de Receive-Job retorna ou encerra a espera quando os trabalhos estão em um dos seguintes estados:

  • Concluído(a)
  • Com falha
  • Parado
  • Suspenso
  • Desconectado

O parâmetro Force é válido somente quando o parâmetro Wait também é usado no comando.

Este parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Id

Especifica uma matriz de IDs. Esse cmdlet obtém os resultados dos trabalhos com as IDs especificadas.

O ID é um inteiro que identifica exclusivamente o trabalho na sessão atual. é mais fácil de lembrar e digitar do que o ID da instância, mas é exclusivo apenas na sessão atual. Você pode digitar uma ou mais IDs separadas por vírgulas. Para localizar a ID de um trabalho, use Get-Job.

Tipo:Int32[]
Cargo:0
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-InstanceId

Especifica uma matriz de IDs de instância. Esse cmdlet obtém os resultados dos trabalhos com as IDs de instância especificadas.

Uma ID de instância é um GUID que identifica exclusivamente o trabalho no computador. Para localizar a ID da instância de um trabalho, use o Get-Job cmdlet.

Tipo:Guid[]
Cargo:0
Valor padrão:All instances
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-Job

Especifica o trabalho para o qual os resultados estão sendo recuperados.

Insira uma variável que contenha o trabalho ou um comando que obtenha o trabalho. Você também pode canalizar um objeto de trabalho para o Receive-Job.

Tipo:Job[]
Cargo:0
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-Keep

Indica que esse cmdlet salva os dados de fluxo agregados no sistema, mesmo depois de recebê-los. Por padrão, os dados de fluxo agregados são apagados depois de exibidos com Receive-Job.

Fechar a sessão ou remover o trabalho com o Remove-Job cmdlet também exclui dados de fluxo agregados.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Location

Especifica uma matriz de locais. Esse cmdlet obtém apenas os resultados dos trabalhos nos locais especificados.

Tipo:String[]
Cargo:1
Valor padrão:All locations
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Name

Especifica uma matriz de nomes amigáveis. Esse cmdlet obtém os resultados de trabalhos que têm os nomes especificados. Há suporte para caracteres curinga.

Tipo:String[]
Cargo:0
Valor padrão:None
Obrigatório:True
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:True

-NoRecurse

Indica que esse cmdlet obtém resultados somente do trabalho especificado. Por padrão, Receive-Job também obtém os resultados de todos os trabalhos filho do trabalho especificado.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-Session

Especifica uma matriz de sessões. Esse cmdlet obtém os resultados dos trabalhos que foram executados na sessão do PowerShell especificada (PSSession). Insira uma variável que contenha o PSSession ou um comando que obtenha o PSSession, como um Get-PSSession comando.

Tipo:PSSession[]
Cargo:1
Valor padrão:All sessions
Obrigatório:False
Aceitar a entrada de pipeline:True
Aceitar caracteres curinga:False

-Wait

Indica que esse cmdlet suprime o prompt de comando até que todos os resultados do trabalho sejam recebidos. Por padrão, Receive-Job retorna imediatamente os resultados disponíveis.

Por padrão, o parâmetro Wait aguarda até que o trabalho esteja em um dos seguintes estados:

  • Concluído(a)
  • Com falha
  • Parado
  • Suspenso
  • Desconectado

Para direcionar o parâmetro Wait para continuar aguardando se o estado do trabalho for Suspenso ou Desconectado, use o parâmetro Force junto com o parâmetro Wait.

Este parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:None
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-WriteEvents

Indica que esse cmdlet relata alterações no estado do trabalho enquanto aguarda a conclusão do trabalho.

Esse parâmetro é válido somente quando o parâmetro Wait é usado no comando e o parâmetro Keep é omitido.

Este parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

-WriteJobInResults

Indica que esse cmdlet retorna o objeto de trabalho seguido pelos resultados.

Esse parâmetro é válido somente quando o parâmetro Wait é usado no comando e o parâmetro Keep é omitido.

Este parâmetro foi introduzido no Windows PowerShell 3.0.

Tipo:SwitchParameter
Cargo:Named
Valor padrão:False
Obrigatório:False
Aceitar a entrada de pipeline:False
Aceitar caracteres curinga:False

Entradas

Job

Você pode canalizar objetos de trabalho para esse cmdlet.

Saídas

PSObject

Esse cmdlet retorna os resultados dos comandos no trabalho.

Observações

O Windows PowerShell inclui os seguintes aliases para Receive-Job:

  • rcjb