<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://arildf.spaces.live.com/mmm2008-04-25_07.02/rsspretty.aspx?rssquery=en-US;http%3a%2f%2farildf.spaces.live.com%2fcategory%2fPowershell%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Random thoughts about AnkhSVN, .NET, Powershell and other stuff: Powershell</title><description /><link>http://arildf.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catPowershell</link><language>en-US</language><pubDate>Mon, 12 May 2008 09:18:37 GMT</pubDate><lastBuildDate>Mon, 12 May 2008 09:18:37 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://arildf.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>-1612417020300539472</live:id><live:alias>arildf</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Powershell MSBuild task</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!180.entry</link><description>&lt;pre&gt; &lt;/pre&gt;
&lt;p&gt;I have written an MSBuild task that hosts a Powershell runspace and allows you to embed Powershell scripts in your MSBuild build files. While MSBuild ships with a large number of useful tasks (and there are also a lot of third party tasks available), there is often something you want to do which doesn't fit into the tasks provided. You can always write your own tasks to achieve what you want, but this can often become tedious to maintain since you will have to recompile and redeploy the custom task every time you need to make a little change. Having small snippets of script embedded in the MSBuild file itself can be a more easily maintainable solution, and what better language for this than Powershell?
&lt;p&gt;As a custom task, the Powershell task needs to be loaded into your build file with the &amp;lt;UsingTask&amp;gt; element:
&lt;p&gt;&lt;tt&gt;&amp;lt;UsingTask AssemblyFile=&amp;quot;PowershellMSBuildTask.dll&amp;quot; TaskName =&amp;quot;Powershell&amp;quot;/&amp;gt;&lt;/tt&gt;
&lt;p&gt;Since tasks in MSBuild don't have access to the contents of their tags, the scripts themselves need to be MSBuild properties, declared in a &amp;lt;PropertyGroup&amp;gt;:
&lt;p&gt;&lt;pre&gt;&amp;lt;PropertyGroup&amp;gt; 
	&amp;lt;HelloWorldScript&amp;gt;Write-Host &amp;quot;Hello world&amp;quot;&amp;lt;/HelloWorldScript&amp;gt; 
&amp;lt;/PropertyGroup&amp;gt;&lt;/pre&gt;
&lt;p&gt;Now, to invoke this script, you will use the Powershell task and invoke it from within a target. You reference the script property the same way you reference any other MSBuild script property: &lt;pre&gt;&amp;lt;Target Name=&amp;quot;HelloWorld&amp;quot;&amp;gt;
  &amp;lt;Powershell Script=&amp;quot;$(HelloWorldScript)&amp;quot;/&amp;gt;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;
&lt;p&gt; The full MSBuild file will now be something like this:
&lt;p&gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;Project DefaultTargets=&amp;quot;HelloWorld&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/developer/msbuild/2003&amp;quot;&amp;gt;
	&amp;lt;UsingTask AssemblyFile=&amp;quot;PowershellMSBuildTask.dll&amp;quot; TaskName =&amp;quot;Powershell&amp;quot;/&amp;gt;

	&amp;lt;PropertyGroup&amp;gt; 
		&amp;lt;HelloWorldScript&amp;gt;Write-Host &amp;quot;Hello world&amp;quot;&amp;lt;/HelloWorldScript&amp;gt; 
	&amp;lt;/PropertyGroup&amp;gt;

	&amp;lt;Target Name=&amp;quot;HelloWorld&amp;quot;&amp;gt;
		&amp;lt;Powershell Script=&amp;quot;$(HelloWorldScript)&amp;quot;/&amp;gt;
	&amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;Save it as HelloWorld.proj, place PowershellMSBuildTask.dll in the same directory and run it like this:
