РАЗДЕЛ 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