<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Nivot Ink</title>
    <link>http://www.nivot.org/</link>
    <description>powershell, .net, asp.net, enterprise computing and babble from Microsoft MVP Oisin Grehan.</description>
    <language>en-us</language>
    <copyright>Oisin Grehan</copyright>
    <lastBuildDate>Tue, 01 Jul 2008 22:43:07 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8086.808</generator>
    <managingEditor>oising@gmail.com</managingEditor>
    <webMaster>oising@gmail.com</webMaster>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=cb3d0ce6-5acb-4257-9939-121ced333507</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,cb3d0ce6-5acb-4257-9939-121ced333507.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,cb3d0ce6-5acb-4257-9939-121ced333507.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=cb3d0ce6-5acb-4257-9939-121ced333507</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Why do such a thing? Well, if you’ve created your own aliases for commands and you
try to give someone your ps1 script file, it will not run because they have not got
the same aliases defined as you. Also, scripts that use fully-resolved names like
“Get-ChildItem” are more readable for a newcomer to PowerShell than one that is using
the unix-like “ls" alias for example. "Get-ChildItem" leads quite directly to the
MSDN documentation, but "ls" might lead you anywhere. Before you publish a script
online somewhere for the world to use, it’s important that you try to remove any aliases
and replace them with the native command names.
</p>
        <p>
Doing this kind of thing has been talked about before but it was always a very difficult
thing to do with PowerShell v1.0, what with the lack of <a href="http://en.wikipedia.org/wiki/Backus-Naur_form" target="_blank">BNF</a> documentation
describing the grammar etc. Thankfully, it's a lot easier to do with PowerShell v2.0
(currently at release CTP2) because the team has exposed the <a href="http://en.wikipedia.org/wiki/Lexical_analysis" target="_blank">Tokenizer</a> for
use in scripts. There's been suprisingly little use of it so far, so I figured I'd
start the ball rolling with a series of articles based around it. So, let's look at
an example script that uses aliases and put it through the meat grinder:
</p>
        <p>
          <a href="http://www.nivot.org/content/binary/WindowsLiveWriter/PSParserTricks1ResolveallAliasestoComman_F64B/image_2.png">
            <img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="418" alt="image" src="http://www.nivot.org/content/binary/WindowsLiveWriter/PSParserTricks1ResolveallAliasestoComman_F64B/image_thumb.png" width="640" border="0" />
          </a>
        </p>
        <p>
As you can see, it spits out the expanded script to the output stream. The informational
messages are written to the host, so they won't interfere if you redirect the output
to a file like: .\resolve-aliases.ps1 in.ps1 &gt; out.ps1
</p>
        <p>
          <strong>Here's the Resolve-Aliases.ps1 script itself:</strong>
        </p>
        <!-- Stylesheet link -->
        <link href="http://www.thecomplex.plus.com/styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" />
        <!-- Code -->
        <div class="dp-highlighter" id="hlDiv">
          <div class="bar">
          </div>
          <ol class="dp-rb">
            <li class="alt">
              <span>
                <span class="comment">#requires -version 2 </span>
                <span>  </span>
              </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="keyword">param</span>
              <span>(</span>
              <span class="variable">$filename</span>
              <span> =
$(throw </span>
              <span class="string">"need filename!"</span>
              <span>))   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$lines</span>
              <span> = </span>
              <span class="variable">$null</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$path</span>
              <span> = </span>
              <span class="builtin">Resolve-Path</span>
              <span> </span>
              <span class="variable">$filename</span>
              <span> -ErrorAction
0   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="keyword">if</span>
              <span> (</span>
              <span class="variable">$path</span>
              <span>)
{   </span>
            </li>
            <li class="">
              <span>    </span>
              <span class="variable">$lines</span>
              <span> = </span>
              <span class="builtin">Get-Content</span>
              <span> </span>
              <span class="variable">$path</span>
              <span>.path   </span>
            </li>
            <li class="alt">
              <span>} </span>
              <span class="keyword">else</span>
              <span> {   </span>
            </li>
            <li class="">
              <span>    </span>
              <span class="builtin">Write-Warning</span>
              <span> </span>
              <span class="string">"Could
not find $filename"</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>    exit   </span>
            </li>
            <li class="">
              <span>}   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="comment"># Initialize </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$parser</span>
              <span> = [system.management.automation.psparser]   </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$errors</span>
              <span> = new-object system.management.automation.psparseerror[]