&lt;p&gt;&lt;pre&gt;msbuild HelloWorld.proj&lt;/pre&gt;
&lt;p&gt;
&lt;p&gt;The output should be as follows:
&lt;p&gt;&lt;pre&gt;PS D:\tmp&amp;gt; msbuild HelloWorld.proj
Microsoft (R) Build Engine Version 2.0.50727.42
[Microsoft .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation 2005. All rights reserved.
Build started 13.09.2006 19:02:21.
__________________________________________________
Project &amp;quot;D:\tmp\HelloWorld.proj&amp;quot; (default targets):
Target HelloWorld:
    Hello world
Build succeeded.
    0 Warning(s)
    0 Error(s)
Time Elapsed 00:00:05.09&lt;/pre&gt;
&lt;p&gt;
&lt;p&gt;Not horribly exciting, but it works.
&lt;p&gt;Of course, such a task would have limited usefullness if there wasn't a way to pass arguments from MSBuild into the custom script. The Powershell task has two ways of doing this.
&lt;p&gt;The first way is an attribute 'Arguments'. This takes in named arguments on the form 'varname1=value1;varname2=value2'. varname1 and varname2 will then be available as string variables inside the script. For example: 
&lt;p&gt;&lt;pre&gt;    &amp;lt;PropertyGroup&amp;gt;
        &amp;lt;HelloArgumentsScript&amp;gt;&amp;lt;![CDATA[
        Write-Host (&amp;quot;{0}&amp;quot; -f (([int]$value1) + ([int]$value2)))
        ]]&amp;gt;&amp;lt;/HelloArgumentsScript&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;Target Name=&amp;quot;HelloArguments&amp;quot;&amp;gt;
        &amp;lt;Powershell Script=&amp;quot;$(HelloArgumentsScript)&amp;quot; Arguments=&amp;quot;value1=40;value2=2&amp;quot;/&amp;gt;
    &amp;lt;/Target&amp;gt;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;
&lt;p&gt;The output is as expected:
&lt;p&gt;&lt;pre&gt;Project &amp;quot;D:\tmp\HelloWorld.proj&amp;quot; (HelloArguments target(s)):
Target HelloArguments:
    42
Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:02.78&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;
&lt;p&gt;The other way is through the task attribute 'TaskItems'. As the name implies, this takes in a set of taskitem objects. They are available in the Powershell script as a collection of ITaskItem objects named $TaskItems:   
&lt;p&gt;&lt;pre&gt;&amp;lt;PropertyGroup&amp;gt;
    &amp;lt;TaskItemsScript&amp;gt; &amp;lt;![CDATA[ Write-Host (&amp;quot;The answer is {0}&amp;quot; -f (([int]$taskitems[0].ItemSpec) + ([int]$taskitems[1].ItemSpec))) ]]&amp;gt; &amp;lt;/TaskItemsScript&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&amp;lt;PropertyGroup&amp;gt;
    &amp;lt;Argument1&amp;gt;12&amp;lt;/Argument1&amp;gt;
    &amp;lt;Argument2&amp;gt;30&amp;lt;/Argument2&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;&lt;/pre&gt;&lt;pre&gt;
&amp;lt;Target Name=&amp;quot;TaskItems&amp;quot;&amp;gt;
    &amp;lt;Powershell Script=&amp;quot;$(TaskItemsScript)&amp;quot; TaskItems=&amp;quot;$(Argument1);$(Argument2)&amp;quot;&amp;gt;
&amp;lt;/Target&amp;gt;&lt;/pre&gt;
&lt;p&gt;It is also possible for a script to return values to the calling task. This happens through the Output taskparameter, and works like this:
&lt;p&gt;&lt;pre&gt;&amp;lt;Powershell Script=&amp;quot;$(ValueReturningScript)&amp;quot;&amp;gt;
    &amp;lt;Output TaskParameter=&amp;quot;Output&amp;quot; PropertyName=&amp;quot;ScriptOutput&amp;quot;/&amp;gt;
&amp;lt;/Powershell&amp;gt;

&amp;lt;Message Lines=&amp;quot;$(ScriptOutput)&amp;quot;/&amp;gt;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;
&lt;p&gt;The source code can be found in a Subversion repository &lt;a href="http://ankhsvn.com/svn/powershell/trunk/PowershellMSBuildTask"&gt;here&lt;/a&gt;, and a downloadable zip including both source and the prebuilt task can be found &lt;a href="http://ankhsvn.com/images/PowershellMSBuildTask.zip"&gt;here.&lt;/a&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;/pre&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1612417020300539472&amp;page=RSS%3a+Powershell+MSBuild+task&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=arildf.spaces.live.com&amp;amp;GT1=arildf"&gt;</description><comments>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!180.entry#comment</comments><guid isPermaLink="true">http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!180.entry</guid><pubDate>Wed, 13 Sep 2006 15:35:25 GMT</pubDate><slash:comments>12</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://arildf.spaces.live.com/blog/cns!E99F8B43533149B0!180/comments/feed.rss</wfw:commentRss><wfw:comment>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!180.entry#comment</wfw:comment><dcterms:modified>2006-09-13T17:35:28Z</dcterms:modified></item><item><title>DynamicMethod revisited: Making Powershell handle arbitrary delegates</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!144.entry</link><description>&lt;p&gt;
 &lt;p&gt;As I posted on &lt;a href="http://arildf.spaces.msn.com/blog/cns!E99F8B43533149B0!140.entry?_c11_blogpart_blogpart=blogview&amp;amp;_c=blogpart"&gt;Monday&lt;/a&gt;, Powershell doesn’t let you cast a scriptblock to a delegate with a signature other than void (Object, Object). Jeffrey Snover &lt;a href="http://blogs.msdn.com/powershell/archive/2006/07/24/Casting_a_scriptblock_to_an_arbitrary_delegate_signature.aspx"&gt;confirmed&lt;/a&gt; this the same day. When I learned that this was a limitation in v1.0 of Powershell, I set out to find a way to get around this problem using .NET’s DynamicMethod class. 
&lt;p&gt;I mostly got it done yesterday, but I was feeling a bit tired and didn’t finish it so I could blog about it. Today I see that the Powershell team has posted a &lt;a href="http://blogs.msdn.com/powershell/archive/2006/07/25/678259.aspx"&gt;workaround of their own&lt;/a&gt;, which is remarkably similar to mine. Although, theirs probably gets extra coolness points since it’s written in Powershell itself and not implemented as a cmdlet like mine.
&lt;p&gt;Anyway, I have now finished it and decided to post it anyway (I spent quite a lot of time on it, mostly silly mistakes on my part). Here goes:
&lt;p&gt;
&lt;span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;System&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;System&lt;span&gt;.&lt;/span&gt;Collections&lt;span&gt;.&lt;/span&gt;Generic&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;System&lt;span&gt;.&lt;/span&gt;Text&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;System&lt;span&gt;.&lt;/span&gt;Management&lt;span&gt;.&lt;/span&gt;Automation&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;System&lt;span&gt;.&lt;/span&gt;Reflection&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;System&lt;span&gt;.&lt;/span&gt;Reflection&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;using&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Fines&lt;span&gt;.&lt;/span&gt;Utils&lt;span&gt;.&lt;/span&gt;Collections&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Fines&lt;span&gt;.&lt;/span&gt;ConvertScriptBlockSnapin&lt;br&gt;
&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Cmdlet&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;quot;Convert&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;ScriptBlock&amp;quot;&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;br&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ConvertScriptBlockCommand&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Cmdlet&lt;br&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Parameter&lt;span&gt;(&lt;/span&gt;Mandatory&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Position&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; &lt;/span&gt;DelegateTypeName&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;get&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;delegateTypeName&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;set&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;delegateTypeName&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;value&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Parameter&lt;span&gt;(&lt;/span&gt;Mandatory&lt;span&gt;=&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Position&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlock&lt;span&gt; &lt;/span&gt;ScriptBlock&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;get&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;scriptBlock&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;set&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;scriptBlock&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;value&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;Parameter&lt;span&gt;(&lt;/span&gt;Mandatory&lt;span&gt;=&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Position&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;SwitchParameter&lt;span&gt; &lt;/span&gt;ReturnPSObject&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;get&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;returnPSObject&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;set&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;returnPSObject&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;value&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;override&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ProcessRecord&lt;span&gt;()&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// Validate the DelegateTypeName parameter&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// It must be a delegate type&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;Type&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;LanguagePrimitives&lt;span&gt;.&lt;/span&gt;TryConvertTo&lt;span&gt;&amp;lt;&lt;/span&gt;Type&lt;span&gt;&amp;gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;DelegateTypeName&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;Exception&lt;span&gt; &lt;/span&gt;ex&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ArgumentException&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;Type not found: &amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;DelegateTypeName&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;DelegateTypeName&amp;quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;base&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;ThrowTerminatingError&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ErrorRecord&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ex&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;TypeNotFound&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ErrorCategory&lt;span&gt;.&lt;/span&gt;InvalidType&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Delegate&lt;span&gt;).&lt;/span&gt;IsAssignableFrom&lt;span&gt;(&lt;/span&gt;delegateType&lt;span&gt;))&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;Exception&lt;span&gt; &lt;/span&gt;ex&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ArgumentException&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;DelegateTypeName must be of a delegate type. Found &amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;DelegateTypeName&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;&amp;quot;DelegateTypeName&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;base&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;ThrowTerminatingError&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ErrorRecord&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ex&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;TypeNotDelegate&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ErrorCategory&lt;span&gt;.&lt;/span&gt;InvalidType&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Delegate&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;MulticastDelegate&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;delegateType&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;Exception&lt;span&gt; &lt;/span&gt;ex&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ArgumentException&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;DelegateTypeName cannot be of type System.Delegate or System.MulticastDelegate&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;&amp;quot;DelegateTypeName&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;base&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;ThrowTerminatingError&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ErrorRecord&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ex&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;TypeSystemDelegate&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ErrorCategory&lt;span&gt;.&lt;/span&gt;InvalidType&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// Create our trampoline and write it to the pipeline&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;ScriptBlockTrampoline&lt;span&gt; &lt;/span&gt;tramp&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlockTrampoline&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;ScriptBlock&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;ReturnPSObject&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;WriteObject&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;tramp&lt;span&gt;.&lt;/span&gt;CreateDelegate&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;/// This class exists to attach state (the scriptblock and the switch parameter) to the dynamic method&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;/// we create.&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlockTrampoline&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlockTrampoline&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlock&lt;span&gt; &lt;/span&gt;scriptBlock&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;SwitchParameter&lt;span&gt; &lt;/span&gt;returnPSObject&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;scriptBlock&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;scriptBlock&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;returnPSObject&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;returnPSObject&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Delegate&lt;span&gt; &lt;/span&gt;CreateDelegate&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Type&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;MethodInfo&lt;span&gt; &lt;/span&gt;invokeMethod&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt;.&lt;/span&gt;GetMethod&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;quot;Invoke&amp;quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// get the parameter types of the delegate&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;Type&lt;span&gt;[]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ListUtils&lt;span&gt;.&lt;/span&gt;ToArray&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;ListUtils&lt;span&gt;.&lt;/span&gt;Map&lt;span&gt;&amp;lt;&lt;/span&gt;ParameterInfo&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Type&lt;span&gt;&amp;gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;invokeMethod&lt;span&gt;.&lt;/span&gt;GetParameters&lt;span&gt;(),&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delegate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ParameterInfo&lt;span&gt; &lt;/span&gt;par&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;par&lt;span&gt;.&lt;/span&gt;ParameterType&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// the first arg needs to be of type ScriptBlockTrampoline so we can treat it as an instance method&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;Type&lt;span&gt;[]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;parmTypes&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;Type&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;.&lt;/span&gt;Length&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;parmTypes&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlockTrampoline&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;Array&lt;span&gt;.&lt;/span&gt;Copy&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;parmTypes&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;.&lt;/span&gt;Length&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// Associate our dynamic method with the ScriptBlockTrampoline class so it can access its privates&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;DynamicMethod&lt;span&gt; &lt;/span&gt;dm&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;DynamicMethod&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;Dele&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;invokeMethod&lt;span&gt;.&lt;/span&gt;ReturnType&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;parmTypes&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlockTrampoline&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;ILGenerator&lt;span&gt; &lt;/span&gt;g&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;dm&lt;span&gt;.&lt;/span&gt;GetILGenerator&lt;span&gt;();&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// Create a local to hold our params array&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;LocalBuilder&lt;span&gt; &lt;/span&gt;arrayLocal&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;DeclareLocal&lt;span&gt;(&lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;[]));&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// create the array with our desired length&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldc_I4&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;.&lt;/span&gt;Length&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Newarr&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// store it in our local&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Stloc&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;arrayLocal&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// load our params into it&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;.&lt;/span&gt;Length&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt;++)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldloc&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;arrayLocal&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// the index in the array in which we want to store the element&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldc_I4&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// load the arg onto the stack&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldarg&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// 'this' is arg 0&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// if it's a value type, we need to box&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt; &lt;/span&gt;&lt;span&gt;].&lt;/span&gt;IsValueType&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                        &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Box&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;baseMethodParmTypes&lt;span&gt;[&lt;/span&gt;&lt;span&gt; &lt;/span&gt;i&lt;span&gt; &lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// and store it in the array&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Stelem&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;//get the scriptblock field&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldarg&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldfld&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlockTrampoline&lt;span&gt; &lt;/span&gt;&lt;span&gt;).&lt;/span&gt;GetField&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;scriptBlock&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;BindingFlags&lt;span&gt;.&lt;/span&gt;NonPublic&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;BindingFlags&lt;span&gt;.&lt;/span&gt;Instance&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;//// now emit the call to the scriptblock&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ldloc&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;arrayLocal&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;EmitCall&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Callvirt&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlock&lt;span&gt; &lt;/span&gt;&lt;span&gt;).&lt;/span&gt;GetMethod&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;InvokeReturnAsIs&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// can't have an object on the stack if we're returning void&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;invokeMethod&lt;span&gt;.&lt;/span&gt;ReturnType&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Pop&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// does the user want the raw object or the PSObject instance?&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;returnPSObject&lt;span&gt;.&lt;/span&gt;IsPresent&lt;span&gt; &lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;// what's returned from the ScriptBlock is a PSObject, get the underlying object instead&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                        &lt;/span&gt;MethodInfo&lt;span&gt; &lt;/span&gt;getMethod&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;PSObject&lt;span&gt; &lt;/span&gt;&lt;span&gt;).&lt;/span&gt;GetProperty&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;quot;BaseObject&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;).&lt;/span&gt;GetGetMethod&lt;span&gt;();&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                        &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;EmitCall&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Call&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;getMethod&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// ret is not optional&lt;/span&gt;&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;g&lt;span&gt;.&lt;/span&gt;Emit&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;OpCodes&lt;span&gt;.&lt;/span&gt;Ret&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;dm&lt;span&gt;.&lt;/span&gt;CreateDelegate&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &lt;/span&gt;delegateType&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlock&lt;span&gt; &lt;/span&gt;scriptBlock&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;            &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;SwitchParameter&lt;span&gt; &lt;/span&gt;returnPSObject&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;ScriptBlock&lt;span&gt; &lt;/span&gt;scriptBlock&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; &lt;/span&gt;delegateTypeName&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;span&gt;        &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;SwitchParameter&lt;span&gt; &lt;/span&gt;returnPSObject&lt;span&gt;;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;span&gt;}&lt;/span&gt;&lt;br&gt;
&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
 &lt;p&gt;The ScriptBlockTrampoline.CreateDelegate method is where most of the fun stuff happens. I create a DynamicMethod with the same signature as that of the target delegate. Since I also pass in the ScriptBlockTrampoline type to the DynamicMethod constructor, the created method will be treated as a member method on ScriptBlockTrampoline with regards to member access; in other words, it can access private members on this type. The first parameter to the DynamicMethod is a ScriptBlockTrampoline object, which means it can be treated as an instance method and have access to the scriptBlock and returnPSObject private member variables.
&lt;p&gt;Code is then emitted to create an array of type Object[], which is then loaded with the arguments passed to the delegate at the invocation point. This array is passed to the ScriptBlock’s InvokeReturnAsIs() method, which actually executes the scriptblock.
&lt;p&gt;One particular thing that caused me a lot of grief (not really sure why, I’ve encountered and solved the same problem before) was that InvokeReturnAsIs() will return an object and place it on the IL evaluation stack even if there is no actual return value and the delegate return type is void. If you don’t pop this object off the stack  (the if statement) before the RET instruction, executing the delegate will cause the .NET runtime to bail out and die since the program is invalid. I spent a lot of hours on this one.
&lt;p&gt;One other thing that bears mentioning is that InvokeReturnAsIs will actually return a PSObject, not the raw underlying object. If the code calling the method expects the actual type (i.e., if it’s called from most managed languages), things will get ugly pretty fast if it gets a PSObject instead.  Code is therefore emitted to call the PSObject.BaseMethod property.
&lt;p&gt;With this cmdlet, implementing a Powershell script for doing an “svn ls” with support for authentication becomes rather simple:
&lt;p&gt;
&lt;pre&gt;&lt;span style="color:#008000"&gt;#&lt;/span&gt;&lt;span style="color:#008000"&gt; get-svndir.ps1&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;
param ([&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;]&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnurl&lt;/span&gt;&lt;span style="color:#000000"&gt;       &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;read-host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Please specify the SVN url for the directory you want to list&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    )

[System.Reflection.Assembly]::LoadFrom((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;join-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;$env:PROGRAMFILES\AnkhSVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;childPath&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Common.dll)) &lt;/span&gt;&lt;span style="color:#000000"&gt;|&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Out-Null&lt;/span&gt;&lt;span style="color:#000000"&gt;
[System.Reflection.Assembly]::LoadFrom((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;join-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;$env:PROGRAMFILES\AnkhSVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;childPath&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.dll)) &lt;/span&gt;&lt;span style="color:#000000"&gt;|&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Out-Null&lt;/span&gt;&lt;span style="color:#000000"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;new-object&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.Client 

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:simplepromptdelegate&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;convert-scriptblock&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.SimplePromptDelegate {
    &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Write-Host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Authenticating against realm &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$args&lt;/span&gt;&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;]
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$user&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Read-Host&lt;/span&gt;&lt;span style="color:#000000"&gt; (&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Input username (press Enter to accept default of {0})&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;  &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;f&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$args&lt;/span&gt;&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;])
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; ( &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$user&lt;/span&gt;&lt;span style="color:#000000"&gt;.Trim() &lt;/span&gt;&lt;span style="color:#0000FF"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; ) 
    {
        &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$user&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$args&lt;/span&gt;&lt;span style="color:#000000"&gt;[&lt;/span&gt;&lt;span style="color:#FF0000"&gt;1&lt;/span&gt;&lt;span style="color:#000000"&gt;]
    }
    
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$password&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Read-Host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;AsSecureString&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Input password&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;
    
    &lt;/span&gt;&lt;span style="color:#008000"&gt;#&lt;/span&gt;&lt;span style="color:#008000"&gt; Convert it to a plain string&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$BSTR&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; [System.Runtime.InteropServices.marshal]::SecureStringToBSTR(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$password&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$password&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; [System.Runtime.InteropServices.marshal]::PtrToStringAuto(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$BSTR&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$BSTR&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$cred&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;New-Object&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.SimpleCredential(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$user&lt;/span&gt;&lt;span style="color:#000000"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$password&lt;/span&gt;&lt;span style="color:#000000"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$False&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$cred&lt;/span&gt;&lt;span style="color:#000000"&gt;
}

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.AuthBaton.Add( [NSvn.Core.AuthenticationProvider]::GetWindowsSimpleProvider() )
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.AuthBaton.Add( [NSvn.Core.AuthenticationProvider]::GetSimplePromptProvider(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:simplepromptdelegate&lt;/span&gt;&lt;span style="color:#000000"&gt;, &lt;/span&gt;&lt;span style="color:#FF0000"&gt;3&lt;/span&gt;&lt;span style="color:#000000"&gt;) )
  

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$items&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.List(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnurl&lt;/span&gt;&lt;span style="color:#000000"&gt;, [NSvn.Core.Revision]::Head, [NSvn.Core.Revision]::Head, [NSvn.Common.Recurse]::None)
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$items&lt;/span&gt;&lt;/pre&gt;
 &lt;p&gt;Thanks to &lt;a href="http://mow001.blogspot.com/"&gt;/\/\o\/\/&lt;/a&gt; for pointing me to his blog post about how to convert a SecureString to a regular .NET string, which is what the SimpleCredential constructor expects.
&lt;p&gt;A sample run of that script:
&lt;blockquote&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;PS D:\mydocs\powershell&amp;gt; D:\mydocs\powershell\get-svndir.ps1 http://ankhsvn.com/svn/draco/ | ft Path,LastAuthor,Time
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;Authenticating against realm  &amp;lt;http://ankhsvn.com:80&amp;gt; Subversion repository draco
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;Input username (press Enter to accept default of Arild):
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;Input password: ****
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;Path                                    LastAuthor                              Time
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;----                                    ----------                              ----
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;trunk                                   Arild                                   16.01.2006 03:33:30
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;branches                                Arild                                   18.10.2005 21:03:32
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New;font-size:8"&gt;tags                                    Arild                                   18.10.2005 21:03:32
&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;The snapin can be found in SVN at &lt;a href="http://ankhsvn.com/svn/powershell/trunk/ConvertScriptBlockCommand/"&gt;http://ankhsvn.com/svn/powershell/trunk/ConvertScriptBlockCommand/&lt;/a&gt;. It is also downloadable as a .zip &lt;a href="http://ankhsvn.com/images/ConvertScriptBlockCommand.zip"&gt;here&lt;/a&gt;. To install it, run install.ps1 from the root folder in &lt;a href="http://arildf.spaces.msn.com/blog/cns!E99F8B43533149B0!133.entry?_c11_blogpart_blogpart=blogview&amp;amp;_c=blogpart"&gt;a shell with the .NET environment set&lt;/a&gt;. By default, it will add the command “Add-PsSnapin ConvertScriptBlockSnapin” to your $PROFILE file after compiling and installing it if it’s not already there.
&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1612417020300539472&amp;page=RSS%3a+DynamicMethod+revisited%3a+Making+Powershell+handle+arbitrary+delegates&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=arildf.spaces.live.com&amp;amp;GT1=arildf"&gt;</description><comments>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!144.entry#comment</comments><guid isPermaLink="true">http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!144.entry</guid><pubDate>Wed, 26 Jul 2006 17:48:44 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://arildf.spaces.live.com/blog/cns!E99F8B43533149B0!144/comments/feed.rss</wfw:commentRss><wfw:comment>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!144.entry#comment</wfw:comment><dcterms:modified>2006-07-26T17:48:44Z</dcterms:modified></item><item><title>Powershell can’t do arbitrary-signature delegates?</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!140.entry</link><description>I was asked the other day how to handle authentication in NSvn with Powershell. The scripts I’ve shown up until now([1], [2] have used the NSvn.Core.AuthenticationProvider.GetWindowsSimpleProvider() method to provide authentication when required by Subversion. Subversion uses a concept of “authentication providers” to handle the various forms of authentication it supports (querying the user for the password, SSL etc). GetWindowsSimpleProvider() returns an authentication provider that uses cached authentication info stored in the %APPDATA%\Subversion\auth directory on the user’s computer. It differs from the GetSimpleProvider() method in that the provider returned can handle authentication information that has been encrypted with the Windows Crypto API.
The problem with using only GetWindowsSimpleProvider() (or GetSimpleProvider()) is that it won’t work unless there is some authentication information already cached. In other words, you would have to access the repository in question using another Subversion client before you are able to use any of these scripts as written (if the repository actually demands authentication for the operations you perform, that is). To actually be able to query the user for authentication requires the provider returned by GetSimplePromptProvider(). GetSimplePromptProvider() has the following signature:
AuthenticationProvider GetSimplePromptProvider( SimplePromptDelegate promptDelegate,  int retryLimit );
SimplePromptDelegate again is a callback used by Subversion to actually query the user for username and password. It has the following signature:
delegate SimpleCredential SimplePromptDelegate( String realm, String username, bool maySave );
I assumed that calling GetSimplePromptProvider() from Powershell would be a simple task; merely cast a scriptblock to[NSvn.Core.SimplePromptDelegate]. Alas, no such luck:
PS D:\mydocs\powershell&amp;gt; $del = [NSvn.Core.SimplePromptDelegate] { param($realm, $username, $maySave) $null }
Cannot convert value &amp;quot;param($realm, $username, $maySave) $null &amp;quot; to type &amp;quot;NSvn.Core.SimplePromptDelegate&amp;quot;. 
Error: &amp;quot;Error binding to target method.&amp;quot;
At line:1 char:40
+ $del = [NSvn.Core.SimplePromptDelegate]  &amp;lt;&amp;lt;&amp;lt;&amp;lt; { param($realm, $username, $maySave) $null }
After trying a couple of variants on this (including trying to cast a named function), I broke out Reflector see how Powershell actually creates this delegate. It turns out that Powershell is calling Delegate.CreateDelegate using a MethodInfo object that points to the following method:
private void invokeAsDelegate(object sender, object e)
As you can see, this method takes two arguments and has a void return type. It can obviously never match the signature of SimplePromptDelegate, which takes three arguments and returns a SimpleCredential object. This causes Delegate.CreateDelegate to throw an exception which gets passed up through the Powershell call chain and results in the error message shown.
Am I missing something here? Is there really no way to create such a delegate from a Powershell script block? Is there a way to do this with a named function? 
This is not an insurmountable technical problem to solve. An approach similar to what I did with DynamicMethod
		here would probably work.

 &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1612417020300539472&amp;page=RSS%3a+Powershell+can%e2%80%99t+do+arbitrary-signature+delegates%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=arildf.spaces.live.com&amp;amp;GT1=arildf"&gt;</description><comments>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!140.entry#comment</comments><guid isPermaLink="true">http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!140.entry</guid><pubDate>Mon, 24 Jul 2006 17:32:57 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://arildf.spaces.live.com/blog/cns!E99F8B43533149B0!140/comments/feed.rss</wfw:commentRss><wfw:comment>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!140.entry#comment</wfw:comment><dcterms:modified>2006-08-02T18:22:13Z</dcterms:modified></item><item><title>NSvn and Powershell: Log messages</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!134.entry</link><description>&lt;p&gt;All &lt;span style="font-family:Courier New"&gt;NSvn.Core.Client&lt;/span&gt;  methods that modify the repository directly require a log message. These include &lt;span style="font-family:Courier New"&gt;MakeDir&lt;/span&gt;, &lt;span style="font-family:Courier New"&gt;Commit,  Import&lt;/span&gt;, &lt;span style="font-family:Courier New"&gt;Move&lt;/span&gt;, &lt;span style="font-family:Courier New"&gt;PropDel&lt;/span&gt;, &lt;span style="font-family:Courier New"&gt;PropEdit&lt;/span&gt; and &lt;span style="font-family:Courier New"&gt;PropSet&lt;/span&gt;. To provide a log message using NSvn, you need to handle the &lt;span style="font-family:Courier New"&gt;Client.LogMessage&lt;/span&gt; event and set  the &lt;span style="font-family:Courier New"&gt;Message&lt;/span&gt; property of the &lt;span style="font-family:Courier New"&gt;LogMessageEventArgs&lt;/span&gt; object to a non-null string. Not setting this property will be interpreted by Subversion as a cancellation of the operation, and it will fail silently, returning &lt;span style="font-family:Courier New"&gt;CommitInfo::Invalid&lt;/span&gt;.
&lt;p&gt;I have described the way to handle .NET events in Powershell using script blocks &lt;a href="http://arildf.spaces.msn.com/blog/cns!E99F8B43533149B0!127.trak"&gt;here&lt;/a&gt;. We can adapt the same approach to handling the &lt;span style="font-family:Courier New"&gt;LogMessage&lt;/span&gt; event:
&lt;p&gt;
&lt;pre&gt;&lt;span style="color:#008000"&gt;#&lt;/span&gt;&lt;span style="color:#008000"&gt; make-svndir.ps1&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;
param ([&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;]&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnurl&lt;/span&gt;&lt;span style="color:#000000"&gt;       &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;read-host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Please specify the SVN url for the directory you want to create&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;),
    [&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;]&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$logMessage&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$null&lt;/span&gt;&lt;span style="color:#000000"&gt;
    )

[System.Reflection.Assembly]::LoadFrom((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;join-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;$env:PROGRAMFILES\AnkhSVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;childPath&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Common.dll)) &lt;/span&gt;&lt;span style="color:#000000"&gt;|&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Out-Null&lt;/span&gt;&lt;span style="color:#000000"&gt;
[System.Reflection.Assembly]::LoadFrom((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;join-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;$env:PROGRAMFILES\AnkhSVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;childPath&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.dll)) &lt;/span&gt;&lt;span style="color:#000000"&gt;|&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Out-Null&lt;/span&gt;&lt;span style="color:#000000"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;new-object&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.Client 

&lt;/span&gt;&lt;span style="color:#008000"&gt;#&lt;/span&gt;&lt;span style="color:#008000"&gt; log message entered here&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:logmessagecallback&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; [NSvn.Core.LogMessageDelegate] {
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; ( &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$logMessage&lt;/span&gt;&lt;span style="color:#000000"&gt; )
    {
        &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$_&lt;/span&gt;&lt;span style="color:#000000"&gt;.Message &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$logMessage&lt;/span&gt;&lt;span style="color:#000000"&gt;
    }
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;else&lt;/span&gt;&lt;span style="color:#000000"&gt;
    {
        &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$_&lt;/span&gt;&lt;span style="color:#000000"&gt;.Message &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; (&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Read-Host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Enter a log message&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    }
}

&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.add_LogMessage(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$logmessagecallback&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.AuthBaton.Add( [NSvn.Core.AuthenticationProvider]::GetWindowsSimpleProvider() )
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$commitInfo&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.MakeDir(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnurl&lt;/span&gt;&lt;span style="color:#000000"&gt;)

&lt;/span&gt;&lt;span style="color:#008000"&gt;#&lt;/span&gt;&lt;span style="color:#008000"&gt; you could potentially do other things with the $commitInfo here&lt;/span&gt;&lt;span style="color:#008000"&gt;
#&lt;/span&gt;&lt;span style="color:#008000"&gt; I just return it to the caller of the script&lt;/span&gt;&lt;span style="color:#008000"&gt;
&lt;/span&gt;&lt;span style="color:#000000"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$commitInfo&lt;/span&gt;&lt;span style="color:#000000"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Notice  how I pipe the output from &lt;span style="font-family:Courier New"&gt;Assembly.LoadFrom&lt;/span&gt; to &lt;span style="font-family:Courier New"&gt;Out-Null&lt;/span&gt;. This ensures that the only thing returned to the caller of the script is the &lt;span style="font-family:Courier New"&gt;CommitInfo&lt;/span&gt; object returned from the call to &lt;span style="font-family:Courier New"&gt;MakeDir&lt;/span&gt;. This object contains information about the newly created revision, including its revision number, author and date.
&lt;p&gt;The script can be used like this:

&lt;p&gt;&lt;pre&gt;
PS D:\tmp\build&amp;gt; D:\mydocs\powershell\make-svndir.ps1 http://ankhsvn.com/svn/test/test3 &amp;quot;A log message&amp;quot;
                               Revision Author                                  Date
                               -------- ------                                  ----
                                    220                                         09.07.2006 23:01:08
&lt;/pre&gt;
&lt;p&gt;
 &lt;p&gt;Or like this:

&lt;pre&gt;
PS D:\tmp\build&amp;gt; D:\mydocs\powershell\make-svndir.ps1 http://ankhsvn.com/svn/test/test4
Enter a log message: A log Message
                               Revision Author                                  Date
                               -------- ------                                  ----
                                    221                                         09.07.2006 23:01:40
&lt;/pre&gt;
&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1612417020300539472&amp;page=RSS%3a+NSvn+and+Powershell%3a+Log+messages&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=arildf.spaces.live.com&amp;amp;GT1=arildf"&gt;</description><comments>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!134.entry#comment</comments><guid isPermaLink="true">http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!134.entry</guid><pubDate>Sun, 09 Jul 2006 23:15:17 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://arildf.spaces.live.com/blog/cns!E99F8B43533149B0!134/comments/feed.rss</wfw:commentRss><wfw:comment>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!134.entry#comment</wfw:comment><dcterms:modified>2006-07-09T23:15:17Z</dcterms:modified></item><item><title>Setting the .NET environment for a Powershell prompt</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!133.entry</link><description>&lt;p&gt;VS.NET installs a shortcut that, when invoked, sets the necessary environment variables you need to access the command line tools that comes with VS and the .NET and brings up a command prompt. The shortcut leads to a batch file located in the VS install directory, called vsvars32.bat.

&lt;p&gt;A lot of developers want this environment set also when working in Powershell. Unfortunately, merely calling this batch file from inside Powershell won't work. The only way to run a batch file from Powershell is by invoking an instance of &lt;tt&gt;cmd.exe&lt;/tt&gt; (or &lt;tt&gt;${env:COMSPEC}&lt;/tt&gt; and passing it the path of the batch file. This obviously runs in its own process, and when this process exits, its environment will not be propagated to the process that called it (Powershell). 

&lt;p&gt;There are several ways to get around this. You can, if you're not as lazy as I am, rewrite the vsvars32.bat file to a Powershell script and dotsource it on startup. Another way would be to first start up the VS command prompt by clicking on the shortcut, and then invoking Powershell manually from the prompt. I suspect a lot of people do the latter.

&lt;p&gt;Personally, I've created my own shortcut that targets the following command line:

&lt;p&gt;&lt;tt&gt;cmd.exe /k &amp;quot;D:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat&amp;quot; &amp;amp;&amp;amp; powershell.exe&lt;/tt&gt;

&lt;p&gt;The &lt;tt&gt;/k&lt;/tt&gt; argument to &lt;tt&gt;cmd.exe&lt;/tt&gt; tells it to leave the command prompt open after executing the command that follows. &lt;tt&gt;&amp;amp;&amp;amp;&lt;/tt&gt;  is used to provide more than one command for &lt;tt&gt;cmd.exe&lt;/tt&gt; to run.

&lt;p&gt;When clicked, this shortcut leaves me with a Powershell prompt that has all the necessary command line utilities in my &lt;tt&gt;${env:PATH}&lt;/tt&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1612417020300539472&amp;page=RSS%3a+Setting+the+.NET+environment+for+a+Powershell+prompt&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=arildf.spaces.live.com&amp;amp;GT1=arildf"&gt;</description><comments>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!133.entry#comment</comments><guid isPermaLink="true">http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!133.entry</guid><pubDate>Fri, 07 Jul 2006 01:51:00 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://arildf.spaces.live.com/blog/cns!E99F8B43533149B0!133/comments/feed.rss</wfw:commentRss><wfw:comment>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!133.entry#comment</wfw:comment><dcterms:modified>2006-07-07T01:51:00Z</dcterms:modified></item><item><title>Powershell script blocks as .NET event handlers</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!127.entry</link><description>&lt;p&gt;Scott Hanselman posts  an &lt;a href="http://www.hanselman.com/blog/Trackback.aspx?guid=c1e7bf82-a698-4d34-8385-85fe6c0792da"&gt;interesting  script&lt;/a&gt; where he uses the NSvn library (the .NET wrapper library for Subversion we wrote for AnkhSVN) directly from Powershell to either checkout from a Subversion repository or update an existing working copy.  This is a great way to use NSvn and one we definitely didn’t have in mind when writing it.
&lt;p&gt;He also asks:  &lt;span style="color:black;font-size:10"&gt;“How do you do a delegate from within PowerShell if a .NET Assembly needs a delegate with a certain signature? This library will call me back with status updates I'd like to broker to write-progress.”
&lt;/span&gt;&lt;p&gt;NSvn’s NSvn.Core.Client class has an event called Notification, which is raised for every notification callback we get from the underlying Subversion C library. Subversion calls back for various reasons, including whenever a file has been downloaded as part of an update operation (in Subversion, a checkout is really just a special case of an update where the working copy has none of the files). In the Notification event, the &lt;span style="color:black;font-family:Courier New;font-size:10"&gt;NotificationEventArgs&lt;/span&gt; object’s &lt;span style="color:black;font-family:Courier New;font-size:10"&gt;Path&lt;/span&gt; property contains the path to the file or directory that has been updated, while the .Action property indicates what kind of operation has been performed against the path.  will usually contain &lt;span style="color:black;font-family:Courier New;font-size:10"&gt;NotifyAction.UpdateUpdate&lt;/span&gt; or &lt;span style="color:black;font-family:Courier New;font-size:10"&gt;NotifyAction.UpdateAdd&lt;/span&gt; (in the case of a checkout, all callbacks will be of &lt;span style="color:black;font-family:Courier New;font-size:10"&gt;the NotifyAction.UpdateAdd&lt;/span&gt; type). See &lt;a href="http://ankhsvn.com/svn/finalproject/trunk/src/NSvn.Core/svnenums.h"&gt;here&lt;/a&gt; for a listing of the various action types.
&lt;p&gt;Now, the question is, how does one consume this event from a Powershell script? Powershell supports anonymous functions called script blocks. These are roughly equivalent to C#’s anonymous delegates. Script blocks can be stored in a variable and invoked at any given time using the &amp;amp; operator:
&lt;blockquote&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $helloworld = { write-host &amp;quot;Hello world&amp;quot; }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; &amp;amp; $helloworld
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;Hello world
&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;It turns out that a script block can be cast to any arbitrary delegate and used as an event handler:
&lt;blockquote&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $handler = [System.EventHandler]{ write-host &amp;quot;Hello world&amp;quot; }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $handler.GetType().FullName
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;System.EventHandler 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $handler.Invoke($null, [System.EventArgs]::Empty)
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;Hello world
&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;
 &lt;p&gt;In our case, we want a delegate of type NotificationDelegate (ok, not a good name for an event handler delegate, or so FXCop tells me, but anyway…), which has the following signature:
&lt;blockquote&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;public delegate void NotificationDelegate( Object sender, NotificationEventArgs args );
&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;The one thing that’s not obvious about scriptblocks as event handlers is how you get hold of the eventargs instance. The documentation does not go out of its way to tell you about it either, so I started experimenting. My first attempt looked like this:
&lt;blockquote&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $notificationcallback = [NSvn.Core.NotificationDelegate]{ param($sender, $e) write-host $e.Path }
&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;The param syntax is one of the ways you declare parameters to a regular function or script. If it worked as expected, it would have printed out the path for each item being updated or checked out. Of course, “as expected” being the operative phrase here.  $e turned out to be null.
&lt;p&gt;Another way in Powershell to get hold of arguments to a function is through the special $args array. Unfortunately, this didn’t seem to work either:
&lt;blockquote&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $event = [System.EventHandler]{  write-host &amp;quot;Args: $args&amp;quot; }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt; $event.Invoke($null, [EventArgs]::Empty)
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;Args:
&lt;/span&gt;&lt;p&gt;&lt;span style="color:black;font-family:Courier New"&gt;PS D:\tmp&amp;gt;
&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;Another Reading of The Fine Manual (why is this thing in a Word document, anyway?) finally turned up an example, in which they use the $_ special variable to get hold of the EventArgs instance passed as a second parameter to all (most?) .NET events. This seems like a weird choice to me, $_ is generally used to hold the “current” object in a pipeline. Why did they overload it like this? To make things even worse, the sender argument is available in another special variable called $this. Why “$this”? It’s not like the usage in any way resembles the way the this keyword is used in other languages.
&lt;p&gt;Anyway, armed with this hard-won knowledge, rewriting Scott’s script to “broker” the notification events to Write-Progress proves to be rather simple.  This is the revised script:
&lt;pre&gt;    
  param ([&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;]&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnurl&lt;/span&gt;&lt;span style="color:#000000"&gt;       &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;read-host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Please specify the path to SVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;),
        [&lt;/span&gt;&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;&lt;span style="color:#000000"&gt;]&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnlocalpath&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;read-host&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Please specify the local path&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;) 
        )

    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; ([System.IO.Path]::IsPathRooted(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnlocalpath&lt;/span&gt;&lt;span style="color:#000000"&gt;) &lt;/span&gt;&lt;span style="color:#0000FF"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$false&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    {
        throw &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Please specific a local absolute path&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;
    }
    
    [System.Reflection.Assembly]::LoadFrom((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;join-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;$env:PROGRAMFILES\AnkhSVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;childPath&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Common.dll))
    [System.Reflection.Assembly]::LoadFrom((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;join-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;$env:PROGRAMFILES\AnkhSVN&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;childPath&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.dll))
    
    
    
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;new-object&lt;/span&gt;&lt;span style="color:#000000"&gt; NSvn.Core.Client
    
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:notificationcallback&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;=&lt;/span&gt;&lt;span style="color:#000000"&gt; [NSvn.Core.NotificationDelegate]{
        &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;Write-Progress&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;status&lt;/span&gt;&lt;span style="color:#000000"&gt; (&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;{0}: {1}&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;f&lt;/span&gt;&lt;span style="color:#000000"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$_&lt;/span&gt;&lt;span style="color:#000000"&gt;.Action, &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$_&lt;/span&gt;&lt;span style="color:#000000"&gt;.Path)) &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;activity&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Updating Working Copy&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;
    }
    
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.add_Notification(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$notificationcallback&lt;/span&gt;&lt;span style="color:#000000"&gt;)    
        
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.AuthBaton.Add( [NSvn.Core.AuthenticationProvider]::GetWindowsSimpleProvider() )
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;if&lt;/span&gt;&lt;span style="color:#000000"&gt; ((&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;test-Path&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnlocalpath&lt;/span&gt;&lt;span style="color:#000000"&gt;) &lt;/span&gt;&lt;span style="color:#0000FF"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$true&lt;/span&gt;&lt;span style="color:#000000"&gt; )
    {
        &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;write-progress&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;status&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Updating from $svnurl&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;activity&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Updating Working Copy&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.Update(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnlocalpath&lt;/span&gt;&lt;span style="color:#000000"&gt;, [NSvn.Core.Revision]::Head, &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$true&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    }
    &lt;/span&gt;&lt;span style="color:#0000FF"&gt;else&lt;/span&gt;&lt;span style="color:#000000"&gt;
    {
        &lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;write-progress&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;status&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Checkout from $svnurl&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000000"&gt;-&lt;/span&gt;&lt;span style="color:#FFA500;text-decoration:underline"&gt;activity&lt;/span&gt;&lt;span style="color:#000000"&gt; &lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080"&gt;Updating Working Copy&lt;/span&gt;&lt;span style="color:#000080"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000"&gt;
        &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$PRIVATE:svnclient&lt;/span&gt;&lt;span style="color:#000000"&gt;.Checkout(&lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnurl&lt;/span&gt;&lt;span style="color:#000000"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$svnlocalpath&lt;/span&gt;&lt;span style="color:#000000"&gt;, [NSvn.Core.Revision]::Head, &lt;/span&gt;&lt;span style="color:#0000FF"&gt;$true&lt;/span&gt;&lt;span style="color:#000000"&gt;)
    }
&lt;/span&gt;&lt;/pre&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-1612417020300539472&amp;page=RSS%3a+Powershell+script+blocks+as+.NET+event+handlers&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=arildf.spaces.live.com&amp;amp;GT1=arildf"&gt;</description><comments>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!127.entry#comment</comments><guid isPermaLink="true">http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!127.entry</guid><pubDate>Mon, 03 Jul 2006 21:31:54 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://arildf.spaces.live.com/blog/cns!E99F8B43533149B0!127/comments/feed.rss</wfw:commentRss><wfw:comment>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!127.entry#comment</wfw:comment><dcterms:modified>2006-07-03T21:31:54Z</dcterms:modified></item><item><title>SVN Tab Expansion for Windows Powershell</title><link>http://arildf.spaces.live.com/Blog/cns!E99F8B43533149B0!109.entry</link><description>&lt;p&gt;Windows Powershell allows the user to customize the behavior of TAB expansion/completion  on the command line by replacing the default TabExpansion function.
&lt;p&gt;The following is a Powershell script that adds TAB completion for &lt;span style="font-family:Courier New"&gt;svn.exe&lt;/span&gt; subcommands and their associated options. It generates the subcommand list and the association between subcommands and options by parsing the output from &lt;span style="font-family:Courier New"&gt;svn help&lt;/span&gt;, so it should stay up to date for a while (unless the &lt;span style="font-family:Courier New"&gt;svn help&lt;/span&gt; output format changes drastically). The very first time it's invoked, it will take a while (20-30 seconds) for it to generate the mapping, but subsequent runs will reuse a cached version in &lt;span style="font-family:Courier New"&gt;${env:TEMP}\svncompletion.ps1&lt;/span&gt;.
&lt;p&gt;The script contains both the default tab expansion provided by the shell (for paths, functions and cmdlets) as well as my SVN completion, so if you haven't made any changes to the default (and if you have, you're probably capable of figuring out how to merge it with your own anyway) you can install it as follows:
&lt;ul&gt;&lt;li&gt;&lt;div&gt;Save it somewhere as &lt;span style="font-family:Courier New"&gt;TabExpansion.ps1&lt;/span&gt;
			&lt;/div&gt;&lt;li&gt;&lt;div&gt;Dotsource it at startup by adding the following line &lt;span style="font-family:Courier New"&gt;to My Documents\PSConfiguration\profile.ps1:&lt;/span&gt;
			&lt;/div&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;
 &lt;/blockquote&gt;&lt;p&gt;&lt;span style="font-family:Courier New"&gt;. Somewhere\TabExpansion.ps1&lt;/span&gt;
	&lt;blockquote&gt;&lt;p&gt;
 &lt;ul&gt;&lt;li&gt;&lt;div&gt;Ensure svn.exe is somewhere in your &lt;span style="font-family:Courier New"&gt;${env:PATH}
