О заданиях
КРАТКОЕ ОПИСАНИЕ
Содержит сведения о том, как фоновые задания PowerShell выполняют команду или выражение в фоновом режиме без взаимодействия с текущим сеансом.
ПОДРОБНОЕ ОПИСАНИЕ
В этом разделе объясняется, как выполнять фоновые задания в PowerShell на локальном компьютере. Сведения о выполнении фоновых заданий на удаленных компьютерах см. в разделе about_Remote_Jobs.
Когда вы запускаете фоновое задание, Командная строка возвращается немедленно, даже если выполнение задания занимает длительное время. Пока задание выполняется, можно продолжать работу с данным сеансом.
КОМАНДЛЕТЫ ЗАДАНИЯ
Командлет | Описание |
---|---|
Start-Job |
Запускает фоновое задание на локальном компьютере. |
Get-Job |
Возвращает фоновые задания, запущенные в |
текущий сеанс. | |
Receive-Job |
Возвращает результаты фоновых заданий. |
Stop-Job |
Останавливает фоновое задание. |
Wait-Job |
Подавляет командную строку до тех пор, пока одно или все задания не будут |
завершения. | |
Remove-Job |
Удаляет фоновое задание. |
Invoke-Command |
Параметр AsJob выполняет любую команду в качестве фона |
задание на удаленном компьютере. Также можно использовать | |
Invoke-Command для удаленного выполнения любой команды задания |
|
Включение команды запуска задания. |
ЗАПУСК ЗАДАНИЯ НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ
Чтобы запустить фоновое задание на локальном компьютере, используйте командлет Start-Job.
Чтобы написать команду запуска, заключите команду, которая выполняется заданием, в фигурные скобки ({}). Используйте параметр ScriptBlock для указания команды.
Следующая команда запускает фоновое задание, которое выполняет Get-Process
команду на локальном компьютере.
Start-Job -ScriptBlock {Get-Process}
Start-Job
Команда возвращает объект, представляющий задание. Объект задания содержит полезную информацию о задании, но не содержит результатов его выполнения.
Сохраните объект задания в переменной, а затем используйте его вместе с другими командлетами задания для управления фоновыми заданиями. Следующая команда запускает объект задания и сохраняет результирующий объект задания в $ переменной задания.
$job = Start-Job -ScriptBlock {Get-Process}
Можно также использовать Get-Job
командлет для получения объектов, представляющих задания, запущенные в текущем сеансе. Get-Job
возвращает тот же объект задания, который возвращает starting-Job.
ПОЛУЧЕНИЕ ОБЪЕКТОВ ЗАДАНИЙ
Чтобы получить объект, который представляет фоновые задания, запущенные в текущем сеансе, используйте Get-Job
командлет. Без параметров Get-Job
возвращает все задания, запущенные в текущем сеансе.
Например, следующая команда возвращает задания в текущем сеансе.
PS C:> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
Можно также сохранить объект задания в переменной и использовать его для представления задания в более поздней команде. Следующая команда возвращает задание с ИДЕНТИФИКАТОРом 1 и сохраняет его в $ переменной задания.
$job = Get-Job -Id 1
Объект задания содержит состояние задания, которое указывает, завершено ли задание. Завершенное задание имеет состояние "завершено" или "сбой". Задание также может быть заблокировано или заработано.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
ПОЛУЧЕНИЕ РЕЗУЛЬТАТОВ ЗАДАНИЯ
При выполнении фонового задания результаты не отображаются немедленно.
Вместо этого командлет Start-Job возвращает объект задания, который представляет задание, но не содержит результаты. Чтобы получить результаты фонового задания, используйте Receive-Job
командлет.
Следующая команда использует Receive-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
# ...
Результаты задания также можно сохранить в переменной. Следующая команда сохраняет результаты задания в $ переменной задания в $ переменной results.
$results = Receive-Job -Job $job
Результаты задания можно сохранить в файле с помощью оператора перенаправления (>) или командлета Out-File. Следующая команда использует оператор перенаправления для сохранения результатов задания в $ переменной задания в файле 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
Удаление возвращаемых результатов задания, используйте параметр держитесь . В результате Receive-Job
возвращает все результаты, которые были созданы до этого времени.
Приведенные ниже команды демонстрируют последствия использования параметра сохранения для задания, которое еще не завершено.
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
Результаты отображаются в таблице. Состояние задания отображается в столбце состояние.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
В этом случае свойство State показывает, что задание 2 все еще выполняется. Если вы использовали Receive-Job
командлет для получения результатов задания прямо сейчас, результаты будут неполными. Можно Receive-Job
многократно использовать командлет для получения всех результатов. По умолчанию при каждом использовании вы получаете только те результаты, которые еще не были получены, но можно использовать параметр держитесь командлета Receive-Job для сохранения результатов, даже если они уже были получены.
Можно записать частичные результаты в файл, а затем добавить новые результаты по мере их поступления или же подождать и проверить состояние задания позже.
Можно использовать параметр wait Receive-Job
командлета, который не возвращает командную строку, пока задание не будет завершено и все результаты будут доступны.
Можно также использовать Wait-Job
командлет для ожидания любого или всех результатов задания. Wait-Job
позволяет ожидать определенного задания, для всех заданий или для выполнения всех заданий.
Следующая команда использует командлет Wait-Job для ожидания задания с ИДЕНТИФИКАТОРом 10.
Wait-Job -ID 10
В результате Командная строка PowerShell подавляется до завершения задания.
Можно также дождаться заранее определенного периода времени. Эта команда использует параметр timeout, чтобы ограничить время ожидания 120 секунд. По истечении этого времени Командная строка возвращает значение, но задание продолжит выполняться в фоновом режиме.
Wait-Job -ID 10 -Timeout 120
ОСТАНОВКА ЗАДАНИЯ
Чтобы прерывать фоновое задание, используйте Stop-Job
командлет. Следующая команда запускает задание для получения каждой записи в журнале системных событий. Объект задания сохраняется в $ переменной задания.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Следующая команда останавливает задание. Для отправки задания в переменной задания в используется конвейерный оператор (|) $ Stop-Job
.
$job | Stop-Job
УДАЛЕНИЕ ЗАДАНИЯ
Чтобы удалить фоновое задание, используйте Remove-Job
командлет. Следующая команда удаляет задание в $ переменной задания.
Remove-Job -Job $job
ИССЛЕДОВАНИЕ НЕВЫПОЛНЕННОГО ЗАДАНИЯ
Чтобы узнать, почему не удалось выполнить задание, используйте подсвойство Reason объекта Job.
Следующая команда запускает задание без требуемых учетных данных. Объект задания сохраняется в $ переменной задания.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Следующая команда использует свойство Reason для поиска ошибки, вызвавшей сбой задания.
$job.ChildJobs[0].JobStateInfo.Reason
В этом случае задание завершилось сбоем, так как удаленный компьютер требует явных учетных данных для выполнения команды. Значение свойства Reason:
Сбой подключения к удаленному серверу со следующим сообщением об ошибке: отказано в доступе.