0   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>do {   </span>
            </li>
            <li class="alt">
              <span>    </span>
              <span class="variable">$tokens</span>
              <span> = </span>
              <span class="variable">$parser</span>
              <span>:</span>
              <span class="symbol">:tokenize</span>
              <span>(</span>
              <span class="variable">$lines</span>
              <span>,
[ref]</span>
              <span class="variable">$errors</span>
              <span>)      </span>
            </li>
            <li class="">
              <span>    </span>
              <span class="variable">$retokenize</span>
              <span> = </span>
              <span class="variable">$false</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>       </span>
            </li>
            <li class="">
              <span>    </span>
              <span class="keyword">if</span>
              <span> (</span>
              <span class="variable">$errors</span>
              <span>.count
-gt 0) {   </span>
            </li>
            <li class="alt">
              <span>        </span>
              <span class="builtin">Write-Warning</span>
              <span> </span>
              <span class="string">"$($errors.count)
error(s) found in script."</span>
              <span>  </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="variable">$errors</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>        exit   </span>
            </li>
            <li class="">
              <span>    }   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>    </span>
              <span class="comment"># look through tokens for commands </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>    </span>
              <span class="variable">$tokens</span>
              <span> | % {   </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="keyword">if</span>
              <span> (</span>
              <span class="variable">$_</span>
              <span>.Type
-eq </span>
              <span class="string">"Command"</span>
              <span>) {   </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="variable">$name</span>
              <span> = </span>
              <span class="variable">$_</span>
              <span>.Content   </span>
            </li>
            <li class="">
              <span>               </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="comment">#
is it an alias? </span>
              <span>  </span>
            </li>
            <li class="">
              <span>            </span>
              <span class="comment">#
we use -literal here so '?' isn't treated as wildcard </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="keyword">if</span>
              <span> ((!(</span>
              <span class="variable">$name</span>
              <span> -eq </span>
              <span class="string">"."</span>
              <span>))
-and (</span>
              <span class="builtin">Test-Path</span>
              <span> -LiteralPath alias:</span>
              <span class="variable">$name</span>
              <span>))
{   </span>
            </li>
            <li class="">
              <span>                   </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="comment">#
gcm may return more than one match, so specify "alias" </span>
              <span>  </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="comment">#
filtering against name kludges the '?' alias/wildcard  </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="variable">$command</span>
              <span> =
gcm -CommandType alias </span>
              <span class="variable">$name</span>
              <span> | ? { </span>
              <span class="variable">$_</span>
              <span>.name
-eq </span>
              <span class="variable">$name</span>
              <span> }   </span>
            </li>
            <li class="">
              <span>                               </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="comment">#
resolve alias which may lead to another alias </span>
              <span>  </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="comment">#
so loop until we reach a non-alias </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>               
do {   </span>
            </li>
            <li class="">
              <span>                    </span>
              <span class="variable">$command</span>
              <span> = </span>
              <span class="builtin">Get-Command</span>
              <span> </span>
              <span class="variable">$command</span>
              <span>.definition   </span>
            </li>
            <li class="alt">
              <span>               
} </span>
              <span class="keyword">while</span>
              <span> (</span>
              <span class="variable">$command</span>
              <span>.CommandType
-eq </span>
              <span class="string">"Alias"</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>                   </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="builtin">Write-Host</span>
              <span> -NoNewline </span>
              <span class="string">"Resolved
"</span>
              <span>  </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="builtin">Write-Host</span>
              <span> -NoNewline
-ForegroundColor yellow </span>
              <span class="variable">$name</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>               
write-host -nonewline </span>
              <span class="string">" to "</span>
              <span>    </span>
            </li>
            <li class="">
              <span>               
write-host -ForegroundColor green </span>
              <span class="variable">$command</span>
              <span>.name            </span>
            </li>
            <li class="alt">
              <span>                   </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="comment">#
Use a stringbuilder to replace the alias in the line </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="comment">#
pointed to in the Token object. StringBuilder has a much </span>
              <span>  </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="comment">#
more precise Replace method than String. This allows us to </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="comment">#
replace the token with 100% confidence. </span>
              <span>  </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="variable">$sb</span>
              <span> = </span>
              <span class="builtin">New-Object</span>
              <span> text.stringbuilder </span>
              <span class="variable">$lines</span>
              <span>[</span>
              <span class="variable">$_</span>
              <span>.startline
- 1]   </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="variable">$sb</span>
              <span> = </span>
              <span class="variable">$sb</span>
              <span>.replace(</span>
              <span class="variable">$name</span>
              <span>, </span>
              <span class="variable">$command</span>
              <span>.Name, </span>
              <span class="variable">$_</span>
              <span>.startcolumn
- 1, </span>
              <span class="variable">$_</span>
              <span>.length)   </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="variable">$lines</span>
              <span>[</span>
              <span class="variable">$_</span>
              <span>.startline
- 1] = </span>
              <span class="variable">$sb</span>
              <span>.tostring()   </span>
            </li>
            <li class="alt">
              <span>                   </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="comment">#
now that we've replaced a token, the script needs to be reparsed </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>                </span>
              <span class="comment">#
as offsets have changed on this line.  </span>
              <span>  </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="variable">$retokenize</span>
              <span> = </span>
              <span class="variable">$true</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>                   </span>
            </li>
            <li class="">
              <span>                </span>
              <span class="comment">#
break out of pipeline, (not 'do' loop) </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>               
continue;   </span>
            </li>
            <li class="">
              <span>            }   </span>
            </li>
            <li class="alt">
              <span>        }   </span>
            </li>
            <li class="">
              <span>    }   </span>
            </li>
            <li class="alt">
              <span>} </span>
              <span class="keyword">while</span>
              <span> (</span>
              <span class="variable">$retokenize</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="builtin">Write-Host</span>
              <span> </span>
              <span class="string">""</span>
              <span> </span>
              <span class="comment">#
blank line </span>
              <span>  </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="comment"># output our modified script </span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$lines</span>
              <span>  </span>
            </li>
          </ol>
        </div>
        <p>
        </p>
        <p>
        </p>
        <p>
Of course, this requires PowerShell v2.0 CTP2. Next in the series, I'll give you a
script to check your ps1 scripts for backwards compatibility against PowerShell 1.0.
That should be handy for those naughty admins out there who despite all the warnings
have installed v2 in production. ;-)
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=cb3d0ce6-5acb-4257-9939-121ced333507" />
      </body>
      <title>PSParser Tricks #1 &amp;ndash; Resolve all Aliases to definitions in a script</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,cb3d0ce6-5acb-4257-9939-121ced333507.aspx</guid>
      <link>http://www.nivot.org/2008/07/01/PSParserTricks1NdashResolveAllAliasesToDefinitionsInAScript.aspx</link>
      <pubDate>Tue, 01 Jul 2008 22:43:07 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Why do such a thing? Well, if you’ve created your own aliases for commands and you
try to give someone your ps1 script file, it will not run because they have not got
the same aliases defined as you. Also, scripts that use fully-resolved names like
“Get-ChildItem” are more readable for a newcomer to PowerShell than one that is using
the unix-like “ls" alias for example. "Get-ChildItem" leads quite directly to the
MSDN documentation, but "ls" might lead you anywhere. Before you publish a script
online somewhere for the world to use, it’s important that you try to remove any aliases
and replace them with the native command names.
&lt;/p&gt;
&lt;p&gt;
Doing this kind of thing has been talked about before but it was always a very difficult
thing to do with PowerShell v1.0, what with the lack of &lt;a href="http://en.wikipedia.org/wiki/Backus-Naur_form" target="_blank"&gt;BNF&lt;/a&gt; documentation
describing the grammar etc. Thankfully, it's a lot easier to do with PowerShell v2.0
(currently at release CTP2) because the team has exposed the &lt;a href="http://en.wikipedia.org/wiki/Lexical_analysis" target="_blank"&gt;Tokenizer&lt;/a&gt; for
use in scripts. There's been suprisingly little use of it so far, so I figured I'd
start the ball rolling with a series of articles based around it. So, let's look at
an example script that uses aliases and put it through the meat grinder:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.nivot.org/content/binary/WindowsLiveWriter/PSParserTricks1ResolveallAliasestoComman_F64B/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="418" alt="image" src="http://www.nivot.org/content/binary/WindowsLiveWriter/PSParserTricks1ResolveallAliasestoComman_F64B/image_thumb.png" width="640" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
As you can see, it spits out the expanded script to the output stream. The informational
messages are written to the host, so they won't interfere if you redirect the output
to a file like: .\resolve-aliases.ps1 in.ps1 &amp;gt; out.ps1
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Here's the Resolve-Aliases.ps1 script itself:&lt;/strong&gt;
&lt;/p&gt;
&lt;!-- Stylesheet link --&gt;
&lt;link href="http://www.thecomplex.plus.com/styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet"&gt;
&lt;!-- Code --&gt;
&lt;div class="dp-highlighter" id="hlDiv"&gt;
&lt;div class="bar"&gt;
&lt;/div&gt;
&lt;ol class="dp-rb"&gt;
&lt;li class="alt"&gt;
&lt;span&gt;&lt;span class="comment"&gt;#requires -version 2 &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="keyword"&gt;param&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$filename&lt;/span&gt;&lt;span&gt; =
$(throw &lt;/span&gt;&lt;span class="string"&gt;"need filename!"&lt;/span&gt;&lt;span&gt;))&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="variable"&gt;$lines&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="variable"&gt;$null&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="variable"&gt;$path&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="builtin"&gt;Resolve-Path&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable"&gt;$filename&lt;/span&gt;&lt;span&gt; -ErrorAction
0&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="variable"&gt;$path&lt;/span&gt;&lt;span&gt;)
{&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$lines&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="builtin"&gt;Get-Content&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable"&gt;$path&lt;/span&gt;&lt;span&gt;.path&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;} &lt;/span&gt;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt; {&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="builtin"&gt;Write-Warning&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;"Could
not find $filename"&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;}&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="comment"&gt;# Initialize &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="variable"&gt;$parser&lt;/span&gt;&lt;span&gt; = [system.management.automation.psparser]&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="variable"&gt;$errors&lt;/span&gt;&lt;span&gt; = new-object system.management.automation.psparseerror[]
0&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;do {&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$tokens&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="variable"&gt;$parser&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class="symbol"&gt;:tokenize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class="variable"&gt;$lines&lt;/span&gt;&lt;span&gt;,
[ref]&lt;/span&gt;&lt;span class="variable"&gt;$errors&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$retokenize&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="variable"&gt;$false&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="variable"&gt;$errors&lt;/span&gt;&lt;span&gt;.count
-gt 0) {&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="builtin"&gt;Write-Warning&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;"$($errors.count)
error(s) found in script."&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$errors&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;# look through tokens for commands &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$tokens&lt;/span&gt;&lt;span&gt; | % {&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.Type
-eq &lt;/span&gt;&lt;span class="string"&gt;"Command"&lt;/span&gt;&lt;span&gt;) {&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.Content&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
is it an alias? &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
we use -literal here so '?' isn't treated as wildcard &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; ((!(&lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt; -eq &lt;/span&gt;&lt;span class="string"&gt;"."&lt;/span&gt;&lt;span&gt;))
-and (&lt;/span&gt;&lt;span class="builtin"&gt;Test-Path&lt;/span&gt;&lt;span&gt; -LiteralPath alias:&lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt;))
{&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
gcm may return more than one match, so specify "alias" &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
filtering against name kludges the '?' alias/wildcard&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$command&lt;/span&gt;&lt;span&gt; =
gcm -CommandType alias &lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt; | ? { &lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.name
-eq &lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt; }&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
resolve alias which may lead to another alias &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
so loop until we reach a non-alias &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
do {&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$command&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="builtin"&gt;Get-Command&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="variable"&gt;$command&lt;/span&gt;&lt;span&gt;.definition&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
} &lt;/span&gt;&lt;span class="keyword"&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="variable"&gt;$command&lt;/span&gt;&lt;span&gt;.CommandType
-eq &lt;/span&gt;&lt;span class="string"&gt;"Alias"&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="builtin"&gt;Write-Host&lt;/span&gt;&lt;span&gt; -NoNewline &lt;/span&gt;&lt;span class="string"&gt;"Resolved
"&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="builtin"&gt;Write-Host&lt;/span&gt;&lt;span&gt; -NoNewline
-ForegroundColor yellow &lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
write-host -nonewline &lt;/span&gt;&lt;span class="string"&gt;" to "&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
write-host -ForegroundColor green &lt;/span&gt;&lt;span class="variable"&gt;$command&lt;/span&gt;&lt;span&gt;.name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
Use a stringbuilder to replace the alias in the line &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
pointed to in the Token object. StringBuilder has a much &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
more precise Replace method than String. This allows us to &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
replace the token with 100% confidence. &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$sb&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="builtin"&gt;New-Object&lt;/span&gt;&lt;span&gt; text.stringbuilder &lt;/span&gt;&lt;span class="variable"&gt;$lines&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.startline
- 1]&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$sb&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="variable"&gt;$sb&lt;/span&gt;&lt;span&gt;.replace(&lt;/span&gt;&lt;span class="variable"&gt;$name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class="variable"&gt;$command&lt;/span&gt;&lt;span&gt;.Name, &lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.startcolumn
- 1, &lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.length)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$lines&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span class="variable"&gt;$_&lt;/span&gt;&lt;span&gt;.startline
- 1] = &lt;/span&gt;&lt;span class="variable"&gt;$sb&lt;/span&gt;&lt;span&gt;.tostring()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
now that we've replaced a token, the script needs to be reparsed &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
as offsets have changed on this line.&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="variable"&gt;$retokenize&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class="variable"&gt;$true&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="comment"&gt;#
break out of pipeline, (not 'do' loop) &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
continue;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;} &lt;/span&gt;&lt;span class="keyword"&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="variable"&gt;$retokenize&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="builtin"&gt;Write-Host&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;""&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="comment"&gt;#
blank line &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class="alt"&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="comment"&gt;# output our modified script &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class="variable"&gt;$lines&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Of course, this requires PowerShell v2.0 CTP2. Next in the series, I'll give you a
script to check your ps1 scripts for backwards compatibility against PowerShell 1.0.
That should be handy for those naughty admins out there who despite all the warnings
have installed v2 in production. ;-)
&lt;/p&gt;
&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=cb3d0ce6-5acb-4257-9939-121ced333507" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,cb3d0ce6-5acb-4257-9939-121ced333507.aspx</comments>
      <category>.NET</category>
      <category>Monad</category>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=59d45a0b-5cd5-4996-8015-ed24918608c4</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,59d45a0b-5cd5-4996-8015-ed24918608c4.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,59d45a0b-5cd5-4996-8015-ed24918608c4.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=59d45a0b-5cd5-4996-8015-ed24918608c4</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Someone on a private mailing list I'm on lamented the problem with powershell's '&gt;'
