Поделиться через


Receive-Job

Возвращает результаты фоновых заданий PowerShell в текущем сеансе.

Синтаксис

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
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [-Name] <String[]>
       [<CommonParameters>]
Receive-Job
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [-InstanceId] <Guid[]>
       [<CommonParameters>]
Receive-Job
       [-Keep]
       [-NoRecurse]
       [-Force]
       [-Wait]
       [-AutoRemoveJob]
       [-WriteEvents]
       [-WriteJobInResults]
       [-Id] <Int32[]>
       [<CommonParameters>]

Описание

Командлет Receive-Job получает результаты фоновых заданий PowerShell, например, запущенных с помощью командлета Start-Job или параметра AsJob любого командлета. Можно получить результаты всех заданий или указать задания по имени, идентификатору, идентификатору экземпляра, имени компьютера, расположению или сеансу или путем отправки объекта задания.

При запуске фонового задания PowerShell задание запускается, но результаты отображаются не сразу. Вместо этого команда возвращает объект, представляющий фоновое задание. Объект задания содержит полезные сведения о задании, но не содержит результатов. Этот метод позволяет продолжить работу в сеансе во время выполнения задания. Дополнительные сведения о фоновых заданиях в PowerShell см. в разделе about_Jobs.

Командлет Receive-Job получает результаты, созданные к моменту отправки Receive-Job команды. Если результаты еще не завершены, можно выполнить дополнительные Receive-Job команды, чтобы получить оставшиеся результаты.

По умолчанию результаты задания удаляются из системы при их получении, однако можно использовать параметр Keep для сохранения результатов, чтобы можно было получить их снова. Чтобы удалить результаты задания, снова выполните Receive-Job команду без параметра Keep , закройте сеанс или удалите задание из сеанса с помощью Remove-Job командлета .

Начиная с Windows PowerShell 3.0, Receive-Job также получает результаты пользовательских типов заданий, таких как задания рабочих процессов и экземпляры запланированных заданий. Чтобы включить Receive-Job получение результатов пользовательского типа задания, импортируйте модуль, поддерживающий пользовательский тип задания, в сеанс перед выполнением Receive-Job команды с помощью командлета Import-Module или с помощью командлета или получения командлета в модуле. Дополнительные сведения о определенных пользовательских типах заданий см. в разделе документации о данной функции.

Примеры

Пример 1. Получение результатов для определенного задания

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

Эти команды используют параметр Job для Receive-Job получения результатов определенного задания.

Первая команда запускает задание с Start-Job и сохраняет объект задания в переменной $job .

Вторая команда использует Receive-Job командлет для получения результатов задания. Она использует параметр Job для указания задания.

Пример 2. Использование параметра Keep

$job = Start-Job -ScriptBlock {Get-Service dhcp, fakeservice}
$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

В этом примере задание сохраняется в переменной $job и передается в Receive-Job командлет . Параметр -Keep также используется для повторного извлечения всех агрегированных данных потока после первого представления.

Пример 3. Получение результатов нескольких фоновых заданий

При использовании параметра Invoke-CommandAsJob для запуска задания объект задания создается на локальном компьютере, даже если задание выполняется на удаленных компьютерах. Таким образом, для управления заданием можно использовать локальные команды.

Кроме того, при использовании AsJob PowerShell возвращает один объект задания, содержащий дочернее задание для каждого запущенного задания. В этом случае объект задания содержит три дочерних задания (по одному для каждого задания на каждом удаленном компьютере).

# 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

Пример 4. Получение результатов фоновых заданий на нескольких удаленных компьютерах

# 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 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.
$j = Invoke-Command -Session $s -ScriptBlock {​Start-Job -Name $('MyJob-' +$env:COMPUTERNAME) -ScriptBlock {(Get-Date).ToString()​}​}
# 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

В этом примере показано, как получить результаты фоновых заданий, выполняющихся на трех удаленных компьютерах. В отличие от предыдущего примера, использование Invoke-Command для выполнения Start-Job команды фактически запустило три независимых задания на каждом из трех компьютеров. В результате команда вернула три объекта заданий, представляющие три задания, выполняемые локально на трех разных компьютерах.

Пример 5. Доступ к дочерним заданиям

Параметр -Keep сохраняет состояние агрегированных потоков задания, чтобы его можно было просмотреть снова. Без этого параметра все агрегированные данные потока удаляются при получении задания. Дополнительные сведения см. в разделе about_Job_Details

Примечание

Агрегированные потоки включают потоки всех дочерних заданий. Вы по-прежнему можете получить доступ к отдельным потокам данных через объект задания и дочерние объекты задания.

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

