Поиск по сайту:

Register-EngineEvent (Microsoft.PowerShell.Utility)


Register-EngineEvent

Модуль:
Microsoft.PowerShell.Utility

Подписывается на события, генерируемые обработчиком PowerShell и командлетом New-Event.

Синтаксис

Register-EngineEvent
        [-SourceIdentifier] <String>
        [[-Action] <ScriptBlock>]
        [-MessageData <PSObject>]
        [-SupportEvent]
        [-Forward]
        [-MaxTriggerCount <Int32>]
        [<CommonParameters>]

Описание

Командлет Register-EngineEvent подписывается на события, генерируемые обработчиком PowerShell и командлетом New-Event. Используйте параметр SourceIdentifier, чтобы указать событие.

Этот командлет можно использовать для подписки на события механизма OnIdle или Exiting, а также на события, генерируемые командлетом New-Event. Эти события автоматически добавляются в очередь событий вашего сеанса без подписки. Однако подписка позволяет пересылать события, указывать действие для реагирования на события и отменять подписку.

Когда вы подписываетесь на событие, к вашему сеансу добавляется подписчик на событие. Чтобы получить подписчиков событий в сеансе, используйте командлет Get-EventSubscriber. Чтобы отменить подписку, используйте командлет Unregister-Event, который удаляет подписчика на событие из сеанса.

Когда событие, на которое вы подписаны, возникает, оно добавляется в очередь событий вашего сеанса. Чтобы получить события в очереди событий, используйте командлет Get-Event.

Примеры

Пример 1. Регистрация события механизма PowerShell на удаленных компьютерах.

В этом примере событие механизма PowerShell регистрируется на двух удаленных компьютерах.

$S = New-PSSession -ComputerName "Server01, Server02"
Invoke-Command -Session $S {
  Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PsEngineEvent]::Exiting) -Forward
}

New-PSSession создает управляемый пользователем сеанс (PSSession) на каждом из удаленных компьютеров. Командлет Invoke-Command запускает Register-EngineEvent команду в удаленных сеансах. Register-EngineEvent использует параметр SourceIdentifier для идентификации события. Параметр Forward указывает механизму пересылать события из удаленного сеанса в локальный сеанс.

Пример 2. Выполнение указанного действия при возникновении события «Выход».

В этом примере показано, как запустить Register-EngineEvent, чтобы выполнить определенное действие при возникновении события PowerShell.Exiting.

Register-EngineEvent -SourceIdentifier PowerShell.Exiting -SupportEvent -Action {
    Get-History | Export-Clixml $HOME\history.clixml
}

Параметр SupportEvent добавлен, чтобы скрыть подписку на события. В этом случае при выходе PowerShell история команд из завершившегося сеанса экспортируется в XML-файл в каталог $HOME пользователя.

Пример 3. Создание определяемого пользователем события и подписка на него.

В этом примере создается подписка на события из источника MyEventSource. Это произвольный источник, который мы собираемся использовать для отслеживания хода выполнения задания. Register-EngineEvent используется для создания подписки. Блок сценария для параметра Действие записывает данные о событии в текстовый файл.

Register-EngineEvent -SourceIdentifier MyEventSource -Action {
    "Event: {0}" -f $event.messagedata | Out-File c:\temp\MyEvents.txt -Append
}

Start-Job -Name TestJob -ScriptBlock {
    While ($True) {
        Register-EngineEvent -SourceIdentifier MyEventSource -Forward
        Start-Sleep -seconds 2
        "Doing some work..."
        New-Event -SourceIdentifier MyEventSource -Message ("{0} -  Work done..." -f (Get-Date))
    }
}
Start-Sleep -seconds 4
Get-EventSubscriber
Get-Job

SubscriptionId   : 12
SourceObject     :
EventName        :
SourceIdentifier : MyEventSource
Action           : System.Management.Automation.PSEventJob
HandlerDelegate  :
SupportEvent     : False
ForwardEvent     : False

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
18     MyEventSource                   Running       True                                 …
19     TestJob         BackgroundJob   Running       True            localhost            …

Register-EngineEvent создал идентификатор задания 18. Start-Job создал идентификатор задания 19. В примере №4 мы удаляем подписку на события и задания, а затем проверяем файл журнала.

Пример 4. Отмена регистрации событий и очистка заданий

Это продолжение примера 3. В этом примере мы ждем 10 секунд, чтобы произошло несколько событий. Затем мы отменяем регистрацию подписки на событие.

