Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Содержит сведения о фоновых заданиях на локальных и удаленных компьютерах.
Длинное описание
В этом разделе объясняется концепция фонового задания и технические сведения о работе фоновых заданий в 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 или с параметром AsJobInvoke-Command, родительское задание выполняет управляющую функцию. Он не выполняет никаких команд или не возвращает результаты. Команды фактически выполняются дочерними заданиями. Задания, запущенные с помощью других командлетов, могут работать по-другому.
Дочерние задания хранятся в свойстве ChildJobs объекта родительского задания. Свойство ChildJobs может содержать один или несколько дочерних объектов задания. Дочерние объекты заданий имеют Name, idи InstanceId, которые отличаются от родительского задания, чтобы управлять родительскими и дочерними заданиями по отдельности или как единица.
Чтобы получить родительское и дочерние задания задачи, используйте параметр IncludeChildJobs командлета Get-Job. Параметр IncludeChildJob появился в Windows PowerShell 3.0.
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
Чтобы получить родительское задание и только дочерние задания с определенным значением State, используйте параметр ChildJobState в командлете Get-Job. Параметр ChildJobState был введён в Windows PowerShell 3.0.
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 родительской задачи.
(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 в дочернем задании, как это показано в следующей команде:
Get-Job Job3
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
3 Job3 Failed False localhost Get-Process
Конфигурация дочернего задания зависит от команды, с помощью которой вы запускаете задание.
При использовании
Start-Jobдля запуска задания на локальном компьютере задание состоит из исполнительного родительского задания и дочернего задания, выполняющего команду.При использовании параметра AsJob
Invoke-Commandдля запуска задания на одном или нескольких компьютерах задание состоит из исполнительного родительского задания и дочернего задания для каждого задания, выполняемого на каждом компьютере.При использовании
Invoke-Commandдля выполнения командыStart-Jobна одном или нескольких удаленных компьютерах результат совпадает с локальной командой, выполняемой на каждом удаленном компьютере. Команда возвращает объект задания для каждого компьютера. Объект задания состоит из исполнительного родительского задания и одного дочернего задания, выполняющего команду.
Родительское задание охватывает все дочерние задания. При управлении родительским заданием вы одновременно управляете и связанными дочерними заданиями. Например, если остановить родительское задание, все дочерние задания будут остановлены. Если вы получите результаты родительского задания, вы получите результаты всех дочерних заданий.
Однако вы также можете управлять дочерними заданиями по отдельности. Это наиболее полезно, если вы хотите изучить проблему с заданием или получить результаты только одного из нескольких дочерних заданий, запущенных с использованием параметра AsJobInvoke-Command.
Следующая команда использует параметр AsJobInvoke-Command для запуска фоновых заданий на локальном компьютере и двух удаленных компьютерах. Команда сохраняет задание в переменной $j.
$invokeCommandSplat = @{
ComputerName = 'localhost', 'Server01', 'Server02'
ScriptBlock = {Get-Date}
AsJob = $true
}
$j = Invoke-Command @invokeCommandSplat
При отображении в свойств Name и $j задания, видно, что команда вернула объект задания с тремя дочерними заданиями, по одному для каждого компьютера.
$j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
При отображении родительского задания он показывает, что задание завершилось сбоем.
$j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
Но при выполнении команды Get-Job, которая получает дочерние задания, выходные данные показывают, что не удалось выполнить только одно дочернее задание.
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 для получения результатов родительского задания. Но вы также можете получить результаты определенной дочерней задачи, как показано в следующей команде.
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.
-
BackgroundJob — начало работы с командлетом
Start-Job. -
RemoteJob — начало работы с параметром AsJob командлета
Invoke-Command. - CIMJob . Начало работы с параметром AsJob командлета из модуля CDXML.
- WMIJob . Начало работы с параметром AsJob командлета из модуля WMI.
-
PSEventJob — создается с помощью
Register-ObjectEventи задает действие с параметром действия Action.
Заметка
Прежде чем использовать командлет Get-Job для получения заданий определенного типа, убедитесь, что модуль, добавляющий тип задания, импортируется в текущий сеанс.
В противном случае Get-Job не удается получить задания этого типа.
Windows PowerShell 5.1 включает следующие дополнительные типы заданий.
- PSWorkflowJob — начало работы с параметром AsJob рабочего процесса.
- PSScheduledJob — экземпляр запланированного задания, запущенного триггером задания.
Эти типы заданий доступны только в Windows PowerShell 5.1. Модули, добавляющие эти типы заданий, несовместимы с PowerShell 6.0 и более поздними версиями.
Дополнительные сведения см. в следующих статьях:
Примеры
Следующие команды создают локальное фоновое задание, удаленное фоновое задание, задание рабочего процесса и запланированное задание. Затем он использует командлет 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
Запустите фоновое задание, которое выполняется на удаленном компьютере.
$invokeCommandSplat = @{
ComputerName = 'Server01'
AsJob = $true
JobName = 'RemoteData'
ScriptBlock = {Get-Process}
}
Invoke-Command @invokeCommandSplat
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process
См. также
- about_Jobs
- about_Remote
- о_удалённой_работе
- about_Thread_Jobs
- Invoke-Command
- задания
- Remove-Job
- начального задания
- остановки задания
- ожидание задания
- ВВОД-PSSession
- exit-PSSession (выход из сеанса PowerShell)
- New-PSSession
PowerShell