Ez az EngineEvent eseménytípus a legegyszerűbb. Olyan események ezek, amelyek a PowerShell processzel történhetnek, a processz elindulhat és befejeződhet. Sajnos az elindulást nem tudjuk figyelni, hiszen ahhoz még az elindulása előtt kellene előfizetnünk rá, ami fizikai képtelenség. Így marad annak az eseménynek a figyelése, amikor a PowerShell alkalmazást, processzt bezárjuk. Azért, hogy ne legyen ez ilyen egyhangú, még van egy egyedi eseménygenerálási lehetőség a new-event cmdlet segítségével, amikor is bármilyen, általunk kitalált esemény bekövetkeztét jelezhetjük.
Nézzük a folyamatot! Először is elő kell fizetni valamely esemény megfigyelésére a Register-EngineEvent cmdlet segítségével. Elsőként a PowerShell bezárását nézzük meg:
[1] PS C:\> Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {
write-host "Minden jót!"; Start-Sleep 20; "kiléptem..."}
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
1 PowerShell.E... NotStarted False
[2] PS C:\> exit
Minden jót!
Regisztráltam tehát egy eseményfigyelőt, ami a PowerShell kilépésére végrehajtja az –Action paraméternek átadott szkriptblokkot. Itt egy kis várakozást kellett beépítenem a folyamatba, különben nem lett volna időm kimásolni a kimenetet. Láthatjuk tehát, hogy az exit parancsra a szkriptblokk tényleg lefutott.
A másik legyen egy általam kitalált esemény! Az eseményeket forrásuk, származási helyük alapján különböztetjük meg, így az általam kitalált esemény forrása szintén általam kitalált lesz: Saját.Esemény:
[8] PS C:\> Register-EngineEvent -SourceIdentifier Saját.Esemény -Action {write
-host "Most bekövetkezett a saját eseményem!"}
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
2 Saját.Esemény NotStarted False
[9] PS C:\> New-Event Saját.Esemény
ComputerName :
RunspaceId : 01526b1c-155b-408d-aa7c-23fe54ae22f3
EventIdentifier : 3
Sender :
SourceEventArgs :
SourceArgs : {}
SourceIdentifier : Saját.Esemény
TimeGenerated : 2010. 02. 24. 22:24:06
MessageData :
Most bekövetkezett a saját eseményem!
Lekérdezni az eseményfigyeléseket a Get-EventSubscriber cmdlettel lehet:
[45] PS C:\> Get-EventSubscriber
SubscriptionId : 3
SourceObject :
EventName :
SourceIdentifier : Saját.Esemény
Action : System.Management.Automation.PSEventJob
HandlerDelegate :
SupportEvent : False
ForwardEvent : False
Megszűntetni az Unregister-Event cmdlettel.
[46] PS C:\> Unregister-Event -SubscriptionId 3
Az esemény-előfizetések valójában PowerShell Job-okként futnak:
[1] PS C:\> Register-EngineEvent -SourceIdentifier Saját.Esemény -Action {"Most
bekövetkezett a saját eseményem!"}
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
1 Saját.Esemény NotStarted False
[2] PS C:\> Get-Job
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
1 Saját.Esemény NotStarted False
Látható, hogy létrejött egy Job. Most „bekövetkeztetem” az eseményt:
[3] PS C:\> New-Event -SourceIdentifier saját.esemény
ComputerName :
RunspaceId : 55d7819c-650b-4fb2-9553-ce395f0ab348
EventIdentifier : 1
Sender :
SourceEventArgs :
SourceArgs : {}
SourceIdentifier : saját.esemény
TimeGenerated : 2010. 02. 25. 21:55:56
MessageData :
A fenti eseményregisztráció –Action részében most nem Write-Host-tal jeleztem az esemény bekövetkeztét, hanem csak „simán” kiküldtem a szöveget az Outputra, de mivel háttérben futó folyamatként futott ez le, ezért nem látok a konzolon semmit. Ahhoz, hogy ezt meglássam, a kimenetet el kell kérnem a Jobtól:
[5] PS C:\> Receive-Job -Id 1
Most bekövetkezett a saját eseményem!
Ha eltávolítom az eseményregisztrációt, attól még a befejezett Job benne marad a rendszerben, így érdemes lehet azt eltávolítani:
[6] PS C:\> Unregister-Event -SourceIdentifier saját.esemény
[7] PS C:\> Get-Job
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
1 Saját.Esemény Stopped False
[8] PS C:\> Remove-Job -Id 1
Van még további lehetőség: távoli gépen generálódó események helyi gépre továbbítása. Első lépésként regisztrálni kell az eseményt a távoli gépen egy PSSession kapcsolaton keresztül:
[47] PS C:\> $s = New-PSSession -ComputerName member
[48] PS C:\> Invoke-Command -Session $s -ScriptBlock {Register-EngineEvent -Sou
rceIdentifier saját.event -Forward}
A helyi gépen is regisztrálni kell az eseményt, hogy a továbbított esemény bekövetkeztéről értesülhessünk:
[49] PS C:\> Register-EngineEvent -SourceIdentifier saját.event -Action {write-
host "Valami történt!"}
WARNING: column "Command" does not fit into the display and was removed.
Id Name State HasMoreData Location
-- ---- ----- ----------- --------
6 saját.event NotStarted False
Ezután már jöhet a távoli gépen az esemény. Sajnos az eseménykezelésnek is „scope”-ja van, azaz nem úgy általában kell generálni az eseményt, hanem abban a scope-ban, ahol az eseményre előfizettünk, jelen esetben az $s változóban tárolt PSSession-ben:
[51] PS C:\> Invoke-Command -Session $s -ScriptBlock {new-event saját.event}
PSComputerName : member
RunspaceId : 976df52b-7aa1-4ad5-adf0-75e0ec51e98b
PSShowComputerName : True
ComputerName :
EventIdentifier : 2
Sender :
SourceEventArgs :
SourceArgs : {}
SourceIdentifier : saját.event
TimeGenerated : 2010. 02. 25. 10:13:36
MessageData :
Valami történt!
Látható, hogy meg is érkezett a reagálás a gépemen a távoli eseményre. Megjegyzendő még, hogy a továbbított eseményeknél nem lehet szkriptet definiálni, tehát választanunk kell, hogy vagy továbbítjuk az eseményt és a másik gépen reagálunk rá, vagy pedig nem továbbítjuk, és akkor tudunk a távoli gépen reagálni.