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


Wait-Job

Подавляет командную строку до тех пор, пока не будет завершено одно или все фоновые задания Windows PowerShell, выполняемые в сеансе.

Синтаксис

Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Id] <Int32[]>
    [<CommonParameters>]
Wait-Job
    [-Job] <Job[]>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Name] <String[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-InstanceId] <Guid[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-State] <JobState>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Filter] <Hashtable>
    [<CommonParameters>]

Описание

Командлет Wait-Job ожидает завершения фоновых заданий Windows PowerShell до отображения командной строки. Вы можете ждать завершения любого фонового задания или до завершения всех фоновых заданий, а также задать максимальное время ожидания задания.

Когда команды в задании завершены, wait-Job отображает командную строку и возвращает объект задания, чтобы передать его в другую команду.

Для ожидания фоновых заданий можно использовать командлет Wait-Job, например те, которые были запущены с помощью командлета Start-Job или параметра AsJob командлета Invoke-Command. Дополнительные сведения о фоновых заданиях Windows PowerShell см. в about_Jobs.

Начиная с Windows PowerShell 3.0 командлет wait-Job также ожидает пользовательских типов заданий, таких как задания рабочих процессов и экземпляры запланированных заданий. Чтобы включить ожидание заданий определенного типа, импортируйте модуль, поддерживающий настраиваемый тип задания, перед запуском командлета Get-Job либо с помощью командлета Import-Module, либо с помощью командлета Import-Module, либо с помощью или получения командлета в модуле. Сведения о конкретном пользовательском типе задания см. в документации по функции пользовательского типа задания.

Примеры

Пример 1. Ожидание всех заданий

PS C:\> Get-Job | Wait-Job

Эта команда ожидает завершения всех фоновых заданий, выполняемых в сеансе.

Пример 2. Ожидание заданий, запущенных на удаленных компьютерах с помощью Start-Job

PS C:\> $s = New-PSSession Server01, Server02, Server03
PS C:\> Invoke-Command -Session $s -ScriptBlock {Start-Job -Name Date1 -ScriptBlock {Get-Date}}
PS C:\> $done = Invoke-Command -Session $s -Command {Wait-Job -Name Date1}
PS C:\> $done.Count
3

В этом примере показано, как использовать командлет wait-Job с заданиями, запущенными на удаленных компьютерах, с помощью командлета start-job. Команды запуска задания и команды Wait-Job отправляются на удаленный компьютер с помощью командлета invoke-Command .

В этом примере используется wait-Job, чтобы определить, завершена ли команда Get-Date, запущенная в качестве фонового задания на трех разных компьютерах.

Первая команда создает сеанс Windows PowerShell (PSSession) на каждом из трех удаленных компьютеров и сохраняет их в переменной $s.

Вторая команда использует Invoke-Command для запуска начального задания в каждом из трех сеансов в $s. Все задания называются Date1.

Третья команда использует Invoke-Command для запуска задания ожидания. Эта команда ожидает завершения заданий Date1 на каждом компьютере. Он сохраняет полученную коллекцию (массив) объектов заданий в переменной $done.

Четвертая команда использует свойство Count массива объектов заданий в переменной $done, чтобы определить, сколько заданий завершено.

Пример 3. Определение завершения первого фонового задания

PS C:\> $s = New-PSSession (Get-Content Machines.txt)
PS C:\> $c = 'Get-EventLog -LogName System | where {$_.EntryType -eq "error" --and $_.Source -eq "LSASRV"} | Out-File Errors.txt'
PS C:\> Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {$Using:c}
PS C:\> Invoke-Command -Session $s -ScriptBlock {Wait-Job -Any}

В этом примере используется параметр AnyWait-Job, чтобы определить, когда выполняется первое из многих фоновых заданий, выполняемых в текущем сеансе. В нем также показано, как использовать командлет wait-Job, чтобы дождаться завершения удаленных заданий.

Первая команда создает PSSession на каждом из компьютеров, перечисленных в файле Machines.txt, и сохраняет объекты PSSession в переменной $s. Команда использует командлет Get-Content для получения содержимого файла. Команда get-Content заключена в скобки, чтобы убедиться, что она выполняется перед командой New-PSSession.

Вторая команда сохраняет командную строку Get-EventLog в кавычках в переменной $c.

Третья команда использует командлет Invoke-Command для запуска начального задания в каждом сеансе в $s. Команда start-Job запускает фоновое задание, которое запускает команду get-EventLog Get-EventLog в переменной $c.

Команда использует модификатор области Using, чтобы указать, что переменная $c была определена на локальном компьютере. Модификатор области using представлен в Windows PowerShell 3.0. Дополнительные сведения об модификаторе области см. в разделе about_Remote_Variables ().

