about_Job_Details

Краткое описание

Содержит сведения о фоновых заданиях на локальных и удаленных компьютерах.

Подробное описание

В этом разделе объясняется концепция фонового задания и технические сведения о работе фоновых заданий в PowerShell.

Этот раздел является дополнением к темам about_Jobs, about_Thread_Jobs и about_Remote_Jobs .

О фоновых заданиях

Фоновое задание выполняет команду или выражение асинхронно. Он может выполнять командлет, функцию, скрипт или любую другую задачу на основе команд. Он предназначен для выполнения команд, которые занимают длительный период времени, но его можно использовать для выполнения любой команды в фоновом режиме.

Когда выполняется синхронная команда, командная строка PowerShell подавляется до завершения команды. Но фоновое задание не подавляет запрос PowerShell. Команда для запуска фонового задания возвращает объект задания. Запрос возвращается немедленно, чтобы вы могли работать над другими задачами во время выполнения фонового задания.

Однако при запуске фонового задания результаты не получаются сразу, даже если задание выполняется очень быстро. Возвращаемый объект задания содержит полезные сведения о задании, но не содержит результатов задания. Чтобы получить результаты задания, необходимо выполнить отдельную команду. Вы также можете выполнить команды, чтобы остановить задание, дождаться завершения задания и удалить задание.

Чтобы сделать время фонового задания независимо от других команд, каждое фоновое задание выполняется в собственном сеансе PowerShell. Однако это может быть временное соединение, созданное только для запуска задания и затем уничтоженное, или это может быть постоянное подключение PSSession , которое можно использовать для выполнения нескольких связанных заданий или команд.

Использование командлетов заданий

Используйте команду, чтобы запустить фоновое Start-Job задание на локальном компьютере. Start-Job возвращает объект задания. Можно также получить объекты, представляющие задания, запущенные на локальном компьютере, с помощью командлета Get-Job .

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

Чтобы остановить фоновое задание, используйте Stop-Job командлет. Чтобы удалить задание, используйте Remove-Job командлет.

Дополнительные сведения о работе командлетов см. в разделе справки для каждого командлета и about_Jobs.

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

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

Дополнительные сведения о удаленных фоновых заданиях см. в about_Remote_Jobs.

Дочерние задания

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

Дочерние задания хранятся в свойстве ChildJobs родительского объекта задания. Свойство ChildJobs может содержать один или несколько дочерних объектов задания. Дочерние объекты задания имеют имя, идентификатор и идентификатор экземпляра , которые отличаются от родительского задания, чтобы управлять родительскими и дочерними заданиями по отдельности или как единицей.

Чтобы получить родительские и дочерние задания задания задания, используйте параметр IncludeChildJobs командлета Get-Job . Параметр IncludeChildJob появился в Windows PowerShell 3.0.

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

Чтобы получить родительское задание и только дочерние задания с определенным значением состояния , используйте параметр ChildJobState командлета Get-Job . Параметр ChildJobState появился в Windows PowerShell 3.0.

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

Чтобы получить дочерние задания задания во всех версиях PowerShell, используйте свойство ChildJob родительского задания.

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

Вы также можете использовать Get-Job команду в дочернем задании, как показано в следующей команде:

PS> Get-Job Job3

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

Конфигурация дочернего задания зависит от команды, используемой для запуска задания.

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

  • При использовании параметра Invoke-Command AsJob для запуска задания на одном или нескольких компьютерах задание состоит из исполнительного родительского задания и дочернего задания для каждого задания, выполняемого на каждом компьютере.

  • При выполнении Invoke-CommandStart-Job команды на одном или нескольких удаленных компьютерах результат совпадает с локальной командой, выполняемой на каждом удаленном компьютере. Команда возвращает объект задания для каждого компьютера. Объект задания состоит из исполнительного родительского задания и одного дочернего задания, выполняющего команду.