redirection operator defaulting inflexibly to use unicode for encoding the output
file. This is not very compatible for NT's ancient console subsystem which works best
with ASCII data. Fortunately, there's an easy workaround to fix this:
</p>
        <p>
Due to the magic of command discovery and the fact that &gt; really does use out-file,
you can "fix" this by placing the following in your $profile:<br /><br /><font face="courier ">function out-file($FilePath, $Encoding, [switch]$Append) {<br />
$input | microsoft.powershell.utility\out-file $filepath -encoding ascii `<br />
     -append:$append<br />
} </font></p>
        <p>
          <br />
From now on, &gt; will be forced to use ASCII encoding. This works because functions
have higher precedence than built-in commands in powershell's command discovery search. 
</p>
        <p>
          <strong>UPDATE: </strong>Rather annoyingly, I'm informed that this particular workaround
doesn't work on v1.0 of PowerShell. I tested the above on v2.0CTP2 only. Doh.
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=59d45a0b-5cd5-4996-8015-ed24918608c4" />
      </body>
      <title>Workaround to force PowerShell redirection operator to use ASCII encoding</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,59d45a0b-5cd5-4996-8015-ed24918608c4.aspx</guid>
      <link>http://www.nivot.org/2008/06/27/WorkaroundToForcePowerShellRedirectionOperatorToUseASCIIEncoding.aspx</link>
      <pubDate>Fri, 27 Jun 2008 16:03:07 GMT</pubDate>
      <description>&lt;p&gt;
Someone on a private mailing list I'm on lamented the problem with powershell's '&amp;gt;'
redirection operator defaulting inflexibly to use unicode for encoding the output
file. This is not very compatible for NT's ancient console subsystem which works best
with ASCII data. Fortunately, there's an easy workaround to fix this:
&lt;/p&gt;
&lt;p&gt;
Due to the magic of command discovery and the fact that &amp;gt; really does use out-file,
you can "fix" this by placing the following in your $profile:&lt;br&gt;
&lt;br&gt;
&lt;font face="courier "&gt;function out-file($FilePath, $Encoding, [switch]$Append) {&lt;br&gt;
$input | microsoft.powershell.utility\out-file $filepath -encoding ascii `&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -append:$append&lt;br&gt;
} &lt;/font&gt; 
&lt;p&gt;
&lt;br&gt;
From now on, &amp;gt; will be forced to use ASCII encoding. This works because functions
have higher precedence than built-in commands in powershell's command discovery search. 
&lt;p&gt;
&lt;strong&gt;UPDATE: &lt;/strong&gt;Rather annoyingly, I'm informed that this particular workaround
doesn't work on v1.0 of PowerShell. I tested the above on v2.0CTP2 only. Doh.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=59d45a0b-5cd5-4996-8015-ed24918608c4" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,59d45a0b-5cd5-4996-8015-ed24918608c4.aspx</comments>
      <category>.NET</category>
      <category>Monad</category>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=b9a039b8-48bd-4dac-af9b-e78f543447e8</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,b9a039b8-48bd-4dac-af9b-e78f543447e8.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,b9a039b8-48bd-4dac-af9b-e78f543447e8.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=b9a039b8-48bd-4dac-af9b-e78f543447e8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Just another quick-fix post for any readers’ benefit. I have been using MOSS on Windows
2008 Server on VMWare for a while now and the display has always been sluggish and
choppy even though VMWare tools is up-to-date and installed. I decided to take a quick
peek at the display properties to see if perhaps hardware acceleration is off or something
like that and I noticed that the display driver was “Standard VGA Display.” I thought
to myself, “Shouldn’t that be a VMWare display driver?” so I clicked properties and
drilled down to the “Update Driver…” dialog. Clickety-click and hey presto, it finds
a newer driver, namely “VMWare SVGA II” and installs it. Display is now much better.
On other guest OS’s like Win 2003 etc, VMWare tools installation updated the driver
for you, but this time it didn’t. Not sure why. 
</p>
        <p>
          <strike>One remaining problem I have is that the mouse is dodgy and sometimes the
host mouse pointer gets de-synced with the guest’s. Anyone got that problem?</strike> 
Fixed by starting device manager and going through nearly the same drill as the display
driver. I manually chose “VMWare Pointing Device” and rebooted, replacing the default
ps/2 mouse driver.
</p>
        <p>
          <a href="http://www.nivot.org/content/binary/WindowsLiveWriter/VMWareandWindowsServer2008ChoppyDisplayP_C938/image_2.png">
            <img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 8px 0px 0px 8px; border-right-width: 0px" height="196" alt="image" src="http://www.nivot.org/content/binary/WindowsLiveWriter/VMWareandWindowsServer2008ChoppyDisplayP_C938/image_thumb.png" width="244" align="right" border="0" />
          </a>
        </p>
        <p>
          <strong>Update: </strong>
        </p>
        <p>
After I rebooted, it was still a little sluggish. Then I remembered that by default,
hardware acceleration is only at one notch up. So, push it up to full!
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=b9a039b8-48bd-4dac-af9b-e78f543447e8" />
      </body>
      <title>VMWare and Windows Server 2008 &amp;ndash; Choppy Display Performance</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,b9a039b8-48bd-4dac-af9b-e78f543447e8.aspx</guid>
      <link>http://www.nivot.org/2008/06/25/VMWareAndWindowsServer2008NdashChoppyDisplayPerformance.aspx</link>
      <pubDate>Wed, 25 Jun 2008 18:18:30 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Just another quick-fix post for any readers’ benefit. I have been using MOSS on Windows
2008 Server on VMWare for a while now and the display has always been sluggish and
choppy even though VMWare tools is up-to-date and installed. I decided to take a quick
peek at the display properties to see if perhaps hardware acceleration is off or something
like that and I noticed that the display driver was “Standard VGA Display.” I thought
to myself, “Shouldn’t that be a VMWare display driver?” so I clicked properties and
drilled down to the “Update Driver…” dialog. Clickety-click and hey presto, it finds
a newer driver, namely “VMWare SVGA II” and installs it. Display is now much better.
On other guest OS’s like Win 2003 etc, VMWare tools installation updated the driver
for you, but this time it didn’t. Not sure why. 
&lt;/p&gt;
&lt;p&gt;
&lt;strike&gt;One remaining problem I have is that the mouse is dodgy and sometimes the
host mouse pointer gets de-synced with the guest’s. Anyone got that problem?&lt;/strike&gt;&amp;nbsp;
Fixed by starting device manager and going through nearly the same drill as the display
driver. I manually chose “VMWare Pointing Device” and rebooted, replacing the default
ps/2 mouse driver.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.nivot.org/content/binary/WindowsLiveWriter/VMWareandWindowsServer2008ChoppyDisplayP_C938/image_2.png"&gt;&lt;img title="image" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 8px 0px 0px 8px; border-right-width: 0px" height="196" alt="image" src="http://www.nivot.org/content/binary/WindowsLiveWriter/VMWareandWindowsServer2008ChoppyDisplayP_C938/image_thumb.png" width="244" align="right" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update: &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
After I rebooted, it was still a little sluggish. Then I remembered that by default,
hardware acceleration is only at one notch up. So, push it up to full!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=b9a039b8-48bd-4dac-af9b-e78f543447e8" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,b9a039b8-48bd-4dac-af9b-e78f543447e8.aspx</comments>
      <category>VMWare</category>
      <category>Windows Server 2008</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=ddb76bd8-36ca-44e4-8606-45768c8bae93</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,ddb76bd8-36ca-44e4-8606-45768c8bae93.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,ddb76bd8-36ca-44e4-8606-45768c8bae93.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=ddb76bd8-36ca-44e4-8606-45768c8bae93</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.thepowershellguy.com/" target="_blank">MoW</a> poked at me, so
