РАЗДЕЛ
about_Jobs
КРАТКОЕ ОПИСАНИЕ
Сведения о выполнении команд и выражений в фоновых заданиях Windows
PowerShell, не затрагивающем текущий сеанс.
ПОЛНОЕ ОПИСАНИЕ
В этом разделе описывается запуск фоновых заданий в Windows
PowerShell на локальном компьютере. Дополнительные сведения о
запуске фоновых заданий на удаленных компьютерах см. в разделе
about_Remote_Jobs.
При запуске фонового задания командная строка возвращается
немедленно, даже если для выполнения задания требуется
значительное время. Пока задание выполняется, можно продолжать
работу с данным сеансом.
Важно: фоновые задания, запущенные с помощью команды Start-Job
или параметра AsJob команды Invoke-Command, используют
инфраструктуру удаленного взаимодействия Windows PowerShell.
Для использования этих функций необходимо настроить в Windows
PowerShell удаленное взаимодействие, даже если фоновое задание
выполняется только на локальном компьютере. Дополнительные
сведения см. в разделе about_Remote_Requirements.
ЗАПУСК ЗАДАНИЯ НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ
Чтобы запустить фоновое задание на локальном компьютере,
используйте командлет Start-Job.
При вводе команды Start-Job команда, выполняемая в фоновом задании,
заключается в фигурные скобки ( { } ). Для указания команды
используйте параметр ScriptBlock.
Следующая команда запускает фоновое задание, выполняющее команду
Get-Process на локальном компьютере.
start-job -scriptblock {get-process}
Команда Start-Job возвращает объект, представляющий задание.
Объект задания содержит полезные сведения о задании, но не
содержит результаты его выполнения.
Сохраните объект задания в переменной, чтобы в дальнейшем
использовать его с другими командлетами Job для управления
фоновыми заданиями. Следующая команда запускает объект задания и
сохраняет результирующий объект задания в переменной $job.
$job = start-job -scriptblock {get-process}
Кроме того, с помощью командлета Get-Job можно получать объекты,
представляющие задания, запущенные в текущем сеансе. Командлет
Get-Job возвращает тот же объект задания, что и командлет Start-Job.
ПОЛУЧЕНИЕ ОБЪЕКТОВ ЗАДАНИЙ
Чтобы получить объект, представляющий фоновые задания, запущенные
в текущем сеансе, используйте командлет Get-Job. При вызове без
параметров команда Get-Job возвращает все задания, запущенные в
текущем сеансе.
Например, следующая команда получает все задания в текущем сеансе.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost get-process
Также можно сохранить объект задания в переменной и использовать
его в последующих командах как объект, представляющий это задание.
Следующая команда получает задание с идентификатором 1 и сохраняет
его в переменной $job.
$job = get-job -id 1
Объект задания содержит состояние задания, показывающее,
закончено ли его выполнение. Завершенное задание имеет состояние
"Complete" (Выполнено) или "Failed" (Не удалось выполнить). Также
задание может быть заблокированным или выполняющимся.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
ПОЛУЧЕНИЕ РЕЗУЛЬТАТОВ ВЫПОЛНЕНИЯ ЗАДАНИЯ
При выполнении фонового задания результаты появляются не сразу.
Вместо этого командлет Start-Job возвращает объект, представляющий это
задание, но не содержащий результатов его выполнения. Чтобы получить
результаты выполнения фонового задания, используйте командлет Receive-Job.
В следующей команде используется командлет Receive-Job для получения
результатов выполнения задания. Используется объект задания, сохраненный в
переменной $job и обозначающий это задание.
receive-job -job $job
Командлет Receive-Job возвращает результаты выполнения задания.
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
...
Результаты выполнения задания также можно сохранить в
переменной. Следующая команда сохраняет результат выполнения задания,
размещенного в переменной $job, в переменную $results.
$results = receive-job -job $job
Кроме того, результаты выполнения задания можно сохранить в
файле с помощью оператора перенаправления (>) или командлета
Out-File. В следующей команде с помощью
оператора перенаправления результаты выполнения задания из
переменной $job сохраняются в файле Results.txt.
receive-job -job $job > results.txt
ПОЛУЧЕНИЕ И СОХРАНЕНИЕ ЧАСТИЧНЫХ РЕЗУЛЬТАТОВ ВЫПОЛНЕНИЯ ЗАДАНИЙ
Командлет Receive-Job возвращает результаты выполнения фонового
задания. Если задание завершено, командлет Receive-Job возвращает
полные результаты его выполнения. Если задание все еще
выполняется, командлет Receive-Job получает результаты, созданные
на данный момент. Затем можно снова запустить команду Receive-Job для
получения оставшихся результатов.
Когда командлет Receive-Job возвращает результаты, по умолчанию
он удаляет их из кэша, где они хранились. При повторном запуске
команды Receive-Job получаются только те результаты, которые не
были получены в прошлый раз.
Следующие команды выводят результаты команд Receive-Job,
выполненных до завершения задания.
C:\PS> receive-job -job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> receive-job -job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Чтобы команда Receive-Job не удалила возвращенные ей результаты,
используйте параметр Keep. В этом случае команда Receive-Job
возвращает все результаты, созданные на данный момент.
Следующие команды показывают влияние параметра Keep на
незавершенное задание.
C:\PS> receive-job -job $job -keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> receive-job -job $job -keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
ОЖИДАНИЕ РЕЗУЛЬТАТОВ
Если выполнение задания занимает длительное время, можно с
помощью свойств объекта задания определить, когда оно будет завершено.
Следующая команда с помощью объекта Get-Job получает все фоновые
задания в текущем сеансе.
get-job
Результаты выводятся в виде таблицы. Состояние задания
отображается в столбце "State".
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
2 Job2 Running True localhost get-eventlog -log syst...
3 Job3 Complete True localhost dir -path c:\* -recurse
В этом случае свойство State показывает, что задание Job2 все еще
выполняется. Если получить результаты выполнения задания с
помощью командлета Receive-Job прямо сейчас, они будут неполными.
Можно повторно использовать командлет Receive-Job, пока не будут
получены все результаты. По умолчанию при каждом использовании этого
командлета получаются только те результаты, которые не были получены
ранее, однако с помощью параметра Keep для командлета Receive-Job
можно сохранять полученные ранее результаты.
Теперь можно сохранить результаты в файл и в дальнейшем добавлять
в него новые результаты по мере их поступления. Или можно выждать
и проверить состояние задания позже.
Также можно использовать командлет Wait-Job для ожидания любых
(или всех) результатов выполнения задания. Командлет Wait-Job
позволяет дожидаться выполнения определенного задания, всех
заданий или любого из них.
В следующей команде используется командлет Wait-Job для ожидания
результатов выполнения задания с идентификатором 10.
wait-job -ID 10
При этом командная строка Windows PowerShell отключается до завершения
задания.
Также можно задать ожидание в течение определенного срока. В этой
команде с помощью параметра Timeout задается предельный срок
ожидания 120 секунд. По истечении этого срока возвращается
командная строка, но задание продолжает выполняться в фоновом режиме.
wait-job -ID 10 -timeout 120
ОСТАНОВКА ЗАДАНИЯ
Для остановки фоновых заданий используется командлет Stop-Job.
Следующая команда запускает задание, получающее все записи из
журнала событий System. Объект задания сохраняется в переменной $job.
$job = start-job -scriptblock {get-eventlog -log system}
Следующая команда останавливает задание. Она передает задание,
содержащееся в переменной $job, в командлет Stop-Job с помощью
оператора конвейера (|).
$job | stop-job
УДАЛЕНИЕ ЗАДАНИЯ
Для удаления фоновых заданий используется командлет Remove-Job.
Следующая команда удаляет объект, содержащийся в переменной $job.
remove-job -job $job
ПРОВЕРКА ЗАДАНИЯ, В КОТОРОМ ВОЗНИКЛА ОШИБКА
Чтобы выяснить, почему не удалось выполнить задание, используйте
свойство Reason объекта задания.
Следующая команда запускает задание без требуемых учетных данных.
Объект задания сохраняется в переменной $job.
$job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost new-item -path HKLM:\S...
Следующая команда с помощью свойства Reason выясняет причину
ошибки, из-за которой не удалось выполнить задание.
$job.ChildJobs[0].JobStateInfo.Reason
В данном случае задание не удалось выполнить потому, что
удаленный компьютер затребовал явно указанные учетные данные для
выполнения команды. При этом свойство Reason имеет следующее значение:
Не удалось подключиться к удаленному серверу. Сообщение об
ошибке: доступ запрещен.
КОМАНДЛЕТЫ JOB
Start-Job Запускает фоновое задание на локальном компьютере.
Get-Job Получает фоновые задания, запущенные в текущем сеансе.
Receive-Job Получает результаты выполнения фоновых заданий.
Stop-Job Останавливает фоновое задание.
Wait-Job Отключает командную строку до выполнения
одного задания либо их всех.
Remove-Job Удаляет фоновое задание.
Invoke-Command Параметр AsJob позволяет запустить любую команду
как фоновое задание на удаленном компьютере. С помощью команды
Invoke-Command также можно удаленно запускать любые команды
заданий, включая команду Start-Job.
СМ. ТАКЖЕ
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command