candland

@candland rss self
September 9th 2010

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 watchfolder {

</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;">&quot;</span><span style="color: #800000;">*.*</span><span style="color: #800000;">&quot;</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;">&quot;</span><span style="color: #800000;">Watching</span><span style="color: #800000;">&quot;</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;">&amp;</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;">)

}

watchfolder ".\src" "*.cs" {

psake

} waitevent "ctrl-c"

Thanks to this post PowerShell, events and file watcher.



blog comments powered by Disqus