Поделиться через


О заданиях

КРАТКОЕ ОПИСАНИЕ

Содержит сведения о том, как фоновые задания 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:

Сбой подключения к удаленному серверу со следующим сообщением об ошибке: отказано в доступе.

СМ. ТАКЖЕ

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job.

Receive-Job.

Stop-Job.

Wait-Job

Remove-Job

Invoke-Command