I've included some handy wrapper functions to make working with events and scriptblocks a bit easier - download the example script called "event handling wrapper functions" from the Releases page.
- Add-EventHandler : Automatically run a scriptblock when the provided event occurs on a given variable (when inside Do-Events loop)
- Add-EventHandler [-Variable] <PSVariable> [-EventName] <String> [-Script] <ScriptBlock>
- Remove-EventHandler : Remove all bindings for the specific event from the given variable.
- Remove-EventHandler [-Variable] <PSVariable> [-EventName] <String>
- Do-Events : Much like VB's DoEvents command, this function puts PowerShell into a waiting state and will call your ScriptBlocks when your configured events occur. Use Ctrl+C to exit.
- Do-Events [-ExitImmediately] <Boolean>
NOTE: your ScriptBlocks will only be called if you're inside a Do-Events loop.
1# Add-PSSnapin PSEventing
2# $fsw = new-object system.io.filesystemwatcher
3# $fsw.Path = "c:\temp"
4# $fsw.EnableRaisingEvents = $true
5# Add-EventHandler (get-variable fsw) deleted {
param([System.Management.Automation.PSVariable]$variable, [EventArgs]$args)
... do stuff ... }
6# Do-Events $false
an example how to wire up an event using the wrapper scripts
Nrgghg, I feel another PowerShell project coming on ... enter PowerShell Eventing 0.5 Beta! With the magic of lightweight codegen, aka LCG, a smidgeon of reflection (well, quite a bit) and some inspiration, I managed to cough up this latest project.
While you cannot directly bind scriptblocks as eventhandlers, you can automatically route events in realtime to a background queue and deal with them in your time with a special Get-Event cmdlet. There is a sample walkthrough on the home page of the Wiki, and you can download a Sql backup script which shows progress reporting, all in script!
PS 1# Add-PSSnapin PSEventing
PS 2# $wc = new-object system.net.webclient
PS 3# get-eventbinding -IncludeUnboundEvents | ft -auto
VariableName EventName TypeName Listening
------------ --------- -------- ---------
wc Disposed WebClient False
wc DownloadDataCompleted WebClient False
wc DownloadFileCompleted WebClient False
wc DownloadProgressChanged WebClient False
wc DownloadStringCompleted WebClient False
wc OpenReadCompleted WebClient False
wc OpenWriteCompleted WebClient False
wc UploadDataCompleted WebClient False
wc UploadFileCompleted WebClient False
wc UploadProgressChanged WebClient False
wc UploadStringCompleted WebClient False
wc UploadValuesCompleted WebClient False
PS 4# Connect-EventListener wc disposed -verbose
VERBOSE: Target is a WebClient
VERBOSE: Now listening for 'disposed' events from $wc
PS 5# $wc.Dispose()
PS 6# get-event | ft -auto
Occurred Source Name Args
-------- ------ ---- ----
5/13/2007 8:04:20 PM variable:wc Disposed System.EventArgs
Have fun!