EngineEvent kezelése

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.



Word To HTML Converter