ObjectEvent kezelése

A következő eseménytípus a .NET osztályok és objektumok által generált események. Ha belenézünk a Reflector programmal a .NET keretrendszerbe, akkor itt-ott találunk esemény típusú tagjellemzőket:

137 . ábra Az esemény-tagjellemzők villámmal vannak jelezve

 

Ezt persze PowerShellből is fel tudjuk deríteni, a fenti példában szereplő System.Timers.Timer  osztály esetében például így:

[4] PS C:\> $timer = new-object System.Timers.Timer

[5] PS C:\> Get-Member -InputObject $timer -MemberType event

 

 

   TypeName: System.Timers.Timer

 

Name     MemberType Definition

----     ---------- ----------

Disposed Event      System.EventHandler Disposed(System.Object, System.Even...

Elapsed  Event      System.Timers.ElapsedEventHandler Elapsed(System.Object...

Ha jól beállítjuk a $timer változóban tárolt objektumot, azaz megadjuk, hogy mennyi időt számláljon vissza és elindítjuk a visszaszámlálást, akkor az idő elteltekor ez az esemény fog bekövetkezni, amire PowerShell segítségével is tudunk reagálni. Első lépés tehát a számláló beállítása:

[7] PS C:\> $timer | Format-List *

 

 

AutoReset           : True

Enabled             : False

Interval            : 100

Site                :

SynchronizingObject :

Container           :

 

 

 

[8] PS C:\> $timer.Interval = 1000

[9] PS C:\> $timer.Enabled = $true

Megnéztem először, hogy milyen tulajdonságai is vannak ennek a $timer-nek, utána beállítottam 1000 ms-os visszaszámlálást, majd bekapcsoltam a számlálót. Regisztráljuk az eseménykezelőt is erre a Register-ObjectEvent  cmdlettel:

[31] PS C:\> Register-ObjectEvent -InputObject $timer -EventName Elapsed -Sourc

eIdentifier timer -Action {$host.UI.RawUI.WindowTitle = (get-date).tostring("",

(get-culture))}

 

WARNING: column "Command" does not fit into the display and was removed.

 

Id              Name            State      HasMoreData     Location

--              ----            -----      -----------     --------

9               timer           NotStarted False

Az –Action részben az aktuális időt teszem be a PowerShell ablak fejlécébe, szépen a területi beállításoknak megfelelő formátumban. Az eredmény ilyen szép (az ablak fejlécét kell figyelni):

138 . ábra Az idő kiíratása az ablakfejlécbe eseményvezérelten

Az eseményfigyelést ugyanúgy az Unregister-Event cmdlettel tudjuk megszűntetni.

A másik gyakori lekövetendő esemény a fájlok születése, megszűnése és módosulása. Erre a .NET keretrendszer System.IO.FileSystemWatcher  osztálya áll rendelkezésünkre, amit hasonlóan kell kezelni, felparaméterezni, mint az előbb látott időzítőt:

[32] PS C:\> $watcher = New-Object System.IO.FileSystemWatcher

[33] PS C:\> Get-Member -InputObject $watcher -MemberType event, property

 

 

   TypeName: System.IO.FileSystemWatcher

 

Name                  MemberType Definition

----                  ---------- ----------

Changed               Event      System.IO.FileSystemEventHandler Changed(S...

Created               Event      System.IO.FileSystemEventHandler Created(S...

Deleted               Event      System.IO.FileSystemEventHandler Deleted(S...

Disposed              Event      System.EventHandler Disposed(System.Object...

Error                 Event      System.IO.ErrorEventHandler Error(System.O...

Renamed               Event      System.IO.RenamedEventHandler Renamed(Syst...

Container             Property   System.ComponentModel.IContainer Container...

EnableRaisingEvents   Property   System.Boolean EnableRaisingEvents {get;set;}

Filter                Property   System.String Filter {get;set;}

IncludeSubdirectories Property   System.Boolean IncludeSubdirectories {get;...

InternalBufferSize    Property   System.Int32 InternalBufferSize {get;set;}

NotifyFilter          Property   System.IO.NotifyFilters NotifyFilter {get;...

Path                  Property   System.String Path {get;set;}

Site                  Property   System.ComponentModel.ISite Site {get;set;}

SynchronizingObject   Property   System.ComponentModel.ISynchronizeInvoke S...

 

[35] PS C:\> $watcher | Format-List

 

 

NotifyFilter          : FileName, DirectoryName, LastWrite

EnableRaisingEvents   : False

Filter                : *.*

IncludeSubdirectories : False

InternalBufferSize    : 8192

Path                  :

Site                  :

SynchronizingObject   :

Container             :

Látható, hogy milyen paraméterekből épül fel egy ilyen fájlfigyelő: ki kell választani, hogy milyen eseményt figyelünk; lehet a fájlnévre vonatkozó szűrőt beállítani; alkönyvtárakban is figyeljen-e; elérési utat meg lehet adni. Nézzük, hogy milyen értesítések létezhetnek egyáltalán:

[41] PS C:\> [system.enum]::getnames([system.io.notifyfilters])

FileName

DirectoryName

Attributes

Size

LastWrite

LastAccess

CreationTime

Security

Ezt összevetve a lehetséges eseményekkel, érdemes lehet például a következőket beállítani figyelésre:

[71] PS C:\> $watcher.NotifyFilter = "FileName", "DirectoryName", "LastWrite",

"Attributes", "Security"

A FileName, DirectoryName figyelésével lehetővé válik a Rename, Create és Delete esemény észlelése. A LastWrite figyelésével észrevesszük a tartalmi módosítást, azaz a Change eseményt. Ugyancsak Change esemény következik be, ha a fájl hozzáférését és ha attribútumait módosítjuk. A FileName és DirectoryName figyelése még Change eseményt is generál, ha a fájl átmozgatjuk.

Egyéb paraméterek beállítása:

[72] PS C:\> $watcher.IncludeSubdirectories = $true

[73] PS C:\> $watcher.Path = "C:\munka"

Miután itt több fajta esemény is bekövetkeztethet és egy esemény-előfizetésnél csak egy eseményt lehet megadni, ezért készítettem egy kifejezést, ami az összes, a [33]-as sornál látható eseményre regisztrál egy-egy előfizetést:

[74] PS C:\> $watcher | Get-Member -MemberType event | ForEach-Object {Register

-ObjectEvent -InputObject $watcher -EventName $_.name -SourceIdentifier "watche

r.$($_.name)" -Action {$event.timegenerated, $eventargs | out-host}}

 

WARNING: column "Command" does not fit into the display and was removed.

 

Id              Name            State      HasMoreData     Location

--              ----            -----      -----------     --------

44              watcher.Changed NotStarted False

45              watcher.Created NotStarted False

46              watcher.Deleted NotStarted False

47              watcher.Disp... NotStarted False

48              watcher.Error   NotStarted False

49              watcher.Renamed NotStarted False

Ez a kifejezést tehát kiszedi a $watcher tagjellemzői közül csak az esemény típusúakat, majd ezek mindegyikére beregisztrál egy ObjectEvent eseménykezelést. Az –Action résznél látható, hogy létrejönnek ilyen esetben újabb automatikus változók, ezek közül a legfontosabbakat kiírom a konzolra.

Akkor most kicsit stimulálom a megfigyelt könyvtáram fájljait, nézzük a kimenetet:

2010. február 25. 16:41:23

 

ChangeType : Changed

FullPath   : C:\munka\Ez egy fájl.txt

Name       : Ez egy fájl.txt

 

 

2010. február 25. 16:41:37

 

ChangeType : Deleted

FullPath   : C:\munka\Ez egy fájl.txt

Name       : Ez egy fájl.txt

 

 

2010. február 25. 16:41:59

 

OldFullPath : C:\munka\aa2.txt

OldName     : aa2.txt

ChangeType  : Renamed

FullPath    : C:\munka\újnév.txt

Name        : újnév.txt

 

 

2010. február 25. 16:41:59

 

ChangeType : Changed

FullPath   : C:\munka\újnév.txt

Name       : újnév.txt

 

 

2010. február 25. 16:42:27

 

ChangeType : Created

FullPath   : C:\munka\New Text Document (4).txt

Name       : New Text Document (4).txt

A fenti listában levő értesítések rendre a következő tevékenységem hatására generálódtak:

kivettem egy meglevő fájl Read-Only attribútumát

töröltem ezt a fájlt

átneveztem egy fájlt

beleírtam a fájlba

létrehoztam egy fájlt

Az előfizetések törlése ugyanúgy történik, mint az EngineEvent-ek esetében.



Word To HTML Converter