Четвертая команда использует Invoke-Command для выполнения команды wait-Job в сеансах. Он использует параметр Any для ожидания первого задания на удаленных компьютерах.

Пример 4. Задание времени ожидания заданий на удаленных компьютерах

PS C:\> $s = New-PSSession Server01, Server02, Server03
PS C:\> $jobs = Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {Get-Date}}
PS C:\> $done = Invoke-Command -Session $s -ScriptBlock {Wait-Job -Timeout 30}

В этом примере показано, как использовать параметр TimeoutWait-Job, чтобы задать максимальное время ожидания заданий, выполняемых на удаленных компьютерах.

Первая команда создает PSSession на каждом из трех удаленных компьютеров (Server01, Server02 и Server03), а затем сохраняет объекты PSSession в переменной $s.

Вторая команда использует invoke-Command для запуска начального задания в каждом из объектов PSSession в $s. Он сохраняет результирующий объект задания в переменной $jobs.

Третья команда использует Invoke-Command для выполнения задания ожидания в каждом сеансе в $s. Команда wait-Job определяет, выполняются ли все команды в течение 30 секунд. Он использует параметр Timeout со значением 30, чтобы установить максимальное время ожидания, а затем сохраняет результаты команды в переменной $done.

В этом случае после 30 секунд выполняется только команда на компьютере Server02. ожидание задания заканчивает ожидание, отображает командную строку и возвращает объект, представляющий завершенное задание.

Переменная $done содержит объект задания, представляющий задание, запущенное на сервере Server02.

Пример 5. Дождитесь завершения одного из нескольких заданий

PS C:\> Wait-Job -id 1,2,5 -Any

Эта команда определяет три задания идентификаторами и ожидает завершения любого из них. Командная строка возвращается после завершения первого задания.

Пример 6. Ожидание периода, а затем разрешение задания продолжить в фоновом режиме

PS C:\> Wait-Job -Name "DailyLog" -Timeout 120

Эта команда ожидает 120 секунд (две минуты) для завершения задания DailyLog. Если задание не завершится в течение следующих двух минут, командная строка возвращается в любом случае, и задание продолжает выполняться в фоновом режиме.

Пример 7. Ожидание задания по имени

PS C:\> Wait-Job -Name "Job3"

Эта команда использует имя задания для идентификации задания, для которого требуется ждать.

Пример 8. Ожидание заданий на локальном компьютере, запущенных с Start-Job

