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:
143 . á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):
144 . ábra Az idő kiíratása az ablakfejlécbe esemény-vezé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.