Register-EngineEvent
Abonniert Ereignisse, die vom PowerShell-Modul und vom cmdlet New-Event
generiert werden.
Syntax
Register-EngineEvent
[-SourceIdentifier] <String>
[[-Action] <ScriptBlock>]
[-MessageData <PSObject>]
[-SupportEvent]
[-Forward]
[-MaxTriggerCount <Int32>]
[<CommonParameters>]
Beschreibung
Das cmdlet Register-EngineEvent
abonniert Ereignisse, die vom PowerShell-Modul und dem Cmdlet New-Event
generiert werden. Verwenden Sie den SourceIdentifier Parameter, um das Ereignis anzugeben.
Mit diesem Cmdlet können Sie sich für die OnIdle or Verlassen von Motorereignisse und Ereignisse, die von der New-Event
cmdlet. Diese Ereignisse werden automatisch zur Ereigniswarteschlange in Ihrer Sitzung hinzugefügt, ohne dass sie abonniert werden. Durch Abonnieren können Sie die Ereignisse jedoch weiterleiten, eine Aktion angeben, die auf die Ereignisse reagiert, und das Abonnement kündigen.
Wenn Sie ein Ereignis abonnieren, wird der Sitzung ein Ereignisabonnent hinzugefügt. Um die Ereignisteilnehmer in der Sitzung zu erhalten, verwenden Sie die Get-EventSubscriber
cmdlet. Verwenden Sie zum Kündigen des Abonnements das Cmdlet Unregister-Event
, das den Ereignisabonnent aus der Sitzung löscht.
Wenn das abonnierte Ereignis ausgelöst wird, wird es der Ereigniswarteschlange der Sitzung hinzugefügt. Verwenden Sie das Cmdlet Get-Event
, um Ereignisse in der Ereigniswarteschlange abzurufen.
Beispiele
Beispiel 1: Registrieren eines PowerShell-Engine-Ereignisses auf Remotecomputern
Dieses Beispiel registriert sich für ein PowerShell-Engine-Ereignis auf zwei Remotecomputern.
$S = New-PSSession -ComputerName "Server01, Server02"
Invoke-Command -Session $S {
Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PsEngineEvent]::Exiting) -Forward
}
New-PSSession
erstellt eine benutzerverwaltete Sitzung (PSSession) auf jedem der entfernten Computer.Die Invoke-Command
Cmdlet führt das Register-EngineEvent
Befehl in den Remote-Sitzungen.
Register-EngineEvent
verwendet den SourceIdentifier Parameter, um das Ereignis zu identifizieren. Die Weiterleiten wird die Engine angewiesen, die Ereignisse aus der entfernten Sitzung an die lokale Sitzung weiterzuleiten.
Beispiel 2: Eine bestimmte Aktion ausführen, wenn das Ereignis „Beenden“ eintritt
Dieses Beispiel zeigt, wie man Register-EngineEvent
eine bestimmte Maßnahme zu ergreifen, wenn die PowerShell.Exiting Ereignis eintritt.
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -SupportEvent -Action {
Get-History | Export-Clixml $HOME\history.clixml
}
Die SupportEvent wird hinzugefügt, um das Ereignisabonnement auszublenden. Wenn PowerShell beendet wird, wird der Befehlsverlauf aus der beendeten Sitzung in diesem Fall in einer XML-Datei im $HOME
-Verzeichnis des Benutzers exportiert.
Beispiel 3: Erstellen und Abonnieren eines benutzerdefinierten Ereignisses
In diesem Beispiel wird ein Abonnement für Ereignisse aus der Quelle MyEventSourceerstellt. Dies ist eine beliebige Quelle, die wir verwenden werden, um den Fortschritt eines Auftrags zu überwachen.
Register-EngineEvent
wird zur Erstellung des Abonnements verwendet. Der Skriptblock für den Action-Parameter protokolliert die Ereignisdaten in einer Textdatei.
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..."
$newEventSplat = @{
SourceIdentifier = 'MyEventSource'
MessageData = ("{0} - Work done..." -f (Get-Date))
}
New-Event @newEventSplat
}
}
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
erstellt Job Id 18.
Start-Job
erstellt Job Id 19. In Beispiel Nr. 4 entfernen wir das Ereignisabonnement und die Aufträge und prüfen dann die Protokolldatei.
Beispiel 4: Aufhebung der Registrierung von Ereignissen und Bereinigung von Aufträgen
Dies ist eine Fortsetzung von Beispiel 3. In diesem Beispiel warten wir 10 Sekunden, damit mehrere Ereignisse auftreten können. Dann heben wir die Registrierung des Ereignisabonnements auf.
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...
Die Unregister-Event
hält den mit dem Ereignisabonnement verbundenen Auftrag an (Auftragsnummer 18). Job Id 19 läuft noch und erzeugt neue Ereignisse. Wir verwenden die Job Cmdlets, um den Job zu beenden und die nicht benötigten Job-Objekte zu entfernen.
Get-Content
zeigt den Inhalt der Protokolldatei an.
Parameter
-Action
Gibt Befehle zur Behandlung der Ereignisse an. Die Befehle im Abschnitt Aktion ausführen, wenn ein Ereignis ausgelöst wird, anstatt das Ereignis an die Ereigniswarteschlange zu senden. Schließen Sie die Befehle in geschweifte Klammern ({}
) ein, um einen Skriptblock zu erstellen.
Der Wert der Aktion kann den Parameter $Event
, $EventSubscriber
, $Sender
, $EventArgs
, und $Args
automatische Variablen, die Informationen über das Ereignis an den Action Skript-Block. Weitere Informationen finden Sie unter about_Automatic_Variables.
Wenn Sie eine Aktion angeben, gibt Register-EngineEvent
ein Event-Job-Objekt zurück, das diese Aktion darstellt. Sie können die Job-Cmdlets verwenden, um den Ereignisauftrag zu verwalten.
Typ: | ScriptBlock |
Position: | 101 |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Forward
Gibt an, dass das Cmdlet Ereignisse für dieses Abonnement an die Sitzung auf dem lokalen Computer sendet. Verwenden Sie diesen Parameter, wenn Sie sich für Ereignisse auf einem Remotecomputer oder in einer Remotesitzung registrieren.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-MaxTriggerCount
Gibt an, wie oft die Aktion für das Ereignisabonnement maximal ausgeführt wird.
Typ: | Int32 |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-MessageData
Dieser Parameter ist Teil der Basisklasse für alle Event-Cmdlets. Der Register-EngineEvent
verwendet diesen Parameter nicht. Alle an diesen Parameter übergebenen Daten werden ignoriert.
Typ: | PSObject |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-SourceIdentifier
Gibt den Quellbezeichner des Ereignisses an, für das Sie abonnieren. Der Quellbezeichner muss in der aktuellen Sitzung eindeutig sein. Dieser Parameter ist erforderlich.
Der Wert dieses Parameters erscheint im Wert des Feldes SourceIdentifier des Abonnentenobjekts und aller mit diesem Abonnement verbundenen Ereignisobjekte.
Der Wert ist spezifisch für die Quelle des Ereignisses. Dies kann ein beliebiger Wert sein, den Sie eigens erstellt haben, um ihn mit dem Cmdlet New-Event
zu verwenden. Die PowerShell-Engine unterstützt die PSEngineEvent Werte PowerShell.Exiting und PowerShell.OnIdle.
Typ: | String |
Position: | 100 |
Standardwert: | None |
Erforderlich: | True |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-SupportEvent
Gibt an, dass das Cmdlet das Ereignisabonnement ausblendet. Fügen Sie diesen Parameter hinzu, wenn das aktuelle Abonnement Teil eines komplexeren Ereignisregistrierungsmechanismus ist und er nicht unabhängig erkannt werden sollte.
Wenn Sie ein Abonnement anzeigen oder kündigen möchten, das mit dem Parameter SupportEvent erstellt wurde, fügen Sie den Parameter Force zu den Cmdlets Get-EventSubscriber
oder Unregister-Event
hinzu.
Typ: | SwitchParameter |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
Eingaben
None
Sie können keine Objekte an dieses Cmdlet weiterleiten.
Ausgaben
None
Standardmäßig gibt dieses Cmdlet keine Ausgabe zurück.
Wenn Sie den parameter Action verwenden, gibt dieses Cmdlet ein PSEventJob--Objekt zurück.
Hinweise
Ereignisse, Ereignisabonnements und die Ereigniswarteschlange sind nur in der aktuellen Sitzung vorhanden. Wenn Sie die aktuelle Sitzung schließen, wird die Ereigniswarteschlange verworfen, und das Ereignisabonnement wird abgebrochen.
Beim Abonnieren der Verlassen von Ereignis, die Cmdlets, die von der Datenbank ausgeführt werden können Aktion Parameter sind auf die Cmdlets in der Datei Microsoft.PowerShell.Core und Microsoft.PowerShell.Utility Module. Die Verlassen von Ereignis wird nur ausgelöst, wenn die Sitzung unter der Kontrolle von PowerShell beendet wird. Das Ereignis wird nicht ausgelöst, wenn die Hostanwendung oder das Terminalfenster geschlossen wird.
Der Motor gilt als im Leerlauf, wenn er keine Rohrleitung betreibt. Die OnIdle Ereignis wird ausgelöst, wenn PowerShell 300 Millisekunden (ms) lang im Leerlauf war.
Anmerkung
Wenn PSReadLine verwendet wird, wird die OnIdle Ereignis wird ausgelöst, wenn ReadKey()
eine Zeitüberschreitung (keine Eingabe in 300ms). Das Ereignis könnte signalisiert werden, während sich der Benutzer in der Mitte der Bearbeitung einer Befehlszeile befindet, z. B. wenn der Benutzer Hilfe liest, um zu entscheiden, welcher Parameter verwendet werden soll. Beginnend mit PSReadLine 2.2.0-beta4, OnIdle Verhalten geändert, um das Ereignis nur dann zu signalisieren, wenn es eine ReadKey()
Timeout und der aktuelle Bearbeitungspuffer ist leer.