I guess I can’t let the crazy dutchman down:
</p>
        <p>
          <strong>How old were you when you started using computers?</strong>
        </p>
        <blockquote>
          <p>
            <em>10 or 11</em>
          </p>
        </blockquote>
        <p>
          <strong>What was your first machine?</strong>
        </p>
        <blockquote>
          <p>
            <em>An </em>
            <a href="http://en.wikipedia.org/wiki/Amstrad_CPC" target="_blank">Amstrad
CPC 464</a>
            <em>with Green screen.</em>
          </p>
        </blockquote>
        <strong>
        </strong>
        <p>
          <strong>What was the first real script you wrote?</strong>
        </p>
        <blockquote>
          <p>
            <em>I vaguely remember being delighted at having a rocket (Chr$(239)) ascend the Amstrad’s
screen when I figured out that </em>STEP –1<em> was the key in getting a for/next
loop to count backwards.</em></p>
        </blockquote>
        <p>
          <strong>What languages have you used?</strong>
        </p>
        <ul>
          <ul>
            <li>
              <em>Powershell, </em>
              <em>VBScript, JavaScript, Tcl, Perl, Batch/4NT</em>
            </li>
            <li>
Z80A, 8088/8086 (NECv20/v30) assembler 
</li>
            <li>
Basic, Turbo Pascal, Turbo C, C++, Java, C#, VB.NET</li>
          </ul>
        </ul>
        <blockquote>
          <p>
            <em>I’m a bit of a jack-of-all-trades when it comes to development. The list above
is just what I can remember ;-)</em>
          </p>
        </blockquote>
        <strong>
        </strong>
        <p>
          <strong>What was your first professional <strike>Sysadmin</strike> Developer gig?</strong>
        </p>
        <blockquote>
          <p>
            <em>After helping out a friend’s dad put together a training course for Visual Basic
3.0, I then managed to blag a job coding Ireland’s first ever major e-commerce site
using </em>
            <a href="http://docs.rinet.ru/MCIS/ch13.htm" target="_blank">
              <strong>MS
Merchant Server 1.0</strong>
            </a>
            <em> (which predated ASP 1.0) for a leading ISP.</em>
          </p>
        </blockquote>
        <strong>
        </strong>
        <p>
          <strong>If you knew then what you know now, would you have started in IT?</strong>
        </p>
        <blockquote>
          <p>
            <em>I might have started a little bit earlier even!</em>
          </p>
        </blockquote>
        <strong>
        </strong>
        <p>
          <strong>If there is one thing you learned along the way that you would tell new Sysadmins
(or Devs), what would it be?</strong>
        </p>
        <blockquote>
          <p>
            <em>Just one thing? Learn <strong>Regular Expressions</strong> as it will pay you
back ten-fold for whatever time you put into it.</em>
          </p>
        </blockquote>
        <strong>
        </strong>
        <p>
          <em>
            <strong>What is the most fun you have had scripting?</strong>
            <br />
          </em>
        </p>
        <blockquote>
          <p>
            <em>There’s only one answer here: writing extensions for PowerShell.</em>
          </p>
        </blockquote>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
This particular branch of the meme ends here as I don’t think I can tag anyone who
hasn’t been tagged already.
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=ddb76bd8-36ca-44e4-8606-45768c8bae93" />
      </body>
      <title>Dev-SysAdmin Meme</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,ddb76bd8-36ca-44e4-8606-45768c8bae93.aspx</guid>
      <link>http://www.nivot.org/2008/06/19/DevSysAdminMeme.aspx</link>
      <pubDate>Thu, 19 Jun 2008 00:31:00 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.thepowershellguy.com/" target="_blank"&gt;MoW&lt;/a&gt; poked at me, so
I guess I can’t let the crazy dutchman down:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How old were you when you started using computers?&lt;/strong&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;10 or 11&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;What was your first machine?&lt;/strong&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;An &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Amstrad_CPC" target="_blank"&gt;Amstrad
CPC 464&lt;/a&gt; &lt;em&gt;with Green screen.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt; 
&lt;p&gt;
&lt;strong&gt;What was the first real script you wrote?&lt;/strong&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I vaguely remember being delighted at having a rocket (Chr$(239)) ascend the Amstrad’s
screen when I figured out that &lt;/em&gt;STEP –1&lt;em&gt; was the key in getting a for/next
loop to count backwards.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;What languages have you used?&lt;/strong&gt; 
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Powershell, &lt;/em&gt;&lt;em&gt;VBScript, JavaScript, Tcl, Perl, Batch/4NT&lt;/em&gt; 
&lt;li&gt;
Z80A, 8088/8086 (NECv20/v30) assembler 
&lt;li&gt;
Basic, Turbo Pascal, Turbo C, C++, Java, C#, VB.NET&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I’m a bit of a jack-of-all-trades when it comes to development. The list above
is just what I can remember ;-)&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt; 
&lt;p&gt;
&lt;strong&gt;What was your first professional &lt;strike&gt;Sysadmin&lt;/strike&gt; Developer gig?&lt;/strong&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;After helping out a friend’s dad put together a training course for Visual Basic
3.0, I then managed to blag a job coding Ireland’s first ever major e-commerce site
using &lt;/em&gt;&lt;a href="http://docs.rinet.ru/MCIS/ch13.htm" target="_blank"&gt;&lt;strong&gt;MS
Merchant Server 1.0&lt;/strong&gt;&lt;/a&gt;&lt;em&gt; (which predated ASP 1.0) for a leading ISP.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt; 
&lt;p&gt;
&lt;strong&gt;If you knew then what you know now, would you have started in IT?&lt;/strong&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;I might have started a little bit earlier even!&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt; 
&lt;p&gt;
&lt;strong&gt;If there is one thing you learned along the way that you would tell new Sysadmins
(or Devs), what would it be?&lt;/strong&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;Just one thing? Learn &lt;strong&gt;Regular Expressions&lt;/strong&gt; as it will pay you
back ten-fold for whatever time you put into it.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;strong&gt;&lt;/strong&gt; 
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;What is the most fun you have had scripting?&lt;/strong&gt;
&lt;br&gt;
&lt;/em&gt; &lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;There’s only one answer here: writing extensions for PowerShell.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
This particular branch of the meme ends here as I don’t think I can tag anyone who
hasn’t been tagged already.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=ddb76bd8-36ca-44e4-8606-45768c8bae93" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,ddb76bd8-36ca-44e4-8606-45768c8bae93.aspx</comments>
      <category>General</category>
      <category>Monad</category>
      <category>PowerShell</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=0c6b37fa-8428-4360-be99-1fc5db89fb7e</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,0c6b37fa-8428-4360-be99-1fc5db89fb7e.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,0c6b37fa-8428-4360-be99-1fc5db89fb7e.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=0c6b37fa-8428-4360-be99-1fc5db89fb7e</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just a quick one for the frustrated searchers out there. If you've recently installed
the SP1 beta for Visual Studio 2008 (or just the 3.5 sp1 beta alone), and you find
that you have serious difficulty using SharePoint Designer 2007 against a remote instance
of SharePoint running in a VM (or a physical machine) that <em>doesn't</em> have the
SP1 Beta bits, you know what to do. My SPD would refuse to load the master page from
my virtualized SharePoint instance until I had installed .NET 3.5 SP1 Beta onto the
virtual machine also. Just so you know!
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=0c6b37fa-8428-4360-be99-1fc5db89fb7e" />
      </body>
      <title>Using SharePoint Designer with .NET 3.5 SP1 Beta</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,0c6b37fa-8428-4360-be99-1fc5db89fb7e.aspx</guid>
      <link>http://www.nivot.org/2008/06/12/UsingSharePointDesignerWithNET35SP1Beta.aspx</link>
      <pubDate>Thu, 12 Jun 2008 17:41:52 GMT</pubDate>
      <description>&lt;p&gt;
Just a quick one for the frustrated searchers out there. If you've recently installed
the SP1 beta for Visual Studio 2008 (or just the 3.5 sp1 beta alone), and you find
that you have serious difficulty using SharePoint Designer 2007 against a remote instance
of SharePoint running in a VM (or a physical machine) that &lt;em&gt;doesn't&lt;/em&gt; have the
SP1 Beta bits, you know what to do. My SPD would refuse to load the master page from
my virtualized SharePoint instance until I had installed .NET 3.5 SP1 Beta onto the
virtual machine also. Just so you know!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=0c6b37fa-8428-4360-be99-1fc5db89fb7e" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,0c6b37fa-8428-4360-be99-1fc5db89fb7e.aspx</comments>
      <category>.NET</category>
      <category>SharePoint</category>
      <category>SharePoint Designer</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=3c59a56a-8af3-4e47-ac11-b018a981662d</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,3c59a56a-8af3-4e47-ac11-b018a981662d.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,3c59a56a-8af3-4e47-ac11-b018a981662d.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=3c59a56a-8af3-4e47-ac11-b018a981662d</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <title>Windows Mobile PowerShell Provider</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,3c59a56a-8af3-4e47-ac11-b018a981662d.aspx</guid>
      <link>http://www.nivot.org/2008/06/06/WindowsMobilePowerShellProvider.aspx</link>
      <pubDate>Fri, 06 Jun 2008 11:00:15 GMT</pubDate>
      <description>&lt;p align="left"&gt;
