AutoTest Powershell Script
This script will watch a source directory for changes, just *.cs files in this case and then execute a script when a change is detected. This handles the issue of the change event being triggered twice for one change. I’m just calling my default Psake script, but you can put any build/test script call in place of it.
<!—Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/
—>function watch–folder {
</span><span style="color: #0000FF;">param</span><span style="color: #000000;">([string]</span><span style="color: #800080;">$path</span><span style="color: #000000;">, [string]</span><span style="color: #800080;">$filter</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">*.*</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800080;">$command</span><span style="color: #000000;">) get</span><span style="color: #000000;">-</span><span style="color: #000000;">eventsubscriber </span><span style="color: #000000;">-</span><span style="color: #000000;">force </span><span style="color: #000000;">|</span><span style="color: #000000;"> unregister</span><span style="color: #000000;">-</span><span style="color: #000000;">event </span><span style="color: #000000;">-</span><span style="color: #000000;">force </span><span style="color: #800080;">$global:lastGen</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [datetime]</span><span style="color: #000000;">::</span><span style="color: #000000;">Now </span><span style="color: #800080;">$expandedPath</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> convert</span><span style="color: #000000;">-</span><span style="color: #000000;">path </span><span style="color: #800080;">$path</span><span style="color: #000000;"> write</span><span style="color: #000000;">-</span><span style="color: #000000;">host </span><span style="color: #800000;">"</span><span style="color: #800000;">Watching</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #800080;">$expandedPath</span><span style="color: #000000;">\</span><span style="color: #800080;">$filter</span><span style="color: #000000;"> </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> new</span><span style="color: #000000;">-</span><span style="color: #000000;">object System.IO.FileSystemWatcher </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;">.NotifyFilter </span><span style="color: #000000;">=</span><span style="color: #000000;"> [System.IO.NotifyFilters]</span><span style="color: #000000;">::</span><span style="color: #000000;">LastWrite </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;">.Path </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$expandedPath</span><span style="color: #000000;"> </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;">.</span><span style="color: #0000FF;">Filter</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$filter</span><span style="color: #000000;"> </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;">.IncludeSubdirectories </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">$true</span><span style="color: #000000;"> </span><span style="color: #800080;">$action</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> { </span><span style="color: #800080;">$timeGenerated</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$event</span><span style="color: #000000;">.TimeGenerated </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$timeGenerated</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">$global:lastGen</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> (new</span><span style="color: #000000;">-</span><span style="color: #000000;">timespan </span><span style="color: #000000;">-</span><span style="color: #000000;">sec </span><span style="color: #000000;">1</span><span style="color: #000000;">)) { write</span><span style="color: #000000;">-</span><span style="color: #000000;">host </span><span style="color: #000000;">*****************************************</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Green write</span><span style="color: #000000;">-</span><span style="color: #000000;">host </span><span style="color: #800080;">$eventArgs</span><span style="color: #000000;">.FullPath </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Green write</span><span style="color: #000000;">-</span><span style="color: #000000;">host </span><span style="color: #800080;">$eventArgs</span><span style="color: #000000;">.ChangeType at </span><span style="color: #800080;">$event</span><span style="color: #000000;">.TimeGenerated </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Green write</span><span style="color: #000000;">-</span><span style="color: #000000;">host TESTING </span><span style="color: #800080;">$event</span><span style="color: #000000;">.MessageData </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Green </span><span style="color: #800080;">$result</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">&</span><span style="color: #000000;"> </span><span style="color: #800080;">$event</span><span style="color: #000000;">.MessageData </span><span style="color: #000000;">|</span><span style="color: #000000;"> out</span><span style="color: #000000;">-</span><span style="color: #000000;">string </span><span style="color: #000000;">-</span><span style="color: #000000;">stream </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$LastExitCode</span><span style="color: #000000;"> </span><span style="color: #008080;">-gt</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">) { </span><span style="color: #800080;">$result</span><span style="color: #000000;"> </span><span style="color: #000000;">|</span><span style="color: #000000;"> select</span><span style="color: #000000;">-</span><span style="color: #000000;">object </span><span style="color: #000000;">-</span><span style="color: #000000;">last </span><span style="color: #000000;">70</span><span style="color: #000000;"> </span><span style="color: #000000;">|</span><span style="color: #000000;"> out</span><span style="color: #000000;">-</span><span style="color: #000000;">host write</span><span style="color: #000000;">-</span><span style="color: #000000;">host FAILED </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Red write</span><span style="color: #000000;">-</span><span style="color: #000000;">host </span><span style="color: #000000;">*****************************************</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Red } </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> { write</span><span style="color: #000000;">-</span><span style="color: #000000;">host SUCCESS </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Green write</span><span style="color: #000000;">-</span><span style="color: #000000;">host </span><span style="color: #000000;">*****************************************</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">foreground Green } } </span><span style="color: #800080;">$global:lastGen</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$timeGenerated</span><span style="color: #000000;"> } [void](Register</span><span style="color: #000000;">-</span><span style="color: #000000;">ObjectEvent </span><span style="color: #000000;">-</span><span style="color: #000000;">InputObject </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">EventName Created </span><span style="color: #000000;">-</span><span style="color: #000000;">SourceIdentifier ThisFileWatcher </span><span style="color: #000000;">-</span><span style="color: #000000;">Action </span><span style="color: #800080;">$action</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">MessageData </span><span style="color: #800080;">$command</span><span style="color: #000000;">) [void](Register</span><span style="color: #000000;">-</span><span style="color: #000000;">ObjectEvent </span><span style="color: #000000;">-</span><span style="color: #000000;">InputObject </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">EventName Changed </span><span style="color: #000000;">-</span><span style="color: #000000;">SourceIdentifier ThisFileWatcherA </span><span style="color: #000000;">-</span><span style="color: #000000;">Action </span><span style="color: #800080;">$action</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">MessageData </span><span style="color: #800080;">$command</span><span style="color: #000000;">) [void](Register</span><span style="color: #000000;">-</span><span style="color: #000000;">ObjectEvent </span><span style="color: #000000;">-</span><span style="color: #000000;">InputObject </span><span style="color: #800080;">$fileSystemWatcher</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">EventName Deleted </span><span style="color: #000000;">-</span><span style="color: #000000;">SourceIdentifier ThisFileWatcherB </span><span style="color: #000000;">-</span><span style="color: #000000;">Action </span><span style="color: #800080;">$action</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">MessageData </span><span style="color: #800080;">$command</span><span style="color: #000000;">)}
watch–folder ".\src" "*.cs" {
psake} wait–event "ctrl-c"
Thanks to this post PowerShell, events and file watcher.