Родительское задание представляет все дочерние задания. При управлении родительским заданием вы также управляете связанными дочерними заданиями. Например, если остановить родительское задание, все дочерние задания будут остановлены. Если вы получите результаты родительского задания, вы получите результаты всех дочерних заданий.

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

Следующая команда использует параметр AsJob для Invoke-Command запуска фоновых заданий на локальном компьютере и двух удаленных компьютерах. Команда сохраняет задание в переменной $j .

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

При отображении свойств задания Name и ChildJob в нем показано, что команда вернула объект задания $jс тремя дочерними заданиями, по одному для каждого компьютера.

PS> $j | Format-List Name, ChildJobs

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

При отображении родительского задания он показывает, что задание завершилось сбоем.

PS> $j

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

Но при выполнении Get-Job команды, которая получает дочерние задания, выходные данные показывают, что не удалось выполнить только одно дочернее задание.

PS> 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

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

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

Функция дочерних заданий фоновых заданий PowerShell позволяет более контролировать выполняемые задания.

Типы должностей

PowerShell поддерживает различные типы заданий для различных задач. Начиная с Windows PowerShell 3.0 разработчики могут писать "адаптеры источника заданий", которые добавляют новые типы заданий в PowerShell и включают исходные адаптеры заданий в модули. При импорте модуля можно использовать новый тип задания в сеансе.

Например, модуль PSScheduledJob добавляет запланированные задания, а модуль PSWorkflow добавляет задания рабочего процесса.

Пользовательские типы заданий могут значительно отличаться от стандартных фоновых заданий PowerShell. Например, запланированные задания сохраняются на диске; они не существуют только в определенном сеансе. Задания рабочего процесса можно приостановить и возобновить.

Командлеты, используемые для управления пользовательскими заданиями, зависят от типа задания. Для некоторых из этих командлетов используются стандартные командлеты заданий, например Get-Job и Start-Job. Другие приходят с специализированными командлетами, которые управляют только определенным типом задания. Подробные сведения о пользовательских типах заданий см. в разделах справки о типе задания.

Чтобы найти тип задания, используйте Get-Job командлет. Get-Job возвращает различные объекты заданий для различных типов заданий. Значение свойства PSJobTypeName объектов задания, возвращающих Get-Job тип задания.

В следующей таблице перечислены типы заданий, которые входят в PowerShell.

Тип вакансии Description
Фоновое задание Начало работы с командлетом Start-Job .
RemoteJob Начало работы с параметром AsJob объекта
Invoke-Command.
PSWorkflowJob Начал использовать параметр AsJob рабочего процесса.
PSScheduledJob Экземпляр запланированного задания, запущенного триггером задания.
CIMJob Начало работы с параметром AsJob командлета из
Модуль CDXML.
WMIJob Начало работы с параметром AsJob командлета из
Модуль WMI.
PSEventJob Создано с помощьюRegister-ObjectEvent и указанием
действие с параметром Action .

ПРИМЕЧАНИЕ. Прежде чем использовать Get-Job командлет для получения заданий определенного типа, убедитесь, что модуль, добавляющий тип задания, импортируется в текущий сеанс. Get-Job В противном случае не получает задания этого типа.

Примеры

Следующие команды создают локальное фоновое задание, удаленное фоновое задание, задание рабочего процесса и запланированное задание. Затем он использует Get-Job командлет для получения заданий. Get-Job не получает запланированное задание, но получает все экземпляры запланированного задания.

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

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

Запустите фоновое задание, которое выполняется на удаленном компьютере.

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

Создание запланированного задания

PS>  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

Создайте рабочий процесс.

PS> workflow Test-Workflow {Get-Process}

Запустите рабочий процесс в качестве задания.


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

Получение заданий. Команда Get-Job не получает запланированные задания, но получает экземпляры запланированного задания, запущенного.

PS> 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

Чтобы получить запланированные задания, используйте Get-ScheduledJob командлет.

PS> Get-ScheduledJob

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

См. также