&lt;/span&gt;&lt;/div&gt;&lt;li&gt;&lt;div&gt;Start a new Powershell instance
&lt;/div&gt;&lt;li&gt;&lt;div&gt;Type &lt;span style="font-family:Courier New"&gt;svn c[TAB]&lt;/span&gt; - this should force the mapping cache to be generated and it should eventually complete it as &lt;span style="font-family:Courier New"&gt;svn cat&lt;/span&gt;. Subsequent TABs will cycle through all commands matching c*.
&lt;/div&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;Completion of options is triggered by the pattern &lt;span style="font-family:Courier New"&gt;svn command -&lt;/span&gt;, where TAB will cycle through the options appropriate for that particular command.
&lt;p&gt;To refresh the cache (for example, when a new version of SVN introduces new commands), you can either delete the &lt;span style="font-family:Courier New"&gt;${env:TEMP}\svncompletion.ps1&lt;/span&gt; file or do &lt;span style="font-family:Courier New"&gt;&amp;quot;CreateSvnCompletion &amp;gt; ${env:TEMP}\svncompletion.ps1&lt;/span&gt;&amp;quot;
&lt;p&gt;Keep in mind that for this to work, execution of scripts has to be allowed in the shell (it's not allowed by default). This can be done by invoking the command &lt;span style="font-family:Courier New"&gt;set-executionpolicy remotesigned&lt;/span&gt; (see &lt;span style="font-family:Courier New"&gt;help about_signing&lt;/span&gt; for more information).
&lt;p&gt;Enjoy:
&lt;p&gt;
 &lt;span style="font-family:Lucida Console"&gt;&lt;p&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# This function creates a .ps1 file that will generate a hash of all commands and their associated options.
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:cornflowerblue"&gt;function&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;CreateSvnCompletion&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;{
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# First get all commands with aliases by parsing the output of svn help.
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;strong&gt;$help&lt;/strong&gt; =  &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;svn&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;help&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;strong&gt;$svncmds&lt;/strong&gt; = &lt;strong&gt;$help&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;where&lt;/span&gt;&lt;span style="color:indianred"&gt; { &lt;strong&gt;$_&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;match &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'^&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;s&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;(&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;w&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;)(&lt;/span&gt;&lt;span style="color:royalblue"&gt;?&lt;/span&gt;&lt;span style="color:chocolate"&gt;:\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;s&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:indianred"&gt;((.&lt;/span&gt;&lt;span style="color:chocolate"&gt;*&lt;/span&gt;&lt;span style="color:indianred"&gt;)&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:indianred"&gt;))&lt;/span&gt;&lt;span style="color:royalblue"&gt;?&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt; } &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;`&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:royalblue"&gt;foreach&lt;/span&gt;&lt;span style="color:indianred"&gt; { 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;1&lt;/strong&gt;]; 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            if (&lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;2&lt;/strong&gt;])
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;2&lt;/strong&gt;].&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;Split&lt;/span&gt;&lt;span style="color:indianred"&gt;(&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;, &lt;/span&gt;&lt;span style="color:#a31515"&gt;[&lt;strong&gt;System.StringSplitOptions&lt;/strong&gt;]&lt;/span&gt;&lt;span style="color:chocolate"&gt;::&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;RemoveEmptyEntries&lt;/span&gt;&lt;span style="color:indianred"&gt;) 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# now build a hash of all their options by parsing the output of svn help for that command
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;strong&gt;$svncmdoptions&lt;/strong&gt; = @{}
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:royalblue"&gt;foreach&lt;/span&gt;&lt;span style="color:indianred"&gt;( &lt;strong&gt;$cmd&lt;/strong&gt; in &lt;strong&gt;$svncmds&lt;/strong&gt; )
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;strong&gt;$svncmdoptions&lt;/strong&gt;[&lt;strong&gt;$cmd&lt;/strong&gt;] = &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;svn&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;help&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$cmd&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;where&lt;/span&gt;&lt;span style="color:indianred"&gt; { &lt;strong&gt;$_&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;match &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'^&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;s&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;(&lt;/span&gt;&lt;span style="color:chocolate"&gt;-+\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;w&lt;/span&gt;&lt;span style="color:indianred"&gt;[&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;w&lt;/span&gt;&lt;span style="color:chocolate"&gt;\-&lt;/span&gt;&lt;span style="color:indianred"&gt;]&lt;/span&gt;&lt;span style="color:chocolate"&gt;*&lt;/span&gt;&lt;span style="color:indianred"&gt;)(&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;s&lt;/span&gt;&lt;span style="color:chocolate"&gt;+\&lt;/span&gt;&lt;span style="color:indianred"&gt;[(.&lt;/span&gt;&lt;span style="color:chocolate"&gt;*&lt;/span&gt;&lt;span style="color:royalblue"&gt;?&lt;/span&gt;&lt;span style="color:indianred"&gt;)&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:indianred"&gt;])&lt;/span&gt;&lt;span style="color:royalblue"&gt;?&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt; } &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|`&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:royalblue"&gt;foreach&lt;/span&gt;&lt;span style="color:indianred"&gt; { 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;1&lt;/strong&gt;]; 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# More than one option for the same (long option)?
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                if (&lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;3&lt;/strong&gt;])
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                    &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;3&lt;/strong&gt;]
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Now output a string that will recreate the hash
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;&lt;strong&gt;$svncmdhash&lt;/strong&gt;=@{&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;``'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;strong&gt;$svncmds&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;foreach&lt;/span&gt;&lt;span style="color:indianred"&gt; { 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;strong&gt;$opts&lt;/strong&gt; = (&lt;strong&gt;$svncmdoptions&lt;/strong&gt;[&lt;strong&gt;$_&lt;/strong&gt;] &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;foreach&lt;/span&gt;&lt;span style="color:indianred"&gt;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;`&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;{&lt;strong&gt;0&lt;/strong&gt;}&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;`&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;f &lt;strong&gt;$_&lt;/strong&gt;})
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;`&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;&lt;strong&gt;$_&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;`&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;=&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:#a31515"&gt;[&lt;strong&gt;System.String&lt;/strong&gt;]&lt;/span&gt;&lt;span style="color:chocolate"&gt;::&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;Join&lt;/span&gt;&lt;span style="color:indianred"&gt;(&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;, &lt;strong&gt;$opts&lt;/strong&gt;) &lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;;``&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;p&gt;
 &lt;span style="font-family:Lucida Console"&gt;&lt;strong&gt;&lt;p&gt;&lt;span style="color:mediumseagreen"&gt;# this is the default TabExpansion function (can be obtained by doing &amp;quot;get-content function:TabCompletion&amp;quot;)
&lt;/span&gt;&lt;p&gt;&lt;span style="color:mediumseagreen"&gt;# with the SVN completion stuff added.
&lt;/span&gt;&lt;p&gt;&lt;span style="color:mediumseagreen"&gt;# The begin and process blocks have been added.
&lt;/span&gt;&lt;/strong&gt;&lt;p&gt;&lt;span style="color:cornflowerblue"&gt;function&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;TabExpansion&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;{
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;param&lt;/span&gt;&lt;span style="color:indianred"&gt;(&lt;strong&gt;$line&lt;/strong&gt;, &lt;strong&gt;$lastWord&lt;/strong&gt;)
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    begin
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Has the completion file already been generated?
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;strong&gt;$completionfile&lt;/strong&gt; = &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;${&lt;strong&gt;env&lt;/strong&gt;:&lt;strong&gt;TEMP&lt;/strong&gt;}\&lt;strong&gt;svncompletion&lt;/strong&gt;.&lt;strong&gt;ps1&lt;/strong&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        if ( &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;!&lt;/span&gt;&lt;span style="color:indianred"&gt; (&lt;/span&gt;&lt;span style="color:royalblue"&gt;&lt;strong&gt;Test-Path&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$completionfile&lt;/strong&gt;) )
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Nope, create it
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;CreateSvnCompletion&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$completionfile&lt;/strong&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# And dotsource it (this will bring 
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        . &lt;strong&gt;$completionfile&lt;/strong&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    process
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Expand an SVN command?
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        if ( &lt;strong&gt;$line&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;match &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;^\&lt;strong&gt;s&lt;/strong&gt;*&lt;strong&gt;svn&lt;/strong&gt;\&lt;strong&gt;s&lt;/strong&gt;+(\&lt;strong&gt;w&lt;/strong&gt;+)$&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt; )
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;strong&gt;$pat&lt;/strong&gt; = &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;1&lt;/strong&gt;] &lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;strong&gt;$svncmdhash&lt;/strong&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;keys&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;&lt;strong&gt;Sort-Object&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;where&lt;/span&gt;&lt;span style="color:indianred"&gt; { &lt;strong&gt;$_&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;like &lt;strong&gt;$pat&lt;/strong&gt; } 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            return
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Or an SVN option to an SVN command?
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        else&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;if&lt;/span&gt;&lt;span style="color:indianred"&gt; ( &lt;strong&gt;$line&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;match &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;^\&lt;strong&gt;s&lt;/strong&gt;*&lt;strong&gt;svn&lt;/strong&gt;\&lt;strong&gt;s&lt;/strong&gt;(\&lt;strong&gt;w&lt;/strong&gt;+).*(-[-\&lt;strong&gt;w&lt;/strong&gt;]*)&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt; )
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;strong&gt;$cmd&lt;/strong&gt; = &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;1&lt;/strong&gt;]
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;strong&gt;$pat&lt;/strong&gt; = &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;2&lt;/strong&gt;] &lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;strong&gt;$svncmdhash&lt;/strong&gt;[&lt;strong&gt;$cmd&lt;/strong&gt;] &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;&lt;strong&gt;Sort-Object&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;where&lt;/span&gt;&lt;span style="color:indianred"&gt; { &lt;strong&gt;$_&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;like &lt;strong&gt;$pat&lt;/strong&gt; } 
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            return
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# This is the default function to use for tab expansion. It handles simple
&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;&lt;p&gt;        # member expansion on variables, variable name expansion and parameter completion
&lt;p&gt;        # on commands. It doesn't understand strings so strings containing ; | ( or { may
&lt;p&gt;        # cause expansion to fail.
&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;    
 &lt;span style="font-family:Lucida Console"&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;    
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        switch -regex (&lt;strong&gt;$lastWord&lt;/strong&gt;)
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;        {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Handle property and method expansion...
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:indianred"&gt;&lt;strong&gt;$&lt;/strong&gt;(&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;w&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;)&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:indianred"&gt;.(&lt;/span&gt;&lt;span style="color:chocolate"&gt;\&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;w&lt;/span&gt;&lt;span style="color:chocolate"&gt;*&lt;/span&gt;&lt;span style="color:indianred"&gt;)&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt; {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;strong&gt;$method&lt;/strong&gt; = &lt;/span&gt;&lt;span style="color:#a31515"&gt;[&lt;strong&gt;Management.Automation.PSMemberTypes&lt;/strong&gt;]&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'Method&lt;/span&gt;&lt;span style="color:indianred"&gt;,&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;CodeMethod&lt;/span&gt;&lt;span style="color:indianred"&gt;,&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;ScriptMethod&lt;/span&gt;&lt;span style="color:indianred"&gt;,&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;ParameterizedProperty'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;strong&gt;$variableName&lt;/strong&gt; = &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;1&lt;/strong&gt;]
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;strong&gt;$val&lt;/strong&gt; = &lt;/span&gt;&lt;span style="color:royalblue"&gt;&lt;strong&gt;Get-Variable&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;value &lt;strong&gt;$variableName&lt;/strong&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;strong&gt;$pat&lt;/strong&gt; = &lt;strong&gt;$matches&lt;/strong&gt;[&lt;strong&gt;2&lt;/strong&gt;] &lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:chocolate"&gt;*&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;/span&gt;&lt;span style="color:royalblue"&gt;&lt;strong&gt;Get-Member&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;inputobject &lt;strong&gt;$val&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;where&lt;/span&gt;&lt;span style="color:indianred"&gt; {&lt;strong&gt;$n&lt;/strong&gt; = &lt;strong&gt;$_&lt;/strong&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;name&lt;/span&gt;&lt;span style="color:indianred"&gt;; &lt;strong&gt;$n&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;like &lt;strong&gt;$pat&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;and &lt;strong&gt;$n&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;-&lt;/span&gt;&lt;span style="color:indianred"&gt;notmatch &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'^&lt;/span&gt;&lt;span style="color:#a31515"&gt;[&lt;strong&gt;ge&lt;/strong&gt;]&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;et_'&lt;/span&gt;&lt;span style="color:indianred"&gt;} &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;|&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:royalblue"&gt;foreach&lt;/span&gt;&lt;span style="color:indianred"&gt; {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                    if (&lt;strong&gt;$_&lt;/strong&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;MemberType&lt;/span&gt;&lt;span style="color:indianred"&gt; -band &lt;strong&gt;$method&lt;/strong&gt;)
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                    {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Return a method...
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                        &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;&lt;strong&gt;$&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$variableName&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$_&lt;/strong&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;name&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;(&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                    }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                    else {
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                        &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Return a property...
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                        &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;&lt;strong&gt;$&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$variableName&lt;/strong&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;span style="color:chocolate"&gt;+&lt;/span&gt;&lt;span style="color:indianred"&gt;
				&lt;strong&gt;$_&lt;/strong&gt;.&lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;name&lt;/span&gt;&lt;span style="color:indianred"&gt;
			&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                    }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                }
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;                &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;break&lt;/span&gt;&lt;span style="color:indianred"&gt;;
&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;p&gt;    
 &lt;span style="font-family:Lucida Console"&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:mediumseagreen"&gt;&lt;strong&gt;# Handle variable name expansion...
&lt;/strong&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="color:indianred"&gt;            &lt;/span&gt;&lt;span style="color:cornflowerblue"&gt;'&lt;/span&gt;&lt;span style="color:indianred"&gt;(.&lt;/span&gt;&lt;span style="color:chocolate"&gt;*&lt;/spa