PS C:\> $j = Start-Job -ScriptBlock {Get-ChildItem *.ps1| where {$_lastwritetime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
PS C:\> $j | Wait-Job

В этом примере показано, как использовать командлет Wait-Job с заданиями, запущенными на локальном компьютере, с помощью запуска и задания.

Эти команды запускают задание, которое получает файлы скриптов Windows PowerShell, которые были добавлены или обновлены на прошлой неделе.

Первая команда использует начальное задание для запуска фонового задания на локальном компьютере. Задание выполняет команду Get-ChildItem, которая получает все файлы с расширением имени файла .ps1, которые были добавлены или обновлены на прошлой неделе.

Третья команда использует wait-job, чтобы ждать завершения задания. По завершении задания команда отображает объект задания, содержащий сведения о задании.

Пример 9. Ожидание заданий, запущенных на удаленных компьютерах с помощью Invoke-Command

PS C:\> $s = New-PSSession Server01, Server02, Server03
PS C:\> $j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
PS C:\> $j | Wait-Job

В этом примере показано, как использовать задания ожидания с заданиями, запущенными на удаленных компьютерах, с помощью параметра AsJobInvoke-Command. При использовании AsJobзадание создается на локальном компьютере и результаты автоматически возвращаются на локальный компьютер, даже если задание выполняется на удаленных компьютерах.

В этом примере используется wait-Job, чтобы определить, завершена ли команда get-Process get-Process, выполняющаяся в сеансах на трех удаленных компьютерах.

Первая команда создает объекты PSSession на трех компьютерах и сохраняет их в переменной $s.

Вторая команда использует Invoke-Command для выполнения Get-Process в каждом из трех сеансов в $s. Команда использует параметр AsJob для асинхронного выполнения команды в качестве фонового задания. Команда возвращает объект задания, как и задания, запущенные с помощью Start-Job, и объект задания хранится в переменной $j.

Третья команда использует оператор конвейера (|) для отправки объекта задания в $j командлету Wait-Job. Команда Invoke-Command не требуется в этом случае, так как задание находится на локальном компьютере.

Пример 10. Ожидание задания с идентификатором

PS C:\> Get-Job

Id   Name     State      HasMoreData     Location             Command
--   ----     -----      -----------     --------             -------
1    Job1     Completed  True            localhost,Server01.. get-service
4    Job4     Completed  True            localhost            dir | where

PS C:\> Wait-Job -Id 1

Эта команда ожидает задания со значением идентификатора 1.

Параметры

-Any

Указывает, что этот командлет отображает командную строку и возвращает объект задания при завершении любого задания. По умолчанию ожидание задания ожидания ожидает завершения всех указанных заданий перед отображением запроса.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Filter

Задает хэш-таблицу условий. Этот командлет ожидает заданий, удовлетворяющих всем условиям в хэш-таблице. Введите хэш-таблицу, в которой ключи являются свойствами задания и значениями свойств задания.

Этот параметр работает только в пользовательских типах заданий, таких как задания рабочего процесса и запланированные задания. Он не работает на стандартных фоновых заданиях, таких как созданные с помощью командлета запуска и задания. Сведения о поддержке этого параметра см. в разделе справки для типа задания.

Этот параметр появился в Windows PowerShell 3.0.

Тип:Hashtable
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-Force

Указывает, что этот командлет продолжает ждать заданий в состоянии приостановки или отключения. По умолчанию возвращается задания ожидания или заканчивается ожиданием, когда задания находятся в одном из следующих состояний:

  • Завершённый
  • Неудавшийся
  • Остановленный
  • Подвешенный
  • Бессвязный

Этот параметр появился в Windows PowerShell 3.0.

Тип:SwitchParameter
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

-Id

Задает массив идентификаторов заданий, для которых этот командлет ожидает.

Идентификатор — это целое число, которое однозначно идентифицирует задание в текущем сеансе. Проще запоминать и вводить идентификатор экземпляра, но он является уникальным только в текущем сеансе. Можно ввести один или несколько идентификаторов, разделенных запятыми. Чтобы найти идентификатор задания, введите Get-Job.

Тип:Int32[]
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-InstanceId

Задает массив идентификаторов экземпляров заданий, для которых этот командлет ожидает. Значение по умолчанию — все задания.

Идентификатор экземпляра — это GUID, который однозначно идентифицирует задание на компьютере. Чтобы найти идентификатор экземпляра задания, используйте get-Job.

Тип:Guid[]
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-Job

Указывает задания, для которых ожидается этот командлет. Введите переменную, содержащую объекты задания или команду, которая получает объекты задания. Можно также использовать оператор конвейера для отправки объектов заданий в командлет Wait-Job. По умолчанию задание ожидания ожидает всех заданий, созданных в текущем сеансе.

Тип:Job[]
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-Name

Задает понятные имена заданий, для которых этот командлет ожидает.

Тип:String[]
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-State

Указывает состояние задания. Этот командлет ожидает только заданий в указанном состоянии. Допустимые значения для этого параметра:

  • NotStarted
  • Бег
  • Завершённый
  • Неудавшийся
  • Остановленный
  • Блокированный
  • Подвешенный
  • Бессвязный
  • Приостановка
  • Зубная пломба

Дополнительные сведения о состояниях заданий см. в перечисления JobState в библиотеке MSDN.

Тип:JobState
Допустимые значения:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:0
Default value:None
Обязательно:True
Принять входные данные конвейера:True
Принять подстановочные знаки:False

-Timeout

Указывает максимальное время ожидания для каждого фонового задания в секундах. Значение по умолчанию -1 указывает, что командлет ожидает завершения задания. Время начинается при отправке команды задания ожидания , а не команды start-Job.

Если это время превышено, ожидание заканчивается и командная строка возвращается, даже если задание по-прежнему выполняется. Команда не отображает сообщение об ошибке.

Тип:Int32
Aliases:TimeoutSec
Position:Named
Default value:None
Обязательно:False
Принять входные данные конвейера:False
Принять подстановочные знаки:False

Входные данные

System.Management.Automation.RemotingJob

Объект задания можно передать в этот командлет.

Выходные данные

System.Management.Automation.PSRemotingJob

Этот командлет возвращает объекты заданий, представляющие завершенные задания. Если ожидание заканчивается, так как значение параметра timeout превышено, wait-Job не возвращает объекты.

Примечания

  • По умолчанию возвращается задания ожидания или заканчивается ожиданием, когда задания находятся в одном из следующих состояний:
  • Завершённый
  • Неудавшийся
  • Остановленный
  • Подвешенный
  • Отключено для прямого задания wait-job, чтобы продолжить ожидание приостановленных и отключенных заданий, используйте параметр Force.