PS> Start-Sleep -seconds 10
PS> Get-EventSubscriber | Unregister-Event
PS> Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
18     MyEventSource                   Stopped       False                                …
19     TestJob         BackgroundJob   Running       True            localhost            …

PS> Stop-Job -Id 19
PS> Get-Job | Remove-Job
PS> Get-Content C:\temp\MyEvents.txt
Event: 2/18/2020 2:36:19 PM -  Work done...
Event: 2/18/2020 2:36:21 PM -  Work done...
Event: 2/18/2020 2:36:23 PM -  Work done...
Event: 2/18/2020 2:36:25 PM -  Work done...
Event: 2/18/2020 2:36:27 PM -  Work done...
Event: 2/18/2020 2:36:29 PM -  Work done...
Event: 2/18/2020 2:36:31 PM -  Work done...

Командлет Unregister-Event останавливает задание, связанное с подпиской на событие (идентификатор задания 18). Задание с идентификатором 19 все еще выполняется и создает новые события. Мы используем командлеты Job, чтобы остановить задание и удалить ненужные объекты задания. Get-Content отображает содержимое файла журнала.

Параметры

-Action

Указывает команды для обработки событий. Команды в Действии выполняются при возникновении события, а не отправляют его в очередь событий. Заключите команды в фигурные скобки ({}), чтобы создать блок сценария.

Значение параметра Action может включать в себя $Event, $EventSubscriber, $Sender, $. EventArgs и автоматические переменные $Args, которые предоставляют информацию о событии в блок скрипта Action. Дополнительные сведения см. в разделе about_Automatic_Variables.

Когда вы указываете действие, Register-EngineEvent возвращает объект задания события, который представляет это действие. Для управления заданием события можно использовать командлеты задания.

Тип :

ScriptBlock

Позиция:

101

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-Forward

Указывает, что командлет отправляет события для этой подписки в сеанс на локальном компьютере. Используйте этот параметр при регистрации на события на удаленном компьютере или в удаленном сеансе.

Тип :

SwitchParameter

Позиция:

Именованный

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-MaxTriggerCount

Указывает максимальное количество раз, которое выполняется действие для подписки на событие.

Тип :

Int32

Позиция:

Именованный

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-MessageData

Указывает дополнительные данные, связанные с событием. Значение этого параметра отображается в свойстве MessageData объекта события.

Тип :

PSОбъект

Позиция:

Именованный

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-SourceIdentifier

Указывает идентификатор источника события, на которое вы подписываетесь. Идентификатор источника должен быть уникальным в текущем сеансе. Этот параметр является обязательным.

Значение этого параметра отображается в значении свойства SourceIdentifier объекта подписчика и всех объектов событий, связанных с этой подпиской.

Значение зависит от источника события. Это может быть произвольное значение, созданное вами для использования с командлетом New-Event. Механизм PowerShell поддерживает значения PSEngineEvent, PowerShell.Exiting и PowerShell.OnIdle.

Тип :

String

Позиция:

100

Значение по умолчанию:

None

Необходимый:

True

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-SupportEvent

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

Чтобы просмотреть или отменить подписку, созданную с помощью параметра SupportEvent, добавьте параметр Force в Get-EventSubscriber или Unregister- Командлеты событий.

Тип :

SwitchParameter

Позиция:

Именованный

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

Входы

Нет

Вы не можете передавать объекты в этот командлет.

Выходы

Нет

По умолчанию этот командлет не возвращает никаких результатов.

PSEventJob

При использовании параметра Action этот командлет возвращает объект PSEventJob.

Примечания

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

При подписке на событие Exiting командлеты, которые могут быть выполнены с помощью параметра Action, ограничиваются командлетами в Microsoft.PowerShell.Core. и модули Microsoft.PowerShell.Utility. Событие Exiting генерируется только тогда, когда сеанс завершается под контролем PowerShell. Событие не запускается при закрытии главного приложения или окна терминала.

Двигатель считается работающим на холостом ходу, если в нем не работает трубопровод. Событие OnIdle генерируется, когда PowerShell бездействует в течение 300 миллисекунд (мс).

Примечание

Когда используется PSReadLine, событие OnIdle запускается по истечении времени ожидания ReadKey() (в течение 300 мс ввод не требуется). Событие может быть сигнализировано, когда пользователь находится в процессе редактирования командной строки, например, когда пользователь читает справку, чтобы решить, какой параметр использовать. Начиная с PSReadLine 2.2.0-beta4, поведение OnIdle изменилось и сигнализирует о событии только в том случае, если существует тайм-аут ReadKey() и текущий буфер редактирования пуст.