In the spirit of "tidying things up," and pushing out nearly-there projects, I turned
my attention to &lt;a href="http://www.codeplex.com/PSMobile"&gt;http://www.codeplex.com/PSMobile&lt;/a&gt;.
I have a number of seriously annoying (to myself and people around me) habits, one
of which is having a hard time finding the motivation to get that last 1% bit of work
done. I am trying to &lt;strike&gt;kill&lt;/strike&gt; bludgeon that habit, and this is fruit
number #2 of that attempt at self-correction. I have some other important out of band
work that I need to complete, but I find I cannot concentrate on that until these
personal projects that have been niggling me for ages are dealt with. Anyway, lets
dispel a couple of questions with a screenshot:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.nivot.org/content/binary/psmobile-screenshot.png"&gt; 
&lt;/p&gt;
&lt;h3&gt;Requirements 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
ActiveSync 4.2 or higher (or Windows Mobile Device Centre 6.0+ on Vista) &lt;a href="http://www.microsoft.com/downloads/results.aspx?pocId=&amp;amp;freetext=activesync&amp;amp;DisplayLang=en"&gt;Download&lt;/a&gt; 
&lt;li&gt;
A Windows Mobile device (PocketPC/SmartPhone 2002, 2003, 2003SE, Windows Mobile 5,
6 or 6.1) 
&lt;li&gt;
Windows PowerShell 1.0 or 2.0 (CTP) &lt;a href="http://www.microsoft.com/downloads/results.aspx?pocId=&amp;amp;freetext=powershell&amp;amp;DisplayLang=en"&gt;Download&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Features
&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.nivot.org/content/binary/WindowsLiveWriter/WindowsMobilePowerShellProvider_C0D5/wm61-device_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 0px 20px 20px; border-left: 0px; border-bottom: 0px" height="244" alt="wm61-device" src="http://www.nivot.org/content/binary/WindowsLiveWriter/WindowsMobilePowerShellProvider_C0D5/wm61-device_thumb.png" width="184" align="right" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="left"&gt;Copy, Move, Delete items between folders on your device (including
Storage Card) with standard PowerShell Cmdlets
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;Move/Copy files to/from your device and your desktop with &lt;font face="Courier New"&gt;ConvertTo-WMFile&lt;/font&gt; and &lt;font face="Courier New"&gt;ConvertFrom-WMFile&lt;/font&gt; 
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;Get device information and manipulate and explore the registry with
a rich device object returned from &lt;font face="Courier New "&gt;Get-WMDevice &lt;/font&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;font face="Courier New"&gt;Invoke-Item&lt;/font&gt; against remote items
to or execute or trigger their associated applications 
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;&lt;font face="Courier New"&gt;Invoke-Item&lt;/font&gt; with -Local switch to
attempt to execute a remote file in the context of your local desktop (e.g. office
docs or images/videos) 
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;New "Mode" attributes specific to Windows Mobile file attributes: &lt;font face="courier new"&gt;(I)nRom,
Rom(M)odule&lt;/font&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;File/Folder objects' attributes can be modified with .Attributes
properties just like &lt;font face="Courier New"&gt;FileInfos&lt;/font&gt; etc.
&lt;/div&gt;
&lt;li&gt;
&lt;div align="left"&gt;Tab completion with MoW's PowerTab &lt;a href="http://thepowershellguy.com/blogs/posh/pages/powertab.aspx" target="_blank"&gt;Download&lt;/a&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;File Manipulation
&lt;/h3&gt;
&lt;p&gt;
A picture's worth a thousand words.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.nivot.org/content/binary/WindowsLiveWriter/WindowsMobilePowerShellProvider_C0D5/images-screenshot_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="571" alt="images-screenshot" src="http://www.nivot.org/content/binary/WindowsLiveWriter/WindowsMobilePowerShellProvider_C0D5/images-screenshot_thumb.png" width="663" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h3&gt;Cmdlets and Definitions
&lt;/h3&gt;
&lt;p&gt;
Here's a table of the syntax for the included Cmdlets.
&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2" width="600" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" align="middle" width="140"&gt;
&lt;strong&gt;Cmdlet&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" align="middle" width="285"&gt;
&lt;strong&gt;Definition&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&lt;strong&gt;WhatIf / Confirm&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
ConvertFrom-WMFile *&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Path] 
&lt;string  []&gt;
[-Destination] 
&lt;string&gt;
[-Force] [-Verbose]
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-LiteralPath] 
&lt;string  []&gt;
[-Destination] 
&lt;string&gt;
[-Force] [-Verbose]
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
ConvertTo-WMFile *&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Path] 
&lt;string  []&gt;
[-Destination] 
&lt;string&gt;
[-Force] [-Verbose]
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-LiteralPath] 
&lt;string  []&gt;
[-Destination] 
&lt;string&gt;
[-Force] [-Verbose]
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Get-WMDeviceInfo&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Verbose] 
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Get-WMMemoryInfo 
&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Verbose] 
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Get-WMStoreInfo 
&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Verbose] 
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Start-WMActiveSync 
&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Verbose] 
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Stop-WMActiveSync&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Verbose] 
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Start-WMProcess 
&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-LiteralPath] 
&lt;string&gt;
[[-Arguments] 
&lt;string  []&gt;
] [-Verbose]
&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="140"&gt;
Get-WMDevice&lt;/td&gt;
&lt;td valign="top" width="285"&gt;
[-Verbose]&lt;/td&gt;
&lt;td valign="top" align="middle" width="173"&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;em&gt;* These Cmdlets that accept a path will bind to pipeline input via PSPath property
name.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
If you've got any problems, suggestions or ideas, please post into the discussions
board on the web site. Have fun!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=3c59a56a-8af3-4e47-ac11-b018a981662d" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,3c59a56a-8af3-4e47-ac11-b018a981662d.aspx</comments>
      <category>.NET</category>
      <category>Compact Framework</category>
      <category>Monad</category>
      <category>Pocket PC</category>
      <category>PowerShell</category>
      <category>SmartPhone</category>
      <category>WinCE</category>
      <category>Windows Mobile</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=094f4f27-e830-4470-8e00-d42c45c39ed5</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,094f4f27-e830-4470-8e00-d42c45c39ed5.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,094f4f27-e830-4470-8e00-d42c45c39ed5.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=094f4f27-e830-4470-8e00-d42c45c39ed5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I took a few hours yesterday to "tidy up my room" so to speak, so I built a nice MSI
installer, updated the help, CodePlex Wiki and examples and closed all bugs. This
is probably the final release now that PowerShell 2.0 CTP2 has introduced support
for eventing, so thanks for all the support. 
</p>
        <p>
          <strong>
            <u>New Features</u>
          </strong>
        </p>
        <ul>
          <li>
Multiple named queue support and default queue with -QueueName parameter 
</li>
          <li>
Better COM support, window message pumping etc. 
</li>
          <li>
NoFlush / Peek parameter support for queue reading 
</li>
          <li>
Get-EventQueue command added for viewing queues and their message counts. 
</li>
        </ul>
        <p>
          <strong>
            <u>Cmdlet Name Changes</u>
          </strong>
        </p>
        <ul>
          <li>
Get-Event -&gt; Read-Event 
</li>
          <li>
Connect-EventListener -&gt; Connect-Event 
</li>
          <li>
Disconnect-EventListener -&gt; Disconnect-Event 
</li>
        </ul>
        <p>
Additionally, several niggling bugs closed (including the one where read-event -wait
would return immediately with no events). 
</p>
        <p>
          <a href="http://www.codeplex.com/pseventing">http://www.codeplex.com/pseventing</a>
        </p>
        <p>
For an advanced example: <a href="http://www.nivot.org/2007/12/05/ForegroundBackgroundSwappableDownloadsInPowerShell.aspx">Foreground
/ Background Swappable Downloads In PowerShell</a>.
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=094f4f27-e830-4470-8e00-d42c45c39ed5" />
      </body>
      <title>PSEventing 1.1 For PowerShell 1.0 Final Release</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,094f4f27-e830-4470-8e00-d42c45c39ed5.aspx</guid>
      <link>http://www.nivot.org/2008/06/06/PSEventing11ForPowerShell10FinalRelease.aspx</link>
      <pubDate>Fri, 06 Jun 2008 01:20:10 GMT</pubDate>
      <description>&lt;p&gt;