Параметры

-AutoRemoveJob

Указывает, что этот командлет удаляет задание после возврата результатов задания. Если у задания больше результатов, задание по-прежнему удаляется, но Receive-Job отображается сообщение.

Этот параметр работает только для настраиваемых типов заданий. Он предназначен для экземпляров типов заданий, которые сохраняют задание или тип вне сеанса, например для экземпляров запланированных заданий.

Этот параметр нельзя использовать без параметра Wait .

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ComputerName

Задает массив имен компьютеров.

Этот параметр выбирает результаты задания, которые хранятся на локальном компьютере. Он не получает данные для заданий, выполняемых на удаленных компьютерах. Чтобы получить результаты задания, хранящиеся на удаленных компьютерах, используйте Invoke-Command командлет для удаленного Receive-Job выполнения команды.

Type:String[]
Aliases:Cn
Position:1
Default value:All computers available
Required:False
Accept pipeline input:True
Accept wildcard characters:True

-Force

Указывает, что этот командлет продолжает ожидать, если задания находятся в состоянии Приостановлено или Отключено . По умолчанию параметр Receive-JobWait возвращает или завершает ожидание, если задания находятся в одном из следующих состояний:

  • Завершено
  • Сбой
  • Остановлена
  • Приостановлена
  • отключен.

Параметр Force допустим, только если в команде также используется параметр Wait.

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Id

Задает массив идентификаторов. Этот командлет получает результаты заданий с указанными идентификаторами.

Идентификатор — это целое число, которое однозначно идентифицирует задание в текущем сеансе. Его легче запомнить и ввести, чем идентификатор экземпляра, но он уникален только в текущем сеансе. Можно ввести один или несколько идентификаторов, разделенных запятыми. Чтобы найти идентификатор задания, используйте .Get-Job

Type:Int32[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-InstanceId

Задает массив идентификаторов экземпляров. Этот командлет получает результаты заданий с указанными идентификаторами экземпляров.

Идентификатор экземпляра — это GUID, который однозначно определяет задание на компьютере. Чтобы найти идентификатор экземпляра задания, используйте Get-Job командлет .

Type:Guid[]
Position:0
Default value:All instances
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Job

Указывает задание, для которого получаются результаты.

Введите переменную, содержащую задание, или команду, которая получает задание. Вы также можете передать объект задания в Receive-Job.

Type:Job[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Keep

Указывает, что этот командлет сохраняет агрегированные потоковые данные в системе даже после их получения. По умолчанию агрегированные потоковые данные удаляются после просмотра с помощью Receive-Job.

При закрытии сеанса или удалении задания с помощью командлета Remove-Job также удаляются агрегированные потоковые данные.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Location

Задает массив расположений. Этот командлет получает только результаты заданий в указанных расположениях.

Type:String[]
Position:1
Default value:All locations
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Name

Указывает массив понятных имен. Этот командлет получает результаты заданий с указанными именами. Поддерживаются подстановочные знаки.

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:True

-NoRecurse

Указывает, что этот командлет получает результаты только из указанного задания. По умолчанию Receive-Job также получает результаты всех дочерних заданий указанного задания.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Session

Задает массив сеансов. Этот командлет получает результаты заданий, которые выполнялись в указанном сеансе PowerShell (PSSession). Введите переменную, содержащую PSSession , или команду, которая получает PSSession, например Get-PSSession команду .

Type:PSSession[]
Position:1
Default value:All sessions
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Wait

Указывает, что этот командлет подавляет командную строку, пока не будут получены все результаты задания. По умолчанию Receive-Job немедленно возвращает доступные результаты.

По умолчанию параметр Wait ожидает, пока задание не перейдет в одно из следующих состояний:

  • Завершено
  • Сбой
  • Остановлена
  • Приостановлена
  • отключен.

Чтобы параметр Wait продолжал ожидать, если задание находится в состоянии Suspended или Disconnected, используйте параметр Force вместе с параметром Wait .

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WriteEvents

Указывает, что этот командлет сообщает об изменениях в состоянии задания во время ожидания завершения задания.

Этот параметр допустим, только если параметр Wait используется в команде и опущен параметр Keep.

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WriteJobInResults

Указывает, что этот командлет возвращает объект задания с последующими результатами.

Этот параметр допустим, только если параметр Wait используется в команде и опущен параметр Keep.

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Входные данные

Job

Объекты заданий можно передать в этот командлет.

Выходные данные

PSObject

Этот командлет возвращает результаты команд в задании.

Примечания

PowerShell включает следующие псевдонимы для Receive-Job:

  • Для всех платформ.
    • rcjb