I took a few hours yesterday to "tidy up my room" so to speak, so I built a nice MSI
installer, updated the help, CodePlex Wiki and examples and closed all bugs. This
is probably the final release now that PowerShell 2.0 CTP2 has introduced support
for eventing, so thanks for all the support. 
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;New Features&lt;/u&gt;&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;
Multiple named queue support and default queue with -QueueName parameter 
&lt;li&gt;
Better COM support, window message pumping etc. 
&lt;li&gt;
NoFlush / Peek parameter support for queue reading 
&lt;li&gt;
Get-EventQueue command added for viewing queues and their message counts. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;&lt;u&gt;Cmdlet Name Changes&lt;/u&gt;&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;
Get-Event -&amp;gt; Read-Event 
&lt;li&gt;
Connect-EventListener -&amp;gt; Connect-Event 
&lt;li&gt;
Disconnect-EventListener -&amp;gt; Disconnect-Event 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Additionally, several niggling bugs closed (including the one where read-event -wait
would return immediately with no events). 
&lt;p&gt;
&lt;a href="http://www.codeplex.com/pseventing"&gt;http://www.codeplex.com/pseventing&lt;/a&gt; 
&lt;p&gt;
For an advanced example: &lt;a href="http://www.nivot.org/2007/12/05/ForegroundBackgroundSwappableDownloadsInPowerShell.aspx"&gt;Foreground
/ Background Swappable Downloads In PowerShell&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=094f4f27-e830-4470-8e00-d42c45c39ed5" /&gt;</description>
      <comments>http://www.nivot.org/CommentView,guid,094f4f27-e830-4470-8e00-d42c45c39ed5.aspx</comments>
      <category>CodePlex</category>
      <category>Monad</category>
      <category>PowerShell</category>
      <category>PSEventing</category>
    </item>
    <item>
      <trackback:ping>http://www.nivot.org/Trackback.aspx?guid=bfc15b00-0444-44e3-980b-f9f8bdb32f85</trackback:ping>
      <pingback:server>http://www.nivot.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.nivot.org/PermaLink,guid,bfc15b00-0444-44e3-980b-f9f8bdb32f85.aspx</pingback:target>
      <dc:creator>Oisin</dc:creator>
      <wfw:comment>http://www.nivot.org/CommentView,guid,bfc15b00-0444-44e3-980b-f9f8bdb32f85.aspx</wfw:comment>
      <wfw:commentRss>http://www.nivot.org/SyndicationService.asmx/GetEntryCommentsRss?guid=bfc15b00-0444-44e3-980b-f9f8bdb32f85</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>UPDATE May 26th</strong>: You must run PowerShell v2.0 CTP in STA mode
for this to work. Start the shell, then run "powershell -sta" from the command line
to start a new version of the shell in "single thread apartment" mode (STA). This
is required for WPF to work correctly.
</p>
        <p>
That is a bit of a mouthful of a title for this post but it's the best I could come
up with. This post takes some of <a href="http://blogs.msdn.com/powershell/archive/2008/05/22/wpf-powershell-part-1-hello-world-welcome-to-the-week-of-wpf.aspx" target="_blank">James'
scripty bits</a> and <a href="http://huddledmasses.org/wpf-from-powershell-updating-windows/" target="_blank">Jaykul's
scripty bits</a> and shows you how to create a countdown timer written in PowerShell
script that runs in the background without blocking input. Just like Jaykul's original
clock, you can drag it around and right-clicking it will close it. His version was
the current time and it also showed some system resources. I changed it into a countdown
and removed the other nested graphs. When it hits 00:00:00 it turns red. Here's what
it looks like:
</p>
        <p>
          <a href="http://www.nivot.org/content/binary/WindowsLiveWriter/BackgroundAsynchronousPowerShellWPFWidge_ED80/countdown_2.png">
            <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="267" alt="countdown" src="http://www.nivot.org/content/binary/WindowsLiveWriter/BackgroundAsynchronousPowerShellWPFWidge_ED80/countdown_thumb.png" width="654" border="0" />
          </a>
        </p>
        <p>
Here's the source of invoke-background.ps1:
</p>
        <!-- Stylesheet link -->
        <link href="http://www.thecomplex.plus.com/styles/SyntaxHighlighter.css" type="text/css" rel="stylesheet" />
        <!-- Code -->
        <div class="dp-highlighter" id="hlDiv">
          <div class="bar">
          </div>
          <ol class="dp-rb">
            <li class="alt">
              <span>
                <span class="keyword">param</span>
                <span>([string]</span>
                <span class="variable">$scriptName</span>
                <span>)   </span>
              </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="comment"># original script James Brundage (blogs.msdn.com/powershell) </span>
              <span>  </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$rs</span>
              <span> = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()   </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$rs</span>
              <span>.ApartmentState, </span>
              <span class="variable">$rs</span>
              <span>.ThreadOptions
= “STA”, “ReuseThread”   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$rs</span>
              <span>.Open()   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="comment"># Reference the WPF assemblies </span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span> = {Add-Type}.GetPowerShell()   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.SetRunspace(</span>
              <span class="variable">$rs</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.AddParameter(</span>
              <span class="string">"AssemblyName"</span>
              <span>, </span>
              <span class="string">"PresentationCore"</span>
              <span>).Invoke()   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.Command.Clear()   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span> = </span>
              <span class="variable">$psCmd</span>
              <span>.AddCommand(</span>
              <span class="string">"Add-Type"</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.AddParameter(</span>
              <span class="string">"AssemblyName"</span>
              <span>, </span>
              <span class="string">"PresentationFramework"</span>
              <span>).Invoke()   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.Command.Clear()   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span> = </span>
              <span class="variable">$psCmd</span>
              <span>.AddCommand(</span>
              <span class="string">"Add-Type"</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.AddParameter(</span>
              <span class="string">"AssemblyName"</span>
              <span>, </span>
              <span class="string">"WindowsBase"</span>
              <span>).Invoke()   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$sb</span>
              <span> = </span>
              <span class="variable">$executionContext</span>
              <span>.InvokeCommand.NewScriptBlock(   </span>
            </li>
            <li class="alt">
              <span>    (</span>
              <span class="builtin">Join-Path</span>
              <span> </span>
              <span class="variable">$pwd</span>
              <span> </span>
              <span class="variable">$scriptname</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>)   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span> = </span>
              <span class="variable">$sb</span>
              <span>.GetPowerShell()   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$psCmd</span>
              <span>.SetRunspace(</span>
              <span class="variable">$rs</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$null</span>
              <span> = </span>
              <span class="variable">$psCmd</span>
              <span>.BeginInvoke()   </span>
            </li>
          </ol>
        </div>
        <p>
Next, here's the modified clock script:
</p>
        <div class="dp-highlighter" id="hlDiv">
          <div class="bar">
          </div>
          <ol class="dp-rb">
            <li class="alt">
              <span>
                <span class="keyword">param</span>
                <span> (   </span>
              </span>
            </li>
            <li class="">
              <span>    [timespan]</span>
              <span class="variable">$period</span>
              <span> =
(</span>
              <span class="builtin">New-Object</span>
              <span> system.TimeSpan(0,5,0)),   </span>
            </li>
            <li class="alt">
              <span>    </span>
              <span class="variable">$clockxaml</span>
              <span>=</span>
              <span class="string">"&lt;path
to xaml file&gt;\clock.xaml"</span>
              <span>  </span>
            </li>
            <li class="">
              <span>)   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="comment">### Import the WPF assemblies </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>Add-Type -Assembly PresentationFramework   </span>
            </li>
            <li class="">
              <span>Add-Type -Assembly PresentationCore   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$clock</span>
              <span> = [Windows.Markup.XamlReader]::Load(    </span>
            </li>
            <li class="alt">
              <span>         (</span>
              <span class="builtin">New-Object</span>
              <span> System.Xml.XmlNodeReader
(   </span>
            </li>
            <li class="">
              <span>            [Xml](</span>
              <span class="builtin">Get-Content</span>
              <span> </span>
              <span class="variable">$clockxaml</span>
              <span>)
) ) )   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$then</span>
              <span> = [datetime]::Now   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$red</span>
              <span> = [System.Windows.Media.Color]::FromRgb(255,0,0)   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$redbrush</span>
              <span> = new-object system.windows.media.solidcolorbrush </span>
              <span class="variable">$red</span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$label</span>
              <span> = </span>
              <span class="variable">$clock</span>
              <span>.FindName(</span>
              <span class="string">"ClockLabel"</span>
              <span>)   </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$done</span>
              <span> = </span>
              <span class="variable">$false</span>
              <span>  </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="comment"># Create a script block which will update the UI </span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$updateBlock</span>
              <span> = {      </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="keyword">if</span>
              <span> (!</span>
              <span class="variable">$done</span>
              <span>)
{   </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="comment"># update
the clock </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>        </span>
              <span class="variable">$elapsed</span>
              <span> =
([datetime]::Now - </span>
              <span class="variable">$then</span>
              <span>)   </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="variable">$remaining</span>
              <span> = </span>
              <span class="variable">$null</span>
              <span>;   </span>
            </li>
            <li class="alt">
              <span>           </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="keyword">if</span>
              <span> (</span>
              <span class="variable">$elapsed</span>
              <span> -lt </span>
              <span class="variable">$period</span>
              <span>)
{   </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="variable">$remaining</span>
              <span> =
(</span>
              <span class="variable">$period</span>
              <span> - </span>
              <span class="variable">$elapsed</span>
              <span>).ToString().substring(0,8)   </span>
            </li>
            <li class="">
              <span>        } </span>
              <span class="keyword">else</span>
              <span> {   </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="variable">$label</span>
              <span>.Foreground
= </span>
              <span class="variable">$redbrush</span>
              <span>          </span>
            </li>
            <li class="">
              <span>            </span>
              <span class="variable">$remaining</span>
              <span> = </span>
              <span class="string">"00:00:00"</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="variable">$done</span>
              <span> = </span>
              <span class="variable">$true</span>
              <span>  </span>
            </li>
            <li class="">
              <span>        }          </span>
            </li>
            <li class="alt">
              <span>        </span>
              <span class="variable">$clock</span>
              <span>.Resources[</span>
              <span class="string">"Time"</span>
              <span>]
= </span>
              <span class="variable">$remaining</span>
              <span>  </span>
            </li>
            <li class="">
              <span>   }   </span>
            </li>
            <li class="alt">
              <span>}   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="comment">## Hook up some event handlers  </span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$clock</span>
              <span>.Add_SourceInitialized( {   </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="comment">## Before the window's even displayed
... </span>
              <span>  </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="comment">## We'll create a timer </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$timer</span>
              <span> = new-object
System.Windows.Threading.DispatcherTimer   </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="comment">## Which will fire 2 times every second </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$timer</span>
              <span>.Interval = [TimeSpan]</span>
              <span class="string">"0:0:0.50"</span>
              <span>  </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="comment">## And will invoke the $updateBlock </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$timer</span>
              <span>.Add_Tick( </span>
              <span class="variable">$updateBlock</span>
              <span> )   </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="comment">## Now start the timer running </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$timer</span>
              <span>.Start()   </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="keyword">if</span>
              <span>(! </span>
              <span class="variable">$timer</span>
              <span>.IsEnabled
) {   </span>
            </li>
            <li class="alt">
              <span>      </span>
              <span class="variable">$clock</span>
              <span>.Close()   </span>
            </li>
            <li class="">
              <span>   }   </span>
            </li>
            <li class="alt">
              <span>} )   </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$clock</span>
              <span>.Add_MouseLeftButtonDown( {    </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="variable">$_</span>
              <span>.Handled = </span>
              <span class="variable">$true</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$clock</span>
              <span>.DragMove() </span>
              <span class="comment">#
WPF Magic! </span>
              <span>  </span>
            </li>
            <li class="">
              <span>} )   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="variable">$clock</span>
              <span>.Add_MouseRightButtonDown(
{    </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$_</span>
              <span>.Handled = </span>
              <span class="variable">$true</span>
              <span>  </span>
            </li>
            <li class="">
              <span>   </span>
              <span class="variable">$timer</span>
              <span>.Stop()  </span>
              <span class="comment">#
we'd like to stop that timer now, thanks. </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="variable">$clock</span>
              <span>.Close() </span>
              <span class="comment">#
and close the windows </span>
              <span>  </span>
            </li>
            <li class="">
              <span>} )   </span>
            </li>
            <li class="alt">
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="comment">## Lets go ahead and invoke that update block  </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>&amp;</span>
              <span class="variable">$updateBlock</span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="comment">## And then show the window </span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>
              </span>
              <span class="variable">$clock</span>
              <span>.ShowDialog()   </span>
            </li>
          </ol>
        </div>
        <p>
...and finally the modified clock.xaml file:
</p>
        <div class="dp-highlighter" id="hlDiv">
          <div class="bar">
          </div>
          <ol class="dp-xml">
            <li class="alt">
              <span>
                <span class="tag">&lt;</span>
                <span class="tag-name">Window</span>
                <span> </span>
                <span class="attribute">xmlns</span>
                <span>=</span>
                <span class="attribute-value">'http://schemas.microsoft.com/winfx/2006/xaml/presentation'</span>
                <span>  </span>
              </span>
            </li>
            <li class="">
              <span>        xmlns:</span>
              <span class="attribute">x</span>
              <span>=</span>
              <span class="attribute-value">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>        xmlns:</span>
              <span class="attribute">system</span>
              <span>=</span>
              <span class="attribute-value">"clr-namespace:System;assembly=mscorlib"</span>
              <span>  </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="attribute">WindowStyle</span>
              <span>=</span>
              <span class="attribute-value">'None'</span>
              <span> </span>
              <span class="attribute">AllowsTransparency</span>
              <span>=</span>
              <span class="attribute-value">'True'</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>        </span>
              <span class="attribute">Topmost</span>
              <span>=</span>
              <span class="attribute-value">'True'</span>
              <span> </span>
              <span class="attribute">Background</span>
              <span>=</span>
              <span class="attribute-value">"Transparent"</span>
              <span>  </span>
              <span class="attribute">ShowInTaskbar</span>
              <span>=</span>
              <span class="attribute-value">'False'</span>
              <span>  </span>
            </li>
            <li class="">
              <span>        </span>
              <span class="attribute">SizeToContent</span>
              <span>=</span>
              <span class="attribute-value">'WidthAndHeight'</span>
              <span> </span>
              <span class="attribute">WindowStartupLocation</span>
              <span>=</span>
              <span class="attribute-value">'CenterOwner'</span>
              <span> </span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">Window.Resources</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>      </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">system</span>
              <span>:String
x:</span>
              <span class="attribute">Key</span>
              <span>=</span>
              <span class="attribute-value">"Time"</span>
              <span class="tag">&gt;</span>
              <span>12:34.56</span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">system</span>
              <span>:String</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">Window.Resources</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">Grid</span>
              <span> </span>
              <span class="attribute">Height</span>
              <span>=</span>
              <span class="attribute-value">"2.2in"</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>      </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">Grid.ColumnDefinitions</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>         </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">ColumnDefinition</span>
              <span class="tag">/&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>      </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">Grid.ColumnDefinitions</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>      </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">Label</span>
              <span> </span>
              <span class="attribute">Name</span>
              <span>=</span>
              <span class="attribute-value">"ClockLabel"</span>
              <span> </span>
              <span class="attribute">Grid.Column</span>
              <span>=</span>
              <span class="attribute-value">"2"</span>
              <span> </span>
              <span class="attribute">Opacity</span>
              <span>=</span>
              <span class="attribute-value">"0.7"</span>
              <span> </span>
              <span class="attribute">Content</span>
              <span>=</span>
              <span class="attribute-value">"{DynamicResource
Time}"</span>
              <span> </span>
              <span class="attribute">FontFamily</span>
              <span>=</span>
              <span class="attribute-value">"Impact,
Arial"</span>
              <span> </span>
              <span class="attribute">FontWeight</span>
              <span>=</span>
              <span class="attribute-value">"800"</span>
              <span> </span>
              <span class="attribute">FontSize</span>
              <span>=</span>
              <span class="attribute-value">"2in"</span>
              <span> </span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>         </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">Label.Foreground</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>            </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">LinearGradientBrush</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>               </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">GradientStop</span>
              <span> </span>
              <span class="attribute">Color</span>
              <span>=</span>
              <span class="attribute-value">"#CC064A82"</span>
              <span> </span>
              <span class="attribute">Offset</span>
              <span>=</span>
              <span class="attribute-value">"1"</span>
              <span class="tag">/&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>               </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">GradientStop</span>
              <span> </span>
              <span class="attribute">Color</span>
              <span>=</span>
              <span class="attribute-value">"#FF6797BF"</span>
              <span> </span>
              <span class="attribute">Offset</span>
              <span>=</span>
              <span class="attribute-value">"0.8"</span>
              <span class="tag">/&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>               </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">GradientStop</span>
              <span> </span>
              <span class="attribute">Color</span>
              <span>=</span>
              <span class="attribute-value">"#FF6797BF"</span>
              <span> </span>
              <span class="attribute">Offset</span>
              <span>=</span>
              <span class="attribute-value">"0.4"</span>
              <span class="tag">/&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>               </span>
              <span class="tag">&lt;</span>
              <span class="tag-name">GradientStop</span>
              <span> </span>
              <span class="attribute">Color</span>
              <span>=</span>
              <span class="attribute-value">"#FFD4DBE1"</span>
              <span> </span>
              <span class="attribute">Offset</span>
              <span>=</span>
              <span class="attribute-value">"0"</span>
              <span class="tag">/&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>            </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">LinearGradientBrush</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>         </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">Label.Foreground</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>      </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">Label</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="alt">
              <span>   </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">Grid</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
            <li class="">
              <span>
              </span>
              <span class="tag">&lt;/</span>
              <span class="tag-name">Window</span>
              <span class="tag">&gt;</span>
              <span>  </span>
            </li>
          </ol>
        </div>
        <p>
Important: you'll need to save all files into the same directory and fix up the path
to the clock.xaml file in the start-countdown.ps1 script.
</p>
        <p>
Have fun!
</p>
        <img width="0" height="0" src="http://www.nivot.org/aggbug.ashx?id=bfc15b00-0444-44e3-980b-f9f8bdb32f85" />
      </body>
      <title>Background Timer PowerShell WPF Widget</title>
      <guid isPermaLink="false">http://www.nivot.org/PermaLink,guid,bfc15b00-0444-44e3-980b-f9f8bdb32f85.aspx</guid>
      <link>http://www.nivot.org/2008/05/23/BackgroundTimerPowerShellWPFWidget.aspx</link>
      <pubDate>Fri, 23 May 2008 21:04:18 GMT</pubDate>
      <description>&lt;p&gt;
&lt;strong&gt;UPDATE May 26th&lt;/strong&gt;: You must run PowerShell v2.0 CTP&amp;nbsp;in STA mode
for this to work. Start the shell, then run "powershell -sta" from the command line
to start a new version of the shell in "single thread apartment" mode (STA). This
is required for WPF to work correctly.
&lt;/p&gt;
&lt;p&gt;
That is a bit of a mouthful of a title for this post but it's the best I could come
up with. This post takes some of &lt;a href="http://blogs.msdn.com/powershell/archive/2008/05/22/wpf-powershell-part-1-hello-world-welcome-to-the-week-of-wpf.aspx" target=_blank&gt;James'
scripty bits&lt;/a&gt; and &lt;a href="http://huddledmasses.org/wpf-from-powershell-updating-windows/" target=_blank&gt;Jaykul's
scripty bits&lt;/a&gt; and shows you how to create a countdown timer written in PowerShell
script that runs in the background without blocking input. Just like Jaykul's original
clock, you can drag it around and right-clicking it will close it. His version was
the current time and it also showed some system resources. I changed it into a countdown
and removed the other nested graphs. When it hits 00:00:00 it turns red. Here's what
it looks like:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.nivot.org/content/binary/WindowsLiveWriter/BackgroundAsynchronousPowerShellWPFWidge_ED80/countdown_2.png"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=267 alt=countdown src="http://www.nivot.org/content/binary/WindowsLiveWriter/BackgroundAsynchronousPowerShellWPFWidge_ED80/countdown_thumb.png" width=654 border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Here's the source of invoke-background.ps1:
&lt;/p&gt;
&lt;!-- Stylesheet link --&gt;
&lt;link href="http://www.thecomplex.plus.com/styles/SyntaxHighlighter.css" type=text/css rel=stylesheet&gt;
&lt;!-- Code --&gt;
&lt;div class=dp-highlighter id=hlDiv&gt;
&lt;div class=bar&gt;
&lt;/div&gt;
&lt;ol class=dp-rb&gt;
&lt;li class=alt&gt;
&lt;span&gt;&lt;span class=keyword&gt;param&lt;/span&gt;&lt;span&gt;([string]&lt;/span&gt;&lt;span class=variable&gt;$scriptName&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=comment&gt;# original script James Brundage (blogs.msdn.com/powershell) &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$rs&lt;/span&gt;&lt;span&gt; = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$rs&lt;/span&gt;&lt;span&gt;.ApartmentState, &lt;/span&gt;&lt;span class=variable&gt;$rs&lt;/span&gt;&lt;span&gt;.ThreadOptions
= “STA”, “ReuseThread”&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$rs&lt;/span&gt;&lt;span&gt;.Open()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=comment&gt;# Reference the WPF assemblies &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt; = {Add-Type}.GetPowerShell()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.SetRunspace(&lt;/span&gt;&lt;span class=variable&gt;$rs&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.AddParameter(&lt;/span&gt;&lt;span class=string&gt;"AssemblyName"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=string&gt;"PresentationCore"&lt;/span&gt;&lt;span&gt;).Invoke()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.Command.Clear()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.AddCommand(&lt;/span&gt;&lt;span class=string&gt;"Add-Type"&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.AddParameter(&lt;/span&gt;&lt;span class=string&gt;"AssemblyName"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=string&gt;"PresentationFramework"&lt;/span&gt;&lt;span&gt;).Invoke()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.Command.Clear()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.AddCommand(&lt;/span&gt;&lt;span class=string&gt;"Add-Type"&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.AddParameter(&lt;/span&gt;&lt;span class=string&gt;"AssemblyName"&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=string&gt;"WindowsBase"&lt;/span&gt;&lt;span&gt;).Invoke()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$sb&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$executionContext&lt;/span&gt;&lt;span&gt;.InvokeCommand.NewScriptBlock(&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;span class=builtin&gt;Join-Path&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=variable&gt;$pwd&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=variable&gt;$scriptname&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$sb&lt;/span&gt;&lt;span&gt;.GetPowerShell()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.SetRunspace(&lt;/span&gt;&lt;span class=variable&gt;$rs&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$null&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$psCmd&lt;/span&gt;&lt;span&gt;.BeginInvoke()&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;
Next, here's the modified clock script:
&lt;/p&gt;
&lt;div class=dp-highlighter id=hlDiv&gt;
&lt;div class=bar&gt;
&lt;/div&gt;
&lt;ol class=dp-rb&gt;
&lt;li class=alt&gt;
&lt;span&gt;&lt;span class=keyword&gt;param&lt;/span&gt;&lt;span&gt; (&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [timespan]&lt;/span&gt;&lt;span class=variable&gt;$period&lt;/span&gt;&lt;span&gt; =
(&lt;/span&gt;&lt;span class=builtin&gt;New-Object&lt;/span&gt;&lt;span&gt; system.TimeSpan(0,5,0)),&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$clockxaml&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=string&gt;"&amp;lt;path
to xaml file&amp;gt;\clock.xaml"&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=comment&gt;### Import the WPF assemblies &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;Add-Type -Assembly PresentationFramework&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;Add-Type -Assembly PresentationCore&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$clock&lt;/span&gt;&lt;span&gt; = [Windows.Markup.XamlReader]::Load(&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;span class=builtin&gt;New-Object&lt;/span&gt;&lt;span&gt; System.Xml.XmlNodeReader
(&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Xml](&lt;/span&gt;&lt;span class=builtin&gt;Get-Content&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=variable&gt;$clockxaml&lt;/span&gt;&lt;span&gt;)
) ) )&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$then&lt;/span&gt;&lt;span&gt; = [datetime]::Now&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$red&lt;/span&gt;&lt;span&gt; = [System.Windows.Media.Color]::FromRgb(255,0,0)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$redbrush&lt;/span&gt;&lt;span&gt; = new-object system.windows.media.solidcolorbrush &lt;/span&gt;&lt;span class=variable&gt;$red&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$label&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$clock&lt;/span&gt;&lt;span&gt;.FindName(&lt;/span&gt;&lt;span class=string&gt;"ClockLabel"&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$done&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$false&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=comment&gt;# Create a script block which will update the UI &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=variable&gt;$updateBlock&lt;/span&gt;&lt;span&gt; = {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=keyword&gt;if&lt;/span&gt;&lt;span&gt; (!&lt;/span&gt;&lt;span class=variable&gt;$done&lt;/span&gt;&lt;span&gt;)
{&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=comment&gt;# update
the clock &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$elapsed&lt;/span&gt;&lt;span&gt; =
([datetime]::Now - &lt;/span&gt;&lt;span class=variable&gt;$then&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$remaining&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$null&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=keyword&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=variable&gt;$elapsed&lt;/span&gt;&lt;span&gt; -lt &lt;/span&gt;&lt;span class=variable&gt;$period&lt;/span&gt;&lt;span&gt;)
{&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$remaining&lt;/span&gt;&lt;span&gt; =
(&lt;/span&gt;&lt;span class=variable&gt;$period&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span class=variable&gt;$elapsed&lt;/span&gt;&lt;span&gt;).ToString().substring(0,8)&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;span class=keyword&gt;else&lt;/span&gt;&lt;span&gt; {&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$label&lt;/span&gt;&lt;span&gt;.Foreground
= &lt;/span&gt;&lt;span class=variable&gt;$redbrush&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$remaining&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=string&gt;"00:00:00"&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$done&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span class=variable&gt;$true&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=variable&gt;$clock&lt;/span&gt;&lt;span&gt;.Resources[&lt;/span&gt;&lt;span class=string&gt;"Time"&lt;/span&gt;&lt;span&gt;]
= &lt;/span&gt;&lt;span class=variable&gt;$remaining&lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;}&amp;nbsp;&amp;nbsp; &lt;/span&gt; 
&lt;li class=""&gt;
&lt;span&gt;&amp;nbsp; &lt;/span&gt; 
&lt;li class=alt&gt;
&lt;span&gt;&lt;/span&gt;&lt;span class=comment&gt;## Hook up some event handlers&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&gt; 
&lt;li class=""&gt;
&lt;span&gt;&lt;/span&gt;&lt