<?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>Precision Computing</title>
    <link>http://www.leeholmes.com/blog/</link>
    <description>Software Design and Development</description>
    <copyright>Lee Holmes</copyright>
    <lastBuildDate>Thu, 26 Aug 2010 17:30:42 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>blog-feedback@leeholmes.com</managingEditor>
    <webMaster>blog-feedback@leeholmes.com</webMaster>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=48084078-e225-4d1b-8bc3-104b7421b019</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,48084078-e225-4d1b-8bc3-104b7421b019.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,48084078-e225-4d1b-8bc3-104b7421b019.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=48084078-e225-4d1b-8bc3-104b7421b019</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For today only, O’Reilly is offering the electronic version of the Windows PowerShell
Cookbook for only $9.99. This gives you unrestricted access to DRM-free PDF, MOBI
(Kindle, etc) and ePub versions of the book.
</p>
        <p>
If you have an iDevice, the Stanza book reader (among several others) supports both
the PDF and ePub file formats.
</p>
        <p>
Get it while it’s hot! 
</p>
        <p>
Use code DDWPC <a href="http://oreil.ly/cFRco0">http://oreil.ly/cFRco0</a></p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=48084078-e225-4d1b-8bc3-104b7421b019" />
      </body>
      <title>PowerShell Cookbook &amp;ndash; O&amp;rsquo;Reilly EBook Deal of the Day</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,48084078-e225-4d1b-8bc3-104b7421b019.aspx</guid>
      <link>http://www.leeholmes.com/blog/PowerShellCookbookNdashOrsquoReillyEBookDealOfTheDay.aspx</link>
      <pubDate>Thu, 26 Aug 2010 17:30:42 GMT</pubDate>
      <description>&lt;p&gt;
For today only, O’Reilly is offering the electronic version of the Windows PowerShell
Cookbook for only $9.99. This gives you unrestricted access to DRM-free PDF, MOBI
(Kindle, etc) and ePub versions of the book.
&lt;/p&gt;
&lt;p&gt;
If you have an iDevice, the Stanza book reader (among several others) supports both
the PDF and ePub file formats.
&lt;/p&gt;
&lt;p&gt;
Get it while it’s hot! 
&lt;/p&gt;
&lt;p&gt;
Use code DDWPC &lt;a href="http://oreil.ly/cFRco0"&gt;http://oreil.ly/cFRco0&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=48084078-e225-4d1b-8bc3-104b7421b019" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,48084078-e225-4d1b-8bc3-104b7421b019.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=c998bea1-0b2a-4daa-9a99-c61458c86a68</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,c998bea1-0b2a-4daa-9a99-c61458c86a68.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,c998bea1-0b2a-4daa-9a99-c61458c86a68.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c998bea1-0b2a-4daa-9a99-c61458c86a68</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On Friday, we wrapped up the final details of the PowerShell Cookbook, V2. O’Reilly
has already made the <a href="http://oreilly.com/catalog/9780596801519">electronic
edition available</a>, which is a great resource for searching, copying, pasting,
and working with the content in its native form. If you or your company subscribes
to Safari, it should be available shortly.
</p>
        <p>
If you’re a fan of the printed version, it's off to the printers now, and has a scheduled
"in-stock" date of 8/24: the date when it'll be in boxes in the shipping
/ receiving area of book stores. It takes about a week for books to migrate onto shelves,
so the official "when can I get it" date is 8/31.
</p>
        <p align="center">
          <iframe style="width: 120px; height: 240px" marginheight="0" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;npa=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=preciscomput-20&amp;o=1&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;asins=0596801505" frameborder="0" marginwidth="0" scrolling="no">
          </iframe>
        </p>
        <p>
It's almost 900 pages now, despite my best efforts to keep it svelte :) I dropped
the chapters on Exchange and MOM (since there are dedicated books and support materials
for those now), and dropped a few appendixes that are now covered much more effectively
in the in-box help. Since much of the V1 book is about filling "missing pieces"
from V1, and we filled tons of "missing pieces" from V1, much of the new
content directly replaced recipes that existed in the V1 book.
</p>
        <p>
Dropping the chapters on Exchange and MOM was also done in response to feedback. While
they provided cursory coverage of the technologies, they were intended primarily to
introduce Admins to the wider PowerShell ecosystem. Now that there are entire books
written to cover PowerShell-based products (i.e.: VMWare, Exchange, MOM, etc), the
Cookbook can now focus on the core technology. Aside from the Exchange / MOM updates,
the "Description" sections of many recipes have been beefed up in response
to feedback. Most go into significantly more detail, or discuss more of the underpinnings
of the recipe or what it covers.
</p>
        <p>
And then, of course, there's the "new stuff". The book now has about 430
recipes, almost double what the first version had. It's sometimes easy to forget how
transformative PowerShell V2 is, but it consisted of over two thousand source code
checkins!
</p>
        <p>
All-told, the second edition took about 560 hours. That's a lot, but what surprised
me is that it ended up being only about an hour per print-ready page: including research,
drafts, reviews, copy editing, and everything else wrapped in the project.
</p>
        <p>
If you liked the first version of the PowerShell Cookbook, you’ll like this version
even more :)
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=c998bea1-0b2a-4daa-9a99-c61458c86a68" />
      </body>
      <title>PowerShell Cookbook V2 Now Available</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,c998bea1-0b2a-4daa-9a99-c61458c86a68.aspx</guid>
      <link>http://www.leeholmes.com/blog/PowerShellCookbookV2NowAvailable.aspx</link>
      <pubDate>Mon, 16 Aug 2010 19:57:22 GMT</pubDate>
      <description>&lt;p&gt;
On Friday, we wrapped up the final details of the PowerShell Cookbook, V2. O’Reilly
has already made the &lt;a href="http://oreilly.com/catalog/9780596801519"&gt;electronic
edition available&lt;/a&gt;, which is a great resource for searching, copying, pasting,
and working with the content in its native form. If you or your company subscribes
to Safari, it should be available shortly.
&lt;/p&gt;
&lt;p&gt;
If you’re a fan of the printed version, it's off to the printers now, and has a scheduled
&amp;quot;in-stock&amp;quot; date of 8/24: the date when it'll be in boxes in the shipping
/ receiving area of book stores. It takes about a week for books to migrate onto shelves,
so the official &amp;quot;when can I get it&amp;quot; date is 8/31.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;iframe style="width: 120px; height: 240px" marginheight="0" src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;npa=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=preciscomput-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;asins=0596801505" frameborder="0" marginwidth="0" scrolling="no"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
It's almost 900 pages now, despite my best efforts to keep it svelte :) I dropped
the chapters on Exchange and MOM (since there are dedicated books and support materials
for those now), and dropped a few appendixes that are now covered much more effectively
in the in-box help. Since much of the V1 book is about filling &amp;quot;missing pieces&amp;quot;
from V1, and we filled tons of &amp;quot;missing pieces&amp;quot; from V1, much of the new
content directly replaced recipes that existed in the V1 book.
&lt;/p&gt;
&lt;p&gt;
Dropping the chapters on Exchange and MOM was also done in response to feedback. While
they provided cursory coverage of the technologies, they were intended primarily to
introduce Admins to the wider PowerShell ecosystem. Now that there are entire books
written to cover PowerShell-based products (i.e.: VMWare, Exchange, MOM, etc), the
Cookbook can now focus on the core technology. Aside from the Exchange / MOM updates,
the &amp;quot;Description&amp;quot; sections of many recipes have been beefed up in response
to feedback. Most go into significantly more detail, or discuss more of the underpinnings
of the recipe or what it covers.
&lt;/p&gt;
&lt;p&gt;
And then, of course, there's the &amp;quot;new stuff&amp;quot;. The book now has about 430
recipes, almost double what the first version had. It's sometimes easy to forget how
transformative PowerShell V2 is, but it consisted of over two thousand source code
checkins!
&lt;/p&gt;
&lt;p&gt;
All-told, the second edition took about 560 hours. That's a lot, but what surprised
me is that it ended up being only about an hour per print-ready page: including research,
drafts, reviews, copy editing, and everything else wrapped in the project.
&lt;/p&gt;
&lt;p&gt;
If you liked the first version of the PowerShell Cookbook, you’ll like this version
even more :)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=c998bea1-0b2a-4daa-9a99-c61458c86a68" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,c998bea1-0b2a-4daa-9a99-c61458c86a68.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=365e55e5-77aa-4129-9f41-07bc2bf21a53</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,365e55e5-77aa-4129-9f41-07bc2bf21a53.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,365e55e5-77aa-4129-9f41-07bc2bf21a53.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=365e55e5-77aa-4129-9f41-07bc2bf21a53</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Over the past few days, <a href="http://spaceweather.com/">Astronomy resources</a> have
been making a big splash about a couple of coronal mass ejections (CME) primed to
cause widespread visibility of the Aurora Borealis. Last night was when the first
one hit, and its effects extended deeply into southern Canada and parts of the northern
US.
</p>
        <p>
There may be another round tonight, so maybe this post can help you catch your first
Aurora :)
</p>
        <p>
NOAA has a couple of good resources, and one I was keeping special track of shows
where the <a href="http://www.swpc.noaa.gov/pmap/pmapN.html">effects are the greatest</a>:
</p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="aurora_2010-08-04-14-49" border="0" alt="aurora_2010-08-04-14-49" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/AuroraMonitoringwithPowerShell_EC41/aurora_2010-08-04-14-49_3.gif" width="454" height="404" />
        </p>
        <div>
          <p>
Areas that are red are seeing the greatest magnetic activity.
</p>
          <p>
After refreshing this page a bunch last night and watching as the red started getting
closer and closer to Washington state. It was getting late and I still couldn’t see
it, so I decided instead to write a script to alert me when it peaked.
</p>
          <p>
This script measures the amount of red over (and above) Washington State, and keeps
monitoring until it senses a decrease. Once it senses a 5% decline, it alerts me.
Crude image recognition at its finest!
</p>
          <blockquote>
            <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
              <table border="0" cellspacing="0" cellpadding="5">
                <tbody>
                  <tr>
                    <td valign="top">
                      <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br />
014 
<br />
015 
<br />
016 
<br />
017 
<br />
018 
<br />
019 
<br />
020 
<br />
021 
<br />
022 
<br />
023 
<br />
024 
<br />
025 
<br />
026 
<br />
027 
<br />
028 
<br />
029 
<br />
030 
<br />
031 
<br />
032 
<br />
033 
<br />
034 
<br />
035 
<br />
036 
<br />
037 
<br />
038 
<br />
039 
<br />
040 
<br />
041 
<br />
042 
<br />
043 
<br />
044 
<br />
045 
<br />
046 
<br />
047 
<br />
048 
<br />
049 
<br />
050 
<br />
051 
<br />
052 
<br />
053 
<br />
054 
<br />
055 
<br />
056 
<br />
057 
<br />
058 
<br />
059 
<br />
060 
<br />
061 
<br />
062 
<br />
063 
<br />
064 
<br />
065 
<br />
066 
<br />
067 
<br />
068 
<br />
069 
<br />
070 
<br />
071 
<br />
072 
<br />
073 
<br />
074 
<br />
075 
<br />
076 
<br />
077 
<br />
078 
<br /></div>
                    </td>
                    <td valign="top" nowrap="nowrap">
                      <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                        <span style="color: #006400">##
Launch the interesting sites</span>
                        <br />
                        <span style="color: #0000ff">Start-Process</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">"http://www.swpc.noaa.gov/pmap/pmapN.html"</span>
                        <br />
                        <span style="color: #0000ff">Start-Process</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">"http://www.swpc.noaa.gov/rt_plots/pro_3d.html"</span>
                        <br />
                        <br />
                        <span style="color: #0000ff">Add-Type</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000080">-Assembly</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8a2be2">System.Drawing</span>
                        <br />
                        <span style="color: #ff4500">$wc</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #0000ff">New-Object</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8a2be2">System.Net.WebClient</span>
                        <br />
                        <br />
                        <span style="color: #006400">## The monitor region. Get these coordinates from the
X,Y positions</span>
                        <br />
                        <span style="color: #006400">## your mouse shows when hovering around any saved file
(pmapN.gif) in mspaint.</span>
                        <br />
                        <span style="color: #ff4500">$startX</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">130</span>
                        <br />
                        <span style="color: #ff4500">$startY</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">300</span>
                        <br />
                        <span style="color: #ff4500">$endX</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">144</span>
                        <br />
                        <span style="color: #ff4500">$endY</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">339</span>
                        <span style="color: #000000">
                        </span>
                        <br />
                        <br />
                        <span style="color: #006400">## Get the "Aurora Index" for the given region</span>
                        <br />
                        <span style="color: #00008b">function</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8a2be2">Get-AuroraIndex</span>
                        <br />
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #006400">##
Download the file</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$url</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">"http://www.swpc.noaa.gov/pmap/gif/pmapN.gif"</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$null</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #0000ff">New-Item</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000080">-Type</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8a2be2">Directory</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8a2be2">c:\temp\aurora</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000080">-Force</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$destination</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">"c:\temp\aurora\aurora_"</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">(</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #0000ff">Get-Date</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #a9a9a9">.</span>
                        <span style="color: #000000">ToString</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #8b0000">"yyyy-MM-dd-HH-mm"</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">".gif"</span>
                        <br />
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #00008b">try</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #ff4500">$wc</span>
                        <span style="color: #a9a9a9">.</span>
                        <span style="color: #000000">DownloadFile</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$url</span>
                        <span style="color: #a9a9a9">,</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$destination</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #00008b">catch</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">{</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #00008b">return</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <br />
                        <span style="color: #000000">    </span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$image</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #008080">[System.Drawing.Bitmap]</span>
                        <span style="color: #a9a9a9">::</span>
                        <span style="color: #000000">FromFile</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$destination</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$totalRed</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">0</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #00008b">for</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$x</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$startX</span>
                        <span style="color: #000000">;</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$x</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">-lt</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$endX</span>
                        <span style="color: #000000">;</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$x</span>
                        <span style="color: #a9a9a9">++</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #00008b">for</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$y</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$startY</span>
                        <span style="color: #000000">;</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$y</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">-lt</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$endY</span>
                        <span style="color: #000000">;</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$y</span>
                        <span style="color: #a9a9a9">++</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #ff4500">$totalRed</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$image</span>
                        <span style="color: #a9a9a9">.</span>
                        <span style="color: #000000">GetPixel</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$x</span>
                        <span style="color: #a9a9a9">,</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$y</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #a9a9a9">.</span>
                        <span style="color: #000000">R</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$totalRed</span>
                        <br />
                        <span style="color: #000000">}</span>
                        <br />
                        <br />
                        <br />
                        <span style="color: #ff4500">$lastValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$null</span>
                        <br />
                        <br />
                        <span style="color: #00008b">while</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$true</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #ff4500">$currentValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #0000ff">Get-AuroraIndex</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #00008b">if</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$currentValue</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #006400">##
Catch the rising aurora</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #00008b">if</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$currentValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">-gt</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$lastValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">*</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">1.05</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #ff4500">$lastValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">=</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #ff4500">$currentValue</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #8b0000">"Aurora
is rising @ "</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">(</span>
                        <span style="color: #0000ff">Get-Date</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">".
Current value: $currentValue"</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #006400">##
Catch a falling aurora</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #00008b">elseif</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$currentValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">-lt</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$lastValue</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">*</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">0.95</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #8b0000">"Aurora
is falling @ "</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">(</span>
                        <span style="color: #0000ff">Get-Date</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">".
Current value: $currentValue"</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #00008b">while</span>
                        <span style="color: #000000">(</span>
                        <span style="color: #ff4500">$true</span>
                        <span style="color: #000000">)</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">                </span>
                        <span style="color: #0000ff">C:\windows\Media\notify.wav</span>
                        <br />
                        <span style="color: #000000">                </span>
                        <span style="color: #0000ff">Start-Sleep</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">5</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #006400">##
Aurora is stable</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #00008b">else</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">{</span>
                        <br />
                        <span style="color: #000000">            </span>
                        <span style="color: #8b0000">"Aurora
is stable @ "</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #000000">(</span>
                        <span style="color: #0000ff">Get-Date</span>
                        <span style="color: #000000">)</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #a9a9a9">+</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #8b0000">".
Current value: $currentValue"</span>
                        <br />
                        <span style="color: #000000">        </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #000000">}</span>
                        <br />
                        <br />
                        <span style="color: #000000">    </span>
                        <span style="color: #0000ff">Start-Sleep</span>
                        <span style="color: #000000"> </span>
                        <span style="color: #800080">30</span>
                        <br />
                        <span style="color: #000000">}</span>
                      </div>
                    </td>
                  </tr>
                </tbody>
              </table>
            </div>
          </blockquote>
          <p>
          </p>
        </div>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=365e55e5-77aa-4129-9f41-07bc2bf21a53" />
      </body>
      <title>Aurora Monitoring with PowerShell</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,365e55e5-77aa-4129-9f41-07bc2bf21a53.aspx</guid>
      <link>http://www.leeholmes.com/blog/AuroraMonitoringWithPowerShell.aspx</link>
      <pubDate>Wed, 04 Aug 2010 23:58:59 GMT</pubDate>
      <description>&lt;p&gt;
Over the past few days, &lt;a href="http://spaceweather.com/"&gt;Astronomy resources&lt;/a&gt; have
been making a big splash about a couple of coronal mass ejections (CME) primed to
cause widespread visibility of the Aurora Borealis. Last night was when the first
one hit, and its effects extended deeply into southern Canada and parts of the northern
US.
&lt;/p&gt;
&lt;p&gt;
There may be another round tonight, so maybe this post can help you catch your first
Aurora :)
&lt;/p&gt;
&lt;p&gt;
NOAA has a couple of good resources, and one I was keeping special track of shows
where the &lt;a href="http://www.swpc.noaa.gov/pmap/pmapN.html"&gt;effects are the greatest&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="aurora_2010-08-04-14-49" border="0" alt="aurora_2010-08-04-14-49" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/AuroraMonitoringwithPowerShell_EC41/aurora_2010-08-04-14-49_3.gif" width="454" height="404" /&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;
Areas that are red are seeing the greatest magnetic activity.
&lt;/p&gt;
&lt;p&gt;
After refreshing this page a bunch last night and watching as the red started getting
closer and closer to Washington state. It was getting late and I still couldn’t see
it, so I decided instead to write a script to alert me when it peaked.
&lt;/p&gt;
&lt;p&gt;
This script measures the amount of red over (and above) Washington State, and keeps
monitoring until it senses a decrease. Once it senses a 5% decline, it alerts me.
Crude image recognition at its finest!
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
014 
&lt;br /&gt;
015 
&lt;br /&gt;
016 
&lt;br /&gt;
017 
&lt;br /&gt;
018 
&lt;br /&gt;
019 
&lt;br /&gt;
020 
&lt;br /&gt;
021 
&lt;br /&gt;
022 
&lt;br /&gt;
023 
&lt;br /&gt;
024 
&lt;br /&gt;
025 
&lt;br /&gt;
026 
&lt;br /&gt;
027 
&lt;br /&gt;
028 
&lt;br /&gt;
029 
&lt;br /&gt;
030 
&lt;br /&gt;
031 
&lt;br /&gt;
032 
&lt;br /&gt;
033 
&lt;br /&gt;
034 
&lt;br /&gt;
035 
&lt;br /&gt;
036 
&lt;br /&gt;
037 
&lt;br /&gt;
038 
&lt;br /&gt;
039 
&lt;br /&gt;
040 
&lt;br /&gt;
041 
&lt;br /&gt;
042 
&lt;br /&gt;
043 
&lt;br /&gt;
044 
&lt;br /&gt;
045 
&lt;br /&gt;
046 
&lt;br /&gt;
047 
&lt;br /&gt;
048 
&lt;br /&gt;
049 
&lt;br /&gt;
050 
&lt;br /&gt;
051 
&lt;br /&gt;
052 
&lt;br /&gt;
053 
&lt;br /&gt;
054 
&lt;br /&gt;
055 
&lt;br /&gt;
056 
&lt;br /&gt;
057 
&lt;br /&gt;
058 
&lt;br /&gt;
059 
&lt;br /&gt;
060 
&lt;br /&gt;
061 
&lt;br /&gt;
062 
&lt;br /&gt;
063 
&lt;br /&gt;
064 
&lt;br /&gt;
065 
&lt;br /&gt;
066 
&lt;br /&gt;
067 
&lt;br /&gt;
068 
&lt;br /&gt;
069 
&lt;br /&gt;
070 
&lt;br /&gt;
071 
&lt;br /&gt;
072 
&lt;br /&gt;
073 
&lt;br /&gt;
074 
&lt;br /&gt;
075 
&lt;br /&gt;
076 
&lt;br /&gt;
077 
&lt;br /&gt;
078 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #006400"&gt;##
Launch the interesting sites&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #0000ff"&gt;Start-Process&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;http://www.swpc.noaa.gov/pmap/pmapN.html&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #0000ff"&gt;Start-Process&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;http://www.swpc.noaa.gov/rt_plots/pro_3d.html&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0000ff"&gt;Add-Type&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Assembly&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Drawing&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$wc&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Net.WebClient&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## The monitor region. Get these coordinates from the
X,Y positions&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## your mouse shows when hovering around any saved file
(pmapN.gif) in mspaint.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$startX&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;130&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$startY&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;300&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$endX&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;144&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$endY&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;339&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Get the &amp;quot;Aurora Index&amp;quot; for the given region&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Get-AuroraIndex&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Download the file&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$url&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;http://www.swpc.noaa.gov/pmap/gif/pmapN.gif&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$null&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Type&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Directory&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;c:\temp\aurora&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Force&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$destination&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;c:\temp\aurora\aurora_&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;ToString&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;yyyy-MM-dd-HH-mm&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;.gif&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;try&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$wc&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;DownloadFile&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$url&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$destination&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$image&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[System.Drawing.Bitmap]&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;::&lt;/span&gt;&lt;span style="color: #000000"&gt;FromFile&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$destination&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$totalRed&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$x&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$startX&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$x&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$endX&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$x&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;for&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$y&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$startY&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$y&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$endY&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$y&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$totalRed&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$image&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;GetPixel&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$x&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$y&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;R&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$totalRed&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$lastValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$null&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get-AuroraIndex&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentValue&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Catch the rising aurora&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$lastValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;1.05&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$lastValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentValue&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;Aurora
is rising @ &amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;.
Current value: $currentValue&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Catch a falling aurora&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;elseif&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-lt&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$lastValue&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0.95&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;Aurora
is falling @ &amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;.
Current value: $currentValue&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;C:\windows\Media\notify.wav&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Start-Sleep&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;5&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Aurora is stable&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;else&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;Aurora
is stable @ &amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get-Date&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;.
Current value: $currentValue&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Start-Sleep&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;30&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=365e55e5-77aa-4129-9f41-07bc2bf21a53" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,365e55e5-77aa-4129-9f41-07bc2bf21a53.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=cabc8742-dc3e-45b0-9aea-2b120daf76d1</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,cabc8742-dc3e-45b0-9aea-2b120daf76d1.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,cabc8742-dc3e-45b0-9aea-2b120daf76d1.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=cabc8742-dc3e-45b0-9aea-2b120daf76d1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One instrument that’s got great allure is the <a href="http://en.wikipedia.org/wiki/Hang_(musical_instrument)">PanArt
Hang</a> – a metallic drum-like form with great complexity and resonance:
</p>
        <div style="padding-bottom: 0px; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:fedcd047-8cfa-4b42-bc06-729bf0f87a41" class="wlWriterEditableSmartContent">
          <div id="e4142553-7e7a-4dcc-9c35-017416c2cf22" style="margin: 0px; padding: 0px; display: inline;">
            <div>
              <a href="http://www.youtube.com/watch?v=UNJswfXKJ3s&amp;hl=en_US&amp;fs=1&amp;" target="_new">
                <img src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/HangDrumforPropellerheadsReason_1522/videoe9f86c93402d.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('e4142553-7e7a-4dcc-9c35-017416c2cf22'); downlevelDiv.innerHTML = &quot;&lt;div&gt;&lt;object width=\&quot;425\&quot; height=\&quot;355\&quot;&gt;&lt;param name=\&quot;movie\&quot; value=\&quot;http://www.youtube.com/v/UNJswfXKJ3s&amp;hl=en_US&amp;fs=1&amp;&amp;hl=en\&quot;&gt;&lt;\/param&gt;&lt;embed src=\&quot;http://www.youtube.com/v/UNJswfXKJ3s&amp;hl=en_US&amp;fs=1&amp;&amp;hl=en\&quot; type=\&quot;application/x-shockwave-flash\&quot; width=\&quot;425\&quot; height=\&quot;355\&quot;&gt;&lt;\/embed&gt;&lt;\/object&gt;&lt;\/div&gt;&quot;;" alt="" />
              </a>
            </div>
          </div>
        </div>
        <p>
They are difficult to obtain, and expensive should you want to try.
</p>
        <p>
Looking online, I found some WAV samples graciously provided by Andreas Bick at <a href="http://www.andreas-bick.de/en/downloads/film_music/hang_samples.php">http://www.andreas-bick.de/en/downloads/film_music/hang_samples.php</a>.
He also included the sampler settings to convert this to a virtual instrument for
Apple Logic Pro’s ESX-24 sampler.
</p>
        <p>
If you have Propellerhead Reason, the sampler settings won’t work – although you can
still use the raw WAV files and do your own mapping for the Reason NN-XT sampler.
Luckily, I spent the couple of hours doing it so that you don’t have to :) You can
get the files here:
</p>
        <p>
          <a title="http://cid-7874cfd565b38d4b.office.live.com/browse.aspx/Shared/Hang%20Drum%20for%20Reason%20NN-XT" href="http://cid-7874cfd565b38d4b.office.live.com/browse.aspx/Shared/Hang%20Drum%20for%20Reason%20NN-XT">http://cid-7874cfd565b38d4b.office.live.com/browse.aspx/Shared/Hang%20Drum%20for%20Reason%20NN-XT</a>
        </p>
        <p>
If you don’t have the WAV samples, you’ll need to download the entire ZIP and extract
it. It’s in 7-zip format, since I couldn’t get regular zip files to go below the 50MB
limit on SkyDrive. If you have the WAV files already, you only need the .sxt file
also in the directory.
</p>
        <p>
I also put up a Reason project (Egyptian Mystery.rns) for a song that uses only this
instrument: <a href="http://pn0u8g.blu.livefilestore.com/y1prlw9sTA3UsMLb9NOAryYICFwqZrcF9YJtQTquSuPuOXB_zshsfWQZ5x1GqsOMzP9rDp3Yq84FolE7VpEmXIDPjeovtg8bT0g/Egyptian%20Mystery.mp3?download&amp;psid=1">Egyptian
Mystery</a>.
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=cabc8742-dc3e-45b0-9aea-2b120daf76d1" />
      </body>
      <title>Hang Drum for Propellerheads Reason</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,cabc8742-dc3e-45b0-9aea-2b120daf76d1.aspx</guid>
      <link>http://www.leeholmes.com/blog/HangDrumForPropellerheadsReason.aspx</link>
      <pubDate>Thu, 17 Jun 2010 08:27:20 GMT</pubDate>
      <description>&lt;p&gt;
One instrument that’s got great allure is the &lt;a href="http://en.wikipedia.org/wiki/Hang_(musical_instrument)"&gt;PanArt
Hang&lt;/a&gt; – a metallic drum-like form with great complexity and resonance:
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:fedcd047-8cfa-4b42-bc06-729bf0f87a41" class="wlWriterEditableSmartContent"&gt;
&lt;div id="e4142553-7e7a-4dcc-9c35-017416c2cf22" style="margin: 0px; padding: 0px; display: inline;"&gt;
&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=UNJswfXKJ3s&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" target="_new"&gt;&lt;img src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/HangDrumforPropellerheadsReason_1522/videoe9f86c93402d.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('e4142553-7e7a-4dcc-9c35-017416c2cf22'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/UNJswfXKJ3s&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/UNJswfXKJ3s&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
They are difficult to obtain, and expensive should you want to try.
&lt;/p&gt;
&lt;p&gt;
Looking online, I found some WAV samples graciously provided by Andreas Bick at &lt;a href="http://www.andreas-bick.de/en/downloads/film_music/hang_samples.php"&gt;http://www.andreas-bick.de/en/downloads/film_music/hang_samples.php&lt;/a&gt;.
He also included the sampler settings to convert this to a virtual instrument for
Apple Logic Pro’s ESX-24 sampler.
&lt;/p&gt;
&lt;p&gt;
If you have Propellerhead Reason, the sampler settings won’t work – although you can
still use the raw WAV files and do your own mapping for the Reason NN-XT sampler.
Luckily, I spent the couple of hours doing it so that you don’t have to :) You can
get the files here:
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://cid-7874cfd565b38d4b.office.live.com/browse.aspx/Shared/Hang%20Drum%20for%20Reason%20NN-XT" href="http://cid-7874cfd565b38d4b.office.live.com/browse.aspx/Shared/Hang%20Drum%20for%20Reason%20NN-XT"&gt;http://cid-7874cfd565b38d4b.office.live.com/browse.aspx/Shared/Hang%20Drum%20for%20Reason%20NN-XT&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you don’t have the WAV samples, you’ll need to download the entire ZIP and extract
it. It’s in 7-zip format, since I couldn’t get regular zip files to go below the 50MB
limit on SkyDrive. If you have the WAV files already, you only need the .sxt file
also in the directory.
&lt;/p&gt;
&lt;p&gt;
I also put up a Reason project (Egyptian Mystery.rns) for a song that uses only this
instrument: &lt;a href="http://pn0u8g.blu.livefilestore.com/y1prlw9sTA3UsMLb9NOAryYICFwqZrcF9YJtQTquSuPuOXB_zshsfWQZ5x1GqsOMzP9rDp3Yq84FolE7VpEmXIDPjeovtg8bT0g/Egyptian%20Mystery.mp3?download&amp;amp;psid=1"&gt;Egyptian
Mystery&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=cabc8742-dc3e-45b0-9aea-2b120daf76d1" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,cabc8742-dc3e-45b0-9aea-2b120daf76d1.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=6776713b-a80c-4138-83a3-e08c3b688b84</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,6776713b-a80c-4138-83a3-e08c3b688b84.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,6776713b-a80c-4138-83a3-e08c3b688b84.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6776713b-a80c-4138-83a3-e08c3b688b84</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
An interesting question came up today about the Set-AuthenticodeSignature cmdlet.
It actually supports more than just .ps1 files, but what files exactly?
</p>
        <p>
It turns out that this isn’t actually possible to know programmatically. Your best
bet is to hard-code a list of things you know or can scrounge from the internet :)
The ones I am aware of off-hand are:
</p>
        <blockquote>
          <p>
.CAB, PE formats (.EXE, .DLL, etc) , .CAT, .MSI, .JAR,.OCX, .PS1, .PSM1, .PSD1, .PS1XML,
.PSC1
</p>
        </blockquote>
        <p>
Windows’ Authenticode infrastructure is based on plugins. All DLLs that support Authenticode
signing are registered under:
</p>
        <blockquote>
          <p>
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg
</p>
        </blockquote>
        <p>
Each DLL has a set of messages it needs to respond to, one of which is called IsMyFileType().
When you want to sign a file or verify the signature on a file, Windows walks along
that list of registered GUIDs, asking each DLL: “Is this your file type?” If a DLL
responds “Yes”, then it gets asked to verify the signature of that file.
</p>
        <p>
The important point is that this decision is implemented as compiled code in the DLL,
not some external mapping table.
</p>
        <p>
Interesting aside:
</p>
        <p>
This “ordered by GUID” enumeration of Authenticode plugins was the cause of our “RC1
Refresh” if you remember our initial V1 release. It turns out that the sample code
from which we based our original Monad Authenticode DLL had a bug where it answered
“Yes” to every file type. This never showed up because we had a GUID late in the chain.
During the Monad-to-PowerShell rename, an obscure typo (capitalization of a single
letter) caused our GUID to get registered as NULL.
</p>
        <p>
Now, with a NULL GUID, our Authenticode plugin was guaranteed to be enumerated first.
Since our plugin said that it understood how to manage signatures for all files on
Windows, this broke MSI signing, EXE signing, DLL signing, and a bunch of other fun
stuff!
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=6776713b-a80c-4138-83a3-e08c3b688b84" />
      </body>
      <title>Which Files Support Authenticode Signatures?</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,6776713b-a80c-4138-83a3-e08c3b688b84.aspx</guid>
      <link>http://www.leeholmes.com/blog/WhichFilesSupportAuthenticodeSignatures.aspx</link>
      <pubDate>Thu, 03 Jun 2010 15:33:13 GMT</pubDate>
      <description>&lt;p&gt;
An interesting question came up today about the Set-AuthenticodeSignature cmdlet.
It actually supports more than just .ps1 files, but what files exactly?
&lt;/p&gt;
&lt;p&gt;
It turns out that this isn’t actually possible to know programmatically. Your best
bet is to hard-code a list of things you know or can scrounge from the internet :)
The ones I am aware of off-hand are:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
.CAB, PE formats (.EXE, .DLL, etc) , .CAT, .MSI, .JAR,.OCX, .PS1, .PSM1, .PSD1, .PS1XML,
.PSC1
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Windows’ Authenticode infrastructure is based on plugins. All DLLs that support Authenticode
signing are registered under:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Each DLL has a set of messages it needs to respond to, one of which is called IsMyFileType().
When you want to sign a file or verify the signature on a file, Windows walks along
that list of registered GUIDs, asking each DLL: “Is this your file type?” If a DLL
responds “Yes”, then it gets asked to verify the signature of that file.
&lt;/p&gt;
&lt;p&gt;
The important point is that this decision is implemented as compiled code in the DLL,
not some external mapping table.
&lt;/p&gt;
&lt;p&gt;
Interesting aside:
&lt;/p&gt;
&lt;p&gt;
This “ordered by GUID” enumeration of Authenticode plugins was the cause of our “RC1
Refresh” if you remember our initial V1 release. It turns out that the sample code
from which we based our original Monad Authenticode DLL had a bug where it answered
“Yes” to every file type. This never showed up because we had a GUID late in the chain.
During the Monad-to-PowerShell rename, an obscure typo (capitalization of a single
letter) caused our GUID to get registered as NULL.
&lt;/p&gt;
&lt;p&gt;
Now, with a NULL GUID, our Authenticode plugin was guaranteed to be enumerated first.
Since our plugin said that it understood how to manage signatures for all files on
Windows, this broke MSI signing, EXE signing, DLL signing, and a bunch of other fun
stuff!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=6776713b-a80c-4138-83a3-e08c3b688b84" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,6776713b-a80c-4138-83a3-e08c3b688b84.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=c50e302a-d606-4cf7-ac8a-51728c52249e</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,c50e302a-d606-4cf7-ac8a-51728c52249e.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,c50e302a-d606-4cf7-ac8a-51728c52249e.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c50e302a-d606-4cf7-ac8a-51728c52249e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
With the first draft of the Windows PowerShell Cookbook complete, we’re running an
open beta through a cutting-edge platform called the Open Feedback Publishing System: <a href="http://powershell.labs.oreilly.com">http://powershell.labs.oreilly.com</a>.
In this system, we put the entire book online and let you read to your heart’s content.
</p>
        <p>
Not only is the book available online, but you can also influence its future. The
Open Feedback Publishing System lets you attach comments to any paragraph as though
you would comment on a blog.
</p>
        <p>
If you are interested in participating in the deeper technical review of the book,
welcome aboard! If you have expertise in a specific chapter, please concentrate on
that one first, making a comment on its first paragraph that you will be reviewing
it. If you have more general expertise or interest, please first select a chapter
that has not been reviewed, making a comment on the first paragraph that you will
be reviewing it.
</p>
        <p>
To start, visit <a href="http://powershell.labs.oreilly.com">http://powershell.labs.oreilly.com</a>,
create a new account, and start submitting feedback! The Open Feedback Publishing
System <a href="http://labs.oreilly.com/ofps.html">overview page</a> gives more information
on how to contribute. Reviewers that provide significant feedback get a chance to
see the impact of their comments on bookshelves worldwide, and will receive a complimentary
copy of the book when it goes to press. We’ll be accepting comments until roughly
the end of March.
</p>
        <p>
Enjoy!
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=c50e302a-d606-4cf7-ac8a-51728c52249e" />
      </body>
      <title>Open PowerShell Cookbook Beta Available Online</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,c50e302a-d606-4cf7-ac8a-51728c52249e.aspx</guid>
      <link>http://www.leeholmes.com/blog/OpenPowerShellCookbookBetaAvailableOnline.aspx</link>
      <pubDate>Fri, 19 Mar 2010 18:35:34 GMT</pubDate>
      <description>&lt;p&gt;
With the first draft of the Windows PowerShell Cookbook complete, we’re running an
open beta through a cutting-edge platform called the Open Feedback Publishing System: &lt;a href="http://powershell.labs.oreilly.com"&gt;http://powershell.labs.oreilly.com&lt;/a&gt;.
In this system, we put the entire book online and let you read to your heart’s content.
&lt;/p&gt;
&lt;p&gt;
Not only is the book available online, but you can also influence its future. The
Open Feedback Publishing System lets you attach comments to any paragraph as though
you would comment on a blog.
&lt;/p&gt;
&lt;p&gt;
If you are interested in participating in the deeper technical review of the book,
welcome aboard! If you have expertise in a specific chapter, please concentrate on
that one first, making a comment on its first paragraph that you will be reviewing
it. If you have more general expertise or interest, please first select a chapter
that has not been reviewed, making a comment on the first paragraph that you will
be reviewing it.
&lt;/p&gt;
&lt;p&gt;
To start, visit &lt;a href="http://powershell.labs.oreilly.com"&gt;http://powershell.labs.oreilly.com&lt;/a&gt;,
create a new account, and start submitting feedback! The Open Feedback Publishing
System &lt;a href="http://labs.oreilly.com/ofps.html"&gt;overview page&lt;/a&gt; gives more information
on how to contribute. Reviewers that provide significant feedback get a chance to
see the impact of their comments on bookshelves worldwide, and will receive a complimentary
copy of the book when it goes to press. We’ll be accepting comments until roughly
the end of March.
&lt;/p&gt;
&lt;p&gt;
Enjoy!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=c50e302a-d606-4cf7-ac8a-51728c52249e" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,c50e302a-d606-4cf7-ac8a-51728c52249e.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=bfa0121d-7e57-4979-8862-f2db88a96aba</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,bfa0121d-7e57-4979-8862-f2db88a96aba.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,bfa0121d-7e57-4979-8862-f2db88a96aba.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bfa0121d-7e57-4979-8862-f2db88a96aba</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I had to do some deep data extraction from a web page today, and naturally leaned
on PowerShell for some assistance. PowerShell is a great language for text munging,
and web content is no different. There are tons of examples online, but here’s an
example from earlier in this blog: <a title="http://www.leeholmes.com/blog/PowerShellTheOracleInstantAnswersFromYourPrompt.aspx" href="http://www.leeholmes.com/blog/PowerShellTheOracleInstantAnswersFromYourPrompt.aspx">http://www.leeholmes.com/blog/PowerShellTheOracleInstantAnswersFromYourPrompt.aspx</a>.
</p>
        <p>
As I looked at the underlying HTML of this page, though, my heart sank. I cared about
four pieces of data, and they were arranged without much structure on the web page.
The information I cared about was in a couple of different tables, a couple of different
table rows, and sometimes in different columns. You can parse your way around this,
but it’s simply error-prone and annoying.
</p>
        <p>
At that point, I remembered something called the <a href="http://htmlagilitypack.codeplex.com/">HTML
Agility Pack</a> that I’ve been meaning to experiment with for some time. The HTML
Agility Pack lets you navigate an HTML document as though it were well-formed XML,
even though the underlying HTML usually isn’t. It doesn’t leverage PowerShell’s XML
adapter, but the .NET objects act just like the XML classes from the .NET Framework.
</p>
        <p>
On the down-side, data navigation and selection in XML comes via the XPath language.
Like Regular Expressions, XPath queries are an esoteric art and difficult to get right.
Luckily, you don’t need much knowledge of XPath for simple XML navigation.
</p>
        <p>
This whole experience gives a great example of the “admin development model.” 15 minutes
after thinking about parsing the web page with the HTML Agility Pack, I had a working
version. PowerShell’s Get-Member cmdlet was all I used for discovery – no documentation
was harmed in the making of this script. Here is the literal text of my history buffer,
experimentation and all. On line 251 and 252, I put the history into the ISE so that
I can hack out the experimentation bits and keep the stuff that worked.
</p>
        <blockquote>
          <p>
            <font size="1" face="Courier New">221 cd C:\temp\HtmlAgilityPack.1.4.0.beta2.binaries 
<br />
222 dir 
<br />
223 add-type -Path .\HtmlAgilityPack.dll 
<br />
224 $types = add-type -Path .\HtmlAgilityPack.dll -PassThru 
<br />
225 $types 
<br />
226 $types | ? { $_.IsPublic } 
<br />
227 $doc = new-object HtmlWeb 
<br />
228 ($types | ? { $_.IsPublic })[1] 
<br />
229 ($types | ? { $_.IsPublic })[1].FullName 
<br />
230 $doc = New-Object HtmlAgilityPack.HtmlDocument 
<br />
231 $doc 
<br />
232 $doc | gm 
<br />
233 $result = $doc.Load("C:\temp\texts.html") 
<br />
234 $result 
<br />
235 $doc 
<br />
236 $doc | gm 
<br />
237 $doc.DocumentNode 
<br />
238 $doc.DocumentNode | gm 
<br />
239 $doc.DocumentNode.SelectNodes("//h1") 
<br />
240 $doc.DocumentNode.SelectNodes("//table[@class='table-gen']") 
<br />
241 $doc.DocumentNode.SelectNodes("//table[@class='table-gen']/tr[2]") 
<br />
242 $doc.DocumentNode.SelectNodes("//table[@class='table-gen']") 
<br />
243 $texts = $doc.DocumentNode.SelectNodes("//table[@class='table-gen']") 
<br />
244 $texts[0] 
<br />
245 $testText = $texts[0] 
<br />
246 $testText | clip 
<br />
247 $testText.SelectSingleNode("/tr[1]/td") 
<br />
248 $testText.SelectSingleNode("tr[1]/td") 
<br />
249 $testText.SelectSingleNode("tr[1]/td").InnerTExt 
<br />
250 $testText.SelectSingleNode("tr[1]/td").InnerText.Trim() 
<br />
251 ise 
<br />
252 h 
<br />
253 $time = [DateTime] $testText.SelectSingleNode("tr[1]/td").InnerText.Trim() 
<br />
254 $testText.SelectSingleNode("tr[2]/td").InnerText.Trim() 
<br />
255 $testText.SelectSingleNode("tr[2]/td").InnerText.Replace('Description:','').Trim() 
<br />
256 $testText.SelectSingleNode("tr[6]/td").InnerText 
<br />
257 $testText.SelectSingleNode("tr[5]/td").InnerText 
<br />
258 $testText.SelectSingleNode("tr[4]/td").InnerText 
<br />
259 $testText.SelectSingleNode("tr[5]/td").InnerText 
<br />
260 $testText.SelectSingleNode("tr[5]/td[1]") 
<br />
261 $testText.SelectSingleNode("tr[5]/td[2]") 
<br />
262 $time = $testText.SelectSingleNode("tr[1]/td").InnerText.Trim() 
<br />
263 $inOut = $testText.SelectSingleNode("tr[2]/td").InnerText.Replace('Description:',... 
<br />
264 $to = $testText.SelectSingleNode("tr[5]/td").InnerText.Replace('Number
Called:','... 
<br />
265 $from = $testText.SelectSingleNode("tr[5]/td[2]").InnerText.Replace('Calling
Numb... 
<br />
266 New-Object PsObject -Property @{ Time = $time; Type = $inOut; From = $from; To
= ... 
<br />
267 New-Object PsObject -Property @{ Time = $time; Type = $inOut; From = $from; To
= ... 
<br />
268 $texts | % {... 
<br />
269 C:\temp\textparser.ps1</font>
          </p>
        </blockquote>
        <p>
The final script:
</p>
        <blockquote>
          <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
            <table border="0" cellspacing="0" cellpadding="5">
              <tbody>
                <tr>
                  <td valign="top">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br />
014 
<br />
015 
<br />
016 
<br />
017 
<br />
018 
<br />
019 
<br />
020 
<br /></div>
                  </td>
                  <td valign="top" nowrap="nowrap">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                      <span style="color: #0000ff">cd</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">C:\temp\HtmlAgilityPack.1.4.0.beta2.binaries</span>
                      <br />
                      <span style="color: #0000ff">add-type</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-Path</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">.\HtmlAgilityPack.dll</span>
                      <br />
                      <span style="color: #ff4500">$doc</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">New-Object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">HtmlAgilityPack.HtmlDocument</span>
                      <br />
                      <span style="color: #ff4500">$result</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$doc</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Load</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"C:\temp\texts.html"</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #ff4500">$texts</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$doc</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">DocumentNode</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">SelectNodes</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"//table[@class='table-gen']"</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$result</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$texts</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">%</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$testText</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$_</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$time</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$testText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">SelectSingleNode</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"tr[1]/td"</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">InnerText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Trim</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$time</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$time</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">TrimEnd</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"
CST"</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$time</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">(</span>
                      <span style="color: #008080">[DateTime]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$time</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">AddHours</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #800080">-2</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$inOut</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$testText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">SelectSingleNode</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"tr[2]/td"</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">InnerText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Replace</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">'Description:'</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #8b0000">''</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Trim</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$to</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$testText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">SelectSingleNode</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"tr[5]/td"</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">InnerText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Replace</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">'Number
Called:'</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #8b0000">''</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Trim</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$from</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$testText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">SelectSingleNode</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"tr[5]/td[2]"</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">InnerText</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Replace</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">'Calling
Number:'</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #8b0000">''</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Trim</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #0000ff">New-Object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">PsObject</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-Property</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">@{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">Time</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$time</span>
                      <span style="color: #000000">;</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">Type</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$inOut</span>
                      <span style="color: #000000">;</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">From</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$from</span>
                      <span style="color: #000000">;</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">To</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$to</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #0000ff">Select</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">From</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #8a2be2">To</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #8a2be2">Type</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #8a2be2">Time</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$result</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Sort</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">Time</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">ft</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-auto</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">out-string</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-width</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">75</span>
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <p>
All in all, the HTML Agility Pack is a very attractive approach that I plan to start
using more often.
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=bfa0121d-7e57-4979-8862-f2db88a96aba" />
      </body>
      <title>HTML Agility Pack Rocks Your Screen Scraping World</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,bfa0121d-7e57-4979-8862-f2db88a96aba.aspx</guid>
      <link>http://www.leeholmes.com/blog/HTMLAgilityPackRocksYourScreenScrapingWorld.aspx</link>
      <pubDate>Fri, 05 Mar 2010 08:24:20 GMT</pubDate>
      <description>&lt;p&gt;
I had to do some deep data extraction from a web page today, and naturally leaned
on PowerShell for some assistance. PowerShell is a great language for text munging,
and web content is no different. There are tons of examples online, but here’s an
example from earlier in this blog: &lt;a title="http://www.leeholmes.com/blog/PowerShellTheOracleInstantAnswersFromYourPrompt.aspx" href="http://www.leeholmes.com/blog/PowerShellTheOracleInstantAnswersFromYourPrompt.aspx"&gt;http://www.leeholmes.com/blog/PowerShellTheOracleInstantAnswersFromYourPrompt.aspx&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
As I looked at the underlying HTML of this page, though, my heart sank. I cared about
four pieces of data, and they were arranged without much structure on the web page.
The information I cared about was in a couple of different tables, a couple of different
table rows, and sometimes in different columns. You can parse your way around this,
but it’s simply error-prone and annoying.
&lt;/p&gt;
&lt;p&gt;
At that point, I remembered something called the &lt;a href="http://htmlagilitypack.codeplex.com/"&gt;HTML
Agility Pack&lt;/a&gt; that I’ve been meaning to experiment with for some time. The HTML
Agility Pack lets you navigate an HTML document as though it were well-formed XML,
even though the underlying HTML usually isn’t. It doesn’t leverage PowerShell’s XML
adapter, but the .NET objects act just like the XML classes from the .NET Framework.
&lt;/p&gt;
&lt;p&gt;
On the down-side, data navigation and selection in XML comes via the XPath language.
Like Regular Expressions, XPath queries are an esoteric art and difficult to get right.
Luckily, you don’t need much knowledge of XPath for simple XML navigation.
&lt;/p&gt;
&lt;p&gt;
This whole experience gives a great example of the “admin development model.” 15 minutes
after thinking about parsing the web page with the HTML Agility Pack, I had a working
version. PowerShell’s Get-Member cmdlet was all I used for discovery – no documentation
was harmed in the making of this script. Here is the literal text of my history buffer,
experimentation and all. On line 251 and 252, I put the history into the ISE so that
I can hack out the experimentation bits and keep the stuff that worked.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font size="1" face="Courier New"&gt;221 cd C:\temp\HtmlAgilityPack.1.4.0.beta2.binaries 
&lt;br /&gt;
222 dir 
&lt;br /&gt;
223 add-type -Path .\HtmlAgilityPack.dll 
&lt;br /&gt;
224 $types = add-type -Path .\HtmlAgilityPack.dll -PassThru 
&lt;br /&gt;
225 $types 
&lt;br /&gt;
226 $types | ? { $_.IsPublic } 
&lt;br /&gt;
227 $doc = new-object HtmlWeb 
&lt;br /&gt;
228 ($types | ? { $_.IsPublic })[1] 
&lt;br /&gt;
229 ($types | ? { $_.IsPublic })[1].FullName 
&lt;br /&gt;
230 $doc = New-Object HtmlAgilityPack.HtmlDocument 
&lt;br /&gt;
231 $doc 
&lt;br /&gt;
232 $doc | gm 
&lt;br /&gt;
233 $result = $doc.Load(&amp;quot;C:\temp\texts.html&amp;quot;) 
&lt;br /&gt;
234 $result 
&lt;br /&gt;
235 $doc 
&lt;br /&gt;
236 $doc | gm 
&lt;br /&gt;
237 $doc.DocumentNode 
&lt;br /&gt;
238 $doc.DocumentNode | gm 
&lt;br /&gt;
239 $doc.DocumentNode.SelectNodes(&amp;quot;//h1&amp;quot;) 
&lt;br /&gt;
240 $doc.DocumentNode.SelectNodes(&amp;quot;//table[@class='table-gen']&amp;quot;) 
&lt;br /&gt;
241 $doc.DocumentNode.SelectNodes(&amp;quot;//table[@class='table-gen']/tr[2]&amp;quot;) 
&lt;br /&gt;
242 $doc.DocumentNode.SelectNodes(&amp;quot;//table[@class='table-gen']&amp;quot;) 
&lt;br /&gt;
243 $texts = $doc.DocumentNode.SelectNodes(&amp;quot;//table[@class='table-gen']&amp;quot;) 
&lt;br /&gt;
244 $texts[0] 
&lt;br /&gt;
245 $testText = $texts[0] 
&lt;br /&gt;
246 $testText | clip 
&lt;br /&gt;
247 $testText.SelectSingleNode(&amp;quot;/tr[1]/td&amp;quot;) 
&lt;br /&gt;
248 $testText.SelectSingleNode(&amp;quot;tr[1]/td&amp;quot;) 
&lt;br /&gt;
249 $testText.SelectSingleNode(&amp;quot;tr[1]/td&amp;quot;).InnerTExt 
&lt;br /&gt;
250 $testText.SelectSingleNode(&amp;quot;tr[1]/td&amp;quot;).InnerText.Trim() 
&lt;br /&gt;
251 ise 
&lt;br /&gt;
252 h 
&lt;br /&gt;
253 $time = [DateTime] $testText.SelectSingleNode(&amp;quot;tr[1]/td&amp;quot;).InnerText.Trim() 
&lt;br /&gt;
254 $testText.SelectSingleNode(&amp;quot;tr[2]/td&amp;quot;).InnerText.Trim() 
&lt;br /&gt;
255 $testText.SelectSingleNode(&amp;quot;tr[2]/td&amp;quot;).InnerText.Replace('Description:','').Trim() 
&lt;br /&gt;
256 $testText.SelectSingleNode(&amp;quot;tr[6]/td&amp;quot;).InnerText 
&lt;br /&gt;
257 $testText.SelectSingleNode(&amp;quot;tr[5]/td&amp;quot;).InnerText 
&lt;br /&gt;
258 $testText.SelectSingleNode(&amp;quot;tr[4]/td&amp;quot;).InnerText 
&lt;br /&gt;
259 $testText.SelectSingleNode(&amp;quot;tr[5]/td&amp;quot;).InnerText 
&lt;br /&gt;
260 $testText.SelectSingleNode(&amp;quot;tr[5]/td[1]&amp;quot;) 
&lt;br /&gt;
261 $testText.SelectSingleNode(&amp;quot;tr[5]/td[2]&amp;quot;) 
&lt;br /&gt;
262 $time = $testText.SelectSingleNode(&amp;quot;tr[1]/td&amp;quot;).InnerText.Trim() 
&lt;br /&gt;
263 $inOut = $testText.SelectSingleNode(&amp;quot;tr[2]/td&amp;quot;).InnerText.Replace('Description:',... 
&lt;br /&gt;
264 $to = $testText.SelectSingleNode(&amp;quot;tr[5]/td&amp;quot;).InnerText.Replace('Number
Called:','... 
&lt;br /&gt;
265 $from = $testText.SelectSingleNode(&amp;quot;tr[5]/td[2]&amp;quot;).InnerText.Replace('Calling
Numb... 
&lt;br /&gt;
266 New-Object PsObject -Property @{ Time = $time; Type = $inOut; From = $from; To
= ... 
&lt;br /&gt;
267 New-Object PsObject -Property @{ Time = $time; Type = $inOut; From = $from; To
= ... 
&lt;br /&gt;
268 $texts | % {... 
&lt;br /&gt;
269 C:\temp\textparser.ps1&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
The final script:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
014 
&lt;br /&gt;
015 
&lt;br /&gt;
016 
&lt;br /&gt;
017 
&lt;br /&gt;
018 
&lt;br /&gt;
019 
&lt;br /&gt;
020 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #0000ff"&gt;cd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;C:\temp\HtmlAgilityPack.1.4.0.beta2.binaries&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #0000ff"&gt;add-type&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;.\HtmlAgilityPack.dll&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$doc&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;HtmlAgilityPack.HtmlDocument&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$result&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$doc&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Load&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;C:\temp\texts.html&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$texts&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$doc&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;DocumentNode&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;SelectNodes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;//table[@class='table-gen']&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$result&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$texts&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$testText&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$_&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$time&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$testText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;SelectSingleNode&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;tr[1]/td&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;InnerText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Trim&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$time&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$time&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;TrimEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;
CST&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$time&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #008080"&gt;[DateTime]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$time&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;AddHours&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;-2&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inOut&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$testText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;SelectSingleNode&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;tr[2]/td&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;InnerText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Replace&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;'Description:'&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #8b0000"&gt;''&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Trim&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$to&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$testText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;SelectSingleNode&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;tr[5]/td&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;InnerText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Replace&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;'Number
Called:'&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #8b0000"&gt;''&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Trim&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$from&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$testText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;SelectSingleNode&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;tr[5]/td[2]&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;InnerText&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Replace&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;'Calling
Number:'&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #8b0000"&gt;''&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Trim&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;PsObject&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Property&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;@{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;Time&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$time&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;Type&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inOut&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;From&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$from&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;To&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$to&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;From&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;To&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Type&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Time&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$result&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sort&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Time&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-auto&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;out-string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-width&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;75&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
All in all, the HTML Agility Pack is a very attractive approach that I plan to start
using more often.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=bfa0121d-7e57-4979-8862-f2db88a96aba" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,bfa0121d-7e57-4979-8862-f2db88a96aba.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=674b87e5-99f0-4b1b-9443-ff8c3eaec7d6</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,674b87e5-99f0-4b1b-9443-ff8c3eaec7d6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,674b87e5-99f0-4b1b-9443-ff8c3eaec7d6.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=674b87e5-99f0-4b1b-9443-ff8c3eaec7d6</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I recently got a cool USB MIDI keyboard (M-Audio Axiom 49) and software (Propellerhead
Reason) combo that lets me play keyboard with all kinds of cool sounds effects and
general fun. Despite how cool the system is, it’s not quite as spontaneous as a plain
ol’ electronic keyboard. Just to piddle around for a bit, you have to turn on the
keyboard, launch Reason, create a new song, add a virtual instrument, and then start
playing.
</p>
        <p>
How can PowerShell of all things help the anguish of a struggling keyboard hack?
</p>
        <p>
The answer comes in two parts – creating a template song, and then having PowerShell
launch it when you turn on the keyboard.
</p>
        <p>
It turns out that you can resolve a lot of the issues in Reason by just creating a
good starter song. Add in the mixer, a synthesizer, and save it to disk – I called
it “Default.rns.” When you double-click on this file, Reason starts up with all of
the presets you had configured.
</p>
        <p>
The second part is more tricky, unless of course you happen to have Real Ultimate
Power.
</p>
        <p>
The core of this solution comes in three parts:
</p>
        <ol>
          <li>
WMI lets you enumerate USB devices on the system.</li>
          <li>
The Register-WmiEvent cmdlet lets you respond to WMI events.</li>
          <li>
WMI has a default __InstanceCreationEvent class that lets you respond to ANY new instance
being created (Services, Processes, etc.)</li>
        </ol>
        <p>
The answer to #1 has come up a few times on the Team Blog:
</p>
        <p>
          <a title="http://blogs.msdn.com/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx" href="http://blogs.msdn.com/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx">http://blogs.msdn.com/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx</a>
          <br />
          <a title="http://blogs.msdn.com/powershell/archive/2009/01/10/get-usb-using-wmi-association-classes-in-powershell.aspx" href="http://blogs.msdn.com/powershell/archive/2009/01/10/get-usb-using-wmi-association-classes-in-powershell.aspx">http://blogs.msdn.com/powershell/archive/2009/01/10/get-usb-using-wmi-association-classes-in-powershell.aspx</a>
        </p>
        <p>
I had no idea what the Axiom keyboard was being recognized as, so I did the easy thing.
Ran the query once, turned off the keyboard, and then ran it again. Compare-Object
to the rescue:
</p>
        <blockquote>
          <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
            <table border="0" cellspacing="0" cellpadding="5">
              <tbody>
                <tr>
                  <td valign="top">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br /></div>
                  </td>
                  <td valign="top" nowrap="nowrap">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                      <span style="color: #ff4500">$before</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">gwmi</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">Win32_USBControllerDevice</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #0000ff">%</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[wmi]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$_</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Dependent</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #ff4500">$after</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">gwmi</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">Win32_USBControllerDevice</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #0000ff">%</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[wmi]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$_</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Dependent</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #0000ff">Compare-Object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$before</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$after</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-PassThru</span>
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <p>
That gives an object like:
</p>
        <blockquote>
          <p>
            <font size="1" face="Courier New">Availability               
: 
<br />
Caption                    
: USB Axiom 49 
<br />
ClassGuid                  
: {4d36e96c-e325-11ce-bfc1-08002be10318} 
<br />
CompatibleID               
: {USB\Class_01&amp;SubClass_01&amp;Prot_00, USB\Class_01&amp;SubClass_01, USB\Class_01} 
<br />
ConfigManagerErrorCode      : 0 
<br />
ConfigManagerUserConfig     : False 
<br />
CreationClassName           : Win32_PnPEntity 
<br />
Description                
: USB Audio Device 
<br />
DeviceID                   
: USB\VID_0763&amp;PID_0199&amp;MI_00\6&amp;2F841C5F&amp;0&amp;0000 
<br />
ErrorCleared               
: 
<br />
ErrorDescription           
: 
<br />
HardwareID                 
: {USB\VID_0763&amp;PID_0199&amp;REV_0105&amp;MI_00, USB\VID_0763&amp;PID_0199&amp;MI_00} 
<br />
InstallDate                
: 
<br />
LastErrorCode              
: 
<br />
Manufacturer               
: (Generic USB Audio) 
<br />
Name                       
: USB Axiom 49 
<br />
PNPDeviceID                
: USB\VID_0763&amp;PID_0199&amp;MI_00\6&amp;2F841C5F&amp;0&amp;0000</font>
          </p>
        </blockquote>
        <p>
There’s the ticket. It’s actually a Win32_PnpEntity. While the previous WMI query
helped us discover USB entities, now that we know how the keyboard is identified to
the system, we can drop the complicated WMI dependency traversal, and turn this specific
goal into a simpler query:
</p>
        <blockquote>
          <p>
            <font size="1" face="Courier New">Get-WmiObject Win32_PnPEntity –Filter "Name='USB
Axiom 49'"</font>
          </p>
        </blockquote>
        <p>
Now that we know which WMI class represents the keyboard, and the query that selects
it specifically, we can use WMI’s __InstanceCreationEvent to monitor for that instance
as it comes and goes. The Register-WmiEvent cmdlet makes this a snap:
</p>
        <blockquote>
          <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
            <table border="0" cellspacing="0" cellpadding="5">
              <tbody>
                <tr>
                  <td valign="top">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br /></div>
                  </td>
                  <td valign="top" nowrap="nowrap">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                      <span style="color: #00008b">function</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">Register-KeyboardEvent</span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$query</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"SELECT
* FROM __InstanceCreationEvent "</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+</span>
                      <br />
                      <span style="color: #000000">         </span>
                      <span style="color: #8b0000">"WITHIN
5 "</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+</span>
                      <br />
                      <span style="color: #000000">         </span>
                      <span style="color: #8b0000">"WHERE
TargetInstance ISA 'Win32_PnPEntity' "</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+</span>
                      <br />
                      <span style="color: #000000">         </span>
                      <span style="color: #8b0000">"AND
TargetInstance.Name = 'USB Axiom 49' "</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$null</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Register-WmiEvent</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-Query</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$query</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-SourceIdentifier</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">KeyboardMonitor</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-Action</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">E:\lee\reason\Default.rns</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <p>
After calling this function, PowerShell automatically launches Reason with your favourite
presets already loaded whenever you turn on the USB keyboard.
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=674b87e5-99f0-4b1b-9443-ff8c3eaec7d6" />
      </body>
      <title>Responding to USB Devices in PowerShell</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,674b87e5-99f0-4b1b-9443-ff8c3eaec7d6.aspx</guid>
      <link>http://www.leeholmes.com/blog/RespondingToUSBDevicesInPowerShell.aspx</link>
      <pubDate>Tue, 02 Mar 2010 06:02:24 GMT</pubDate>
      <description>&lt;p&gt;
I recently got a cool USB MIDI keyboard (M-Audio Axiom 49) and software (Propellerhead
Reason) combo that lets me play keyboard with all kinds of cool sounds effects and
general fun. Despite how cool the system is, it’s not quite as spontaneous as a plain
ol’ electronic keyboard. Just to piddle around for a bit, you have to turn on the
keyboard, launch Reason, create a new song, add a virtual instrument, and then start
playing.
&lt;/p&gt;
&lt;p&gt;
How can PowerShell of all things help the anguish of a struggling keyboard hack?
&lt;/p&gt;
&lt;p&gt;
The answer comes in two parts – creating a template song, and then having PowerShell
launch it when you turn on the keyboard.
&lt;/p&gt;
&lt;p&gt;
It turns out that you can resolve a lot of the issues in Reason by just creating a
good starter song. Add in the mixer, a synthesizer, and save it to disk – I called
it “Default.rns.” When you double-click on this file, Reason starts up with all of
the presets you had configured.
&lt;/p&gt;
&lt;p&gt;
The second part is more tricky, unless of course you happen to have Real Ultimate
Power.
&lt;/p&gt;
&lt;p&gt;
The core of this solution comes in three parts:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
WMI lets you enumerate USB devices on the system.&lt;/li&gt;
&lt;li&gt;
The Register-WmiEvent cmdlet lets you respond to WMI events.&lt;/li&gt;
&lt;li&gt;
WMI has a default __InstanceCreationEvent class that lets you respond to ANY new instance
being created (Services, Processes, etc.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The answer to #1 has come up a few times on the Team Blog:
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://blogs.msdn.com/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx" href="http://blogs.msdn.com/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx"&gt;http://blogs.msdn.com/powershell/archive/2007/02/24/displaying-usb-devices-using-wmi.aspx&lt;/a&gt; 
&lt;br /&gt;
&lt;a title="http://blogs.msdn.com/powershell/archive/2009/01/10/get-usb-using-wmi-association-classes-in-powershell.aspx" href="http://blogs.msdn.com/powershell/archive/2009/01/10/get-usb-using-wmi-association-classes-in-powershell.aspx"&gt;http://blogs.msdn.com/powershell/archive/2009/01/10/get-usb-using-wmi-association-classes-in-powershell.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I had no idea what the Axiom keyboard was being recognized as, so I did the easy thing.
Ran the query once, turned off the keyboard, and then ran it again. Compare-Object
to the rescue:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #ff4500"&gt;$before&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Win32_USBControllerDevice&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #0000ff"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[wmi]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$_&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Dependent&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$after&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;gwmi&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Win32_USBControllerDevice&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #0000ff"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[wmi]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$_&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Dependent&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #0000ff"&gt;Compare-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$before&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$after&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-PassThru&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That gives an object like:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font size="1" face="Courier New"&gt;Availability&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: 
&lt;br /&gt;
Caption&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: USB Axiom 49 
&lt;br /&gt;
ClassGuid&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: {4d36e96c-e325-11ce-bfc1-08002be10318} 
&lt;br /&gt;
CompatibleID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: {USB\Class_01&amp;amp;SubClass_01&amp;amp;Prot_00, USB\Class_01&amp;amp;SubClass_01, USB\Class_01} 
&lt;br /&gt;
ConfigManagerErrorCode&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : 0 
&lt;br /&gt;
ConfigManagerUserConfig&amp;#160;&amp;#160;&amp;#160;&amp;#160; : False 
&lt;br /&gt;
CreationClassName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : Win32_PnPEntity 
&lt;br /&gt;
Description&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: USB Audio Device 
&lt;br /&gt;
DeviceID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: USB\VID_0763&amp;amp;PID_0199&amp;amp;MI_00\6&amp;amp;2F841C5F&amp;amp;0&amp;amp;0000 
&lt;br /&gt;
ErrorCleared&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: 
&lt;br /&gt;
ErrorDescription&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: 
&lt;br /&gt;
HardwareID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: {USB\VID_0763&amp;amp;PID_0199&amp;amp;REV_0105&amp;amp;MI_00, USB\VID_0763&amp;amp;PID_0199&amp;amp;MI_00} 
&lt;br /&gt;
InstallDate&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: 
&lt;br /&gt;
LastErrorCode&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: 
&lt;br /&gt;
Manufacturer&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: (Generic USB Audio) 
&lt;br /&gt;
Name&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: USB Axiom 49 
&lt;br /&gt;
PNPDeviceID&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
: USB\VID_0763&amp;amp;PID_0199&amp;amp;MI_00\6&amp;amp;2F841C5F&amp;amp;0&amp;amp;0000&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
There’s the ticket. It’s actually a Win32_PnpEntity. While the previous WMI query
helped us discover USB entities, now that we know how the keyboard is identified to
the system, we can drop the complicated WMI dependency traversal, and turn this specific
goal into a simpler query:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font size="1" face="Courier New"&gt;Get-WmiObject Win32_PnPEntity –Filter &amp;quot;Name='USB
Axiom 49'&amp;quot;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Now that we know which WMI class represents the keyboard, and the query that selects
it specifically, we can use WMI’s __InstanceCreationEvent to monitor for that instance
as it comes and goes. The Register-WmiEvent cmdlet makes this a snap:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #00008b"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Register-KeyboardEvent&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$query&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;SELECT
* FROM __InstanceCreationEvent &amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;WITHIN
5 &amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;WHERE
TargetInstance ISA 'Win32_PnPEntity' &amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;AND
TargetInstance.Name = 'USB Axiom 49' &amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$null&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Register-WmiEvent&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Query&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$query&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-SourceIdentifier&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;KeyboardMonitor&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Action&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;E:\lee\reason\Default.rns&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
After calling this function, PowerShell automatically launches Reason with your favourite
presets already loaded whenever you turn on the USB keyboard.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=674b87e5-99f0-4b1b-9443-ff8c3eaec7d6" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,674b87e5-99f0-4b1b-9443-ff8c3eaec7d6.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=4215a9d6-6bad-4e5a-a96d-73d487efd202</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,4215a9d6-6bad-4e5a-a96d-73d487efd202.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,4215a9d6-6bad-4e5a-a96d-73d487efd202.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=4215a9d6-6bad-4e5a-a96d-73d487efd202</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I’ve got a <a href="http://www.leeholmes.com/blog/BgShellNdashBackgroundShell.aspx">neat
application</a> that I use to map keystrokes to background PowerShell functions /
script blocks. I recently started using Pandora more often, and the killer problem
is when somebody drops by the office to ask a quick question. You dig around all of
your open Explorer windows until you find the one for Pandora, then find the Pause
button.
</p>
        <p>
Here’s a function that does all of that for you, and maps it to Control+Alt+P:
</p>
        <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
          <table border="0" cellspacing="0" cellpadding="5">
            <tbody>
              <tr>
                <td valign="top">
                  <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br /></div>
                </td>
                <td valign="top" nowrap="nowrap">
                  <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                    <span style="color: #00008b">function</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #8a2be2">PausePandora</span>
                    <br />
                    <span style="color: #000000">{</span>
                    <br />
                    <span style="color: #000000">    </span>
                    <span style="color: #ff4500">$ie</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">=</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #0000ff">New-Object</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000080">-Com</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #8a2be2">Shell.Application</span>
                    <br />
                    <span style="color: #000000">    </span>
                    <span style="color: #ff4500">$pandora</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">=</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #ff4500">$ie</span>
                    <span style="color: #a9a9a9">.</span>
                    <span style="color: #000000">Windows</span>
                    <span style="color: #000000">(</span>
                    <span style="color: #000000">)</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">|</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #0000ff">?</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000000">{</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #ff4500">$_</span>
                    <span style="color: #a9a9a9">.</span>
                    <span style="color: #000000">LocationName</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">-like</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #8b0000">"*Pandora
Radio*"</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000000">}</span>
                    <br />
                    <span style="color: #000000">    </span>
                    <span style="color: #00008b">if</span>
                    <span style="color: #000000">(</span>
                    <span style="color: #ff4500">$pandora</span>
                    <span style="color: #000000">)</span>
                    <br />
                    <span style="color: #000000">    </span>
                    <span style="color: #000000">{</span>
                    <br />
                    <span style="color: #000000">        </span>
                    <span style="color: #ff4500">$pandora</span>
                    <span style="color: #a9a9a9">.</span>
                    <span style="color: #000000">Navigate2</span>
                    <span style="color: #000000">(</span>
                    <span style="color: #8b0000">"http://www.pandora.com/#/paused"</span>
                    <span style="color: #000000">)</span>
                    <br />
                    <span style="color: #000000">    </span>
                    <span style="color: #000000">}</span>
                    <br />
                    <span style="color: #000000">    </span>
                    <span style="color: #ff4500">$ie</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">=</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #ff4500">$null</span>
                    <br />
                    <span style="color: #000000">}</span>
                    <br />
                    <br />
                    <span style="color: #006400">## Pause Pandora</span>
                    <br />
                    <span style="color: #ff4500">$keyMapping</span>
                    <span style="color: #a9a9a9">[</span>
                    <span style="color: #8b0000">'Control,Alt,P'</span>
                    <span style="color: #a9a9a9">]</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">=</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000000">@{</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000000">Action</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #a9a9a9">=</span>
                    <span style="color: #000000">  </span>
                    <span style="color: #000000">{</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #0000ff">PausePandora</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000000">}</span>
                    <span style="color: #000000"> </span>
                    <span style="color: #000000">}</span>
                  </div>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=4215a9d6-6bad-4e5a-a96d-73d487efd202" />
      </body>
      <title>PowerShell Hotkey to Pause Pandora</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,4215a9d6-6bad-4e5a-a96d-73d487efd202.aspx</guid>
      <link>http://www.leeholmes.com/blog/PowerShellHotkeyToPausePandora.aspx</link>
      <pubDate>Fri, 26 Feb 2010 17:25:54 GMT</pubDate>
      <description>&lt;p&gt;
I’ve got a &lt;a href="http://www.leeholmes.com/blog/BgShellNdashBackgroundShell.aspx"&gt;neat
application&lt;/a&gt; that I use to map keystrokes to background PowerShell functions /
script blocks. I recently started using Pandora more often, and the killer problem
is when somebody drops by the office to ask a quick question. You dig around all of
your open Explorer windows until you find the one for Pandora, then find the Pause
button.
&lt;/p&gt;
&lt;p&gt;
Here’s a function that does all of that for you, and maps it to Control+Alt+P:
&lt;/p&gt;
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #00008b"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;PausePandora&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$ie&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-Com&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Shell.Application&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$pandora&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$ie&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Windows&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$_&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;LocationName&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-like&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;*Pandora
Radio*&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$pandora&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$pandora&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Navigate2&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;http://www.pandora.com/#/paused&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$ie&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$null&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Pause Pandora&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$keyMapping&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;[&lt;/span&gt;&lt;span style="color: #8b0000"&gt;'Control,Alt,P'&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;@{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;Action&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;PausePandora&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=4215a9d6-6bad-4e5a-a96d-73d487efd202" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,4215a9d6-6bad-4e5a-a96d-73d487efd202.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=3ca5569d-cd98-4a5e-9fda-7440ba776ff2</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,3ca5569d-cd98-4a5e-9fda-7440ba776ff2.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,3ca5569d-cd98-4a5e-9fda-7440ba776ff2.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3ca5569d-cd98-4a5e-9fda-7440ba776ff2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We're getting close to "content complete" of the Windows PowerShell Cookbook,
2nd edition. The next step is technical review, where we look for both high-level
and low-level feedback on the content and structure.
</p>
        <p>
Also, this is a book focused on administrators. While PowerShell uber-hackers are
always appreciated, <u><strong>inexperience</strong></u> with PowerShell is extremely
valuable, as well.
</p>
        <p>
If you're interested in being a Technical Reviewer of the book, participate in its <a href="http://www.leeholmes.com/blog/OpenPowerShellCookbookBetaAvailableOnline.aspx">Open
Beta</a>!
</p>
        <p>
(Update 03/19/2010 – the Cookbook is now in an Open Beta!)
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=3ca5569d-cd98-4a5e-9fda-7440ba776ff2" />
      </body>
      <title>Looking for Reviewers for PowerShell Cookbook v2</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,3ca5569d-cd98-4a5e-9fda-7440ba776ff2.aspx</guid>
      <link>http://www.leeholmes.com/blog/LookingForReviewersForPowerShellCookbookV2.aspx</link>
      <pubDate>Wed, 24 Feb 2010 16:09:42 GMT</pubDate>
      <description>&lt;p&gt;
We're getting close to &amp;quot;content complete&amp;quot; of the Windows PowerShell Cookbook,
2nd edition. The next step is technical review, where we look for both high-level
and low-level feedback on the content and structure.
&lt;/p&gt;
&lt;p&gt;
Also, this is a book focused on administrators. While PowerShell uber-hackers are
always appreciated, &lt;u&gt;&lt;strong&gt;inexperience&lt;/strong&gt;&lt;/u&gt; with PowerShell is extremely
valuable, as well.
&lt;/p&gt;
&lt;p&gt;
If you're interested in being a Technical Reviewer of the book, participate in its &lt;a href="http://www.leeholmes.com/blog/OpenPowerShellCookbookBetaAvailableOnline.aspx"&gt;Open
Beta&lt;/a&gt;!
&lt;/p&gt;
&lt;p&gt;
(Update 03/19/2010 – the Cookbook is now in an Open Beta!)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=3ca5569d-cd98-4a5e-9fda-7440ba776ff2" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,3ca5569d-cd98-4a5e-9fda-7440ba776ff2.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=befd1fae-373c-4a50-96ee-b43e1df6580a</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,befd1fae-373c-4a50-96ee-b43e1df6580a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,befd1fae-373c-4a50-96ee-b43e1df6580a.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=befd1fae-373c-4a50-96ee-b43e1df6580a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here’s one that’s short and sweet. A lot of programs exist for the sole purpose of
taking a screen shot after a certain amount of time. For example, delay for 10 seconds
before taking a screen shot so that you have the time to open some menus.
</p>
        <p>
This is incredibly simple with PowerShell:
</p>
        <blockquote>
          <p>
            <font face="Courier Noew">Add-Type -Assembly System.Windows.Forms 
<br />
Sleep 10 </font>
          </p>
          <p>
            <font face="Courier Noew">## Capture the entire screen 
<br />
[System.Windows.Forms.Sendkeys]::SendWait("{PrtSc}") </font>
          </p>
          <p>
            <font face="Courier Noew">## Capture the current window 
<br />
[System.Windows.Forms.Sendkeys]::SendWait("%{PrtSc}")</font>
          </p>
        </blockquote>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=befd1fae-373c-4a50-96ee-b43e1df6580a" />
      </body>
      <title>Delayed Screen Captures in PowerShell</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,befd1fae-373c-4a50-96ee-b43e1df6580a.aspx</guid>
      <link>http://www.leeholmes.com/blog/DelayedScreenCapturesInPowerShell.aspx</link>
      <pubDate>Mon, 18 Jan 2010 20:53:33 GMT</pubDate>
      <description>&lt;p&gt;
Here’s one that’s short and sweet. A lot of programs exist for the sole purpose of
taking a screen shot after a certain amount of time. For example, delay for 10 seconds
before taking a screen shot so that you have the time to open some menus.
&lt;/p&gt;
&lt;p&gt;
This is incredibly simple with PowerShell:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier Noew"&gt;Add-Type -Assembly System.Windows.Forms 
&lt;br /&gt;
Sleep 10 &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier Noew"&gt;## Capture the entire screen 
&lt;br /&gt;
[System.Windows.Forms.Sendkeys]::SendWait(&amp;quot;{PrtSc}&amp;quot;) &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier Noew"&gt;## Capture the current window 
&lt;br /&gt;
[System.Windows.Forms.Sendkeys]::SendWait(&amp;quot;%{PrtSc}&amp;quot;)&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=befd1fae-373c-4a50-96ee-b43e1df6580a" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,befd1fae-373c-4a50-96ee-b43e1df6580a.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=1e05ba14-ec02-401e-a78d-be8c7273b593</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,1e05ba14-ec02-401e-a78d-be8c7273b593.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,1e05ba14-ec02-401e-a78d-be8c7273b593.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1e05ba14-ec02-401e-a78d-be8c7273b593</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In PowerShell V2, we added a bunch of computer management cmdlets:
</p>
        <blockquote>
          <p>
            <font face="courier new">PS &gt;Get-Command -Noun Computer | Format-Table -Auto </font>
          </p>
          <p>
            <font face="courier new">CommandType Name               
Definition 
<br />
----------- ----               
---------- 
<br />
Cmdlet      Add-Computer       
Add-Computer [-DomainName] &lt;String&gt; [-Credent 
<br />
Cmdlet      Checkpoint-Computer Checkpoint-Computer [-Description]
&lt;String&gt; [ 
<br />
Cmdlet      Remove-Computer     Remove-Computer
[[-Credential] &lt;PSCredential&gt; 
<br />
Cmdlet      Restart-Computer    Restart-Computer
[[-ComputerName] &lt;String[]&gt;] 
<br />
Cmdlet      Restore-Computer    Restore-Computer
[-RestorePoint] &lt;Int32&gt; [-Ve 
<br />
Cmdlet      Stop-Computer      
Stop-Computer [[-ComputerName] &lt;String[]&gt;] [[</font>
          </p>
        </blockquote>
        <p>
Astute followers of our CTP process might notice a missing entry in this list when
compared to earlier builds: the Rename-Computer cmdlet.
</p>
        <p>
During testing and additional validation, we realized two things:
</p>
        <ul>
          <li>
            <u>1) The API used to rename computers is fairly “forgiving” 
<br /></u>If you specify an invalid computer name, the API often doesn’t reject it – but
instead transforms it. For example, supplying a computer name that is too long will
simply truncate the computer name and complete the operation. There’s nothing like
losing a computer in your domain! Similarly, the API supports full Unicode input,
while many applications break if the computer name is not the same as its <a href="http://en.wikipedia.org/wiki/NetBIOS">NetBIOS
name</a> (which does not support full Unicode.) 
<br /></li>
          <li>
            <u>2) Our implementation failed to detect some higher-level scenarios that the existing
NetDom.exe command detects 
<br /></u>NetDom.exe is a tool that already lets you rename computers, and users might expect
some degree of compatibility with the safety it ensures. For example: in the machine
a CA server? In the middle of a DC promo? In the middle of a role change?</li>
        </ul>
        <p>
Since both netdom.exe and WMI (<a title="http://msdn.microsoft.com/en-us/library/aa393056(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa393056(VS.85).aspx">http://msdn.microsoft.com/en-us/library/aa393056(VS.85).aspx</a>)
are easily accessible alternatives, we decided to remove the cmdlet rather than ship
something that didn’t meet expectations.
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=1e05ba14-ec02-401e-a78d-be8c7273b593" />
      </body>
      <title>Where is Rename-Computer?</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,1e05ba14-ec02-401e-a78d-be8c7273b593.aspx</guid>
      <link>http://www.leeholmes.com/blog/WhereIsRenameComputer.aspx</link>
      <pubDate>Wed, 13 Jan 2010 21:10:49 GMT</pubDate>
      <description>&lt;p&gt;
In PowerShell V2, we added a bunch of computer management cmdlets:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="courier new"&gt;PS &amp;gt;Get-Command -Noun Computer | Format-Table -Auto &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new"&gt;CommandType Name&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
Definition 
&lt;br /&gt;
----------- ----&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
---------- 
&lt;br /&gt;
Cmdlet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Add-Computer&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
Add-Computer [-DomainName] &amp;lt;String&amp;gt; [-Credent 
&lt;br /&gt;
Cmdlet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Checkpoint-Computer Checkpoint-Computer [-Description]
&amp;lt;String&amp;gt; [ 
&lt;br /&gt;
Cmdlet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Remove-Computer&amp;#160;&amp;#160;&amp;#160;&amp;#160; Remove-Computer
[[-Credential] &amp;lt;PSCredential&amp;gt; 
&lt;br /&gt;
Cmdlet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Restart-Computer&amp;#160;&amp;#160;&amp;#160; Restart-Computer
[[-ComputerName] &amp;lt;String[]&amp;gt;] 
&lt;br /&gt;
Cmdlet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Restore-Computer&amp;#160;&amp;#160;&amp;#160; Restore-Computer
[-RestorePoint] &amp;lt;Int32&amp;gt; [-Ve 
&lt;br /&gt;
Cmdlet&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stop-Computer&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
Stop-Computer [[-ComputerName] &amp;lt;String[]&amp;gt;] [[&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Astute followers of our CTP process might notice a missing entry in this list when
compared to earlier builds: the Rename-Computer cmdlet.
&lt;/p&gt;
&lt;p&gt;
During testing and additional validation, we realized two things:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;u&gt;1) The API used to rename computers is fairly “forgiving” 
&lt;br /&gt;
&lt;/u&gt;If you specify an invalid computer name, the API often doesn’t reject it – but
instead transforms it. For example, supplying a computer name that is too long will
simply truncate the computer name and complete the operation. There’s nothing like
losing a computer in your domain! Similarly, the API supports full Unicode input,
while many applications break if the computer name is not the same as its &lt;a href="http://en.wikipedia.org/wiki/NetBIOS"&gt;NetBIOS
name&lt;/a&gt; (which does not support full Unicode.) 
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;u&gt;2) Our implementation failed to detect some higher-level scenarios that the existing
NetDom.exe command detects 
&lt;br /&gt;
&lt;/u&gt;NetDom.exe is a tool that already lets you rename computers, and users might expect
some degree of compatibility with the safety it ensures. For example: in the machine
a CA server? In the middle of a DC promo? In the middle of a role change?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Since both netdom.exe and WMI (&lt;a title="http://msdn.microsoft.com/en-us/library/aa393056(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa393056(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa393056(VS.85).aspx&lt;/a&gt;)
are easily accessible alternatives, we decided to remove the cmdlet rather than ship
something that didn’t meet expectations.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=1e05ba14-ec02-401e-a78d-be8c7273b593" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,1e05ba14-ec02-401e-a78d-be8c7273b593.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=770f10b8-ee39-48aa-b627-a70d1b11bc76</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,770f10b8-ee39-48aa-b627-a70d1b11bc76.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,770f10b8-ee39-48aa-b627-a70d1b11bc76.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=770f10b8-ee39-48aa-b627-a70d1b11bc76</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I don’t like to post line noise very often, but I did break that exception in the <a href="http://www.leeholmes.com/blog/HolidayWishes.aspx">Holiday
Wishes</a> post a few weeks ago. I hate quoting entire blog posts, but, 177 characters
isn’t too bad:
</p>
        <blockquote>
          <p>
            <em>'(18029799997931744,139752119745773792|%{"{0,60}"-f [Convert]::ToString($_,
2).Replace("0"," ")})-split''(.{12}|Mh)''|?{$_}'|%{iex $_;-join[char[]]$_[[char[]]"nOBB7[4oBCaenRa"]}</em>
          </p>
        </blockquote>
        <p>
When it runs, you get this for output:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;'(18029799997931744,139752119745773792|%{"{0,60}"-f [Convert]::ToString
($_, 2).Replace("0"," ")})-split''(.{12}|Mh)''|?{$_}'|%{iex $_;-join[char[]
]$_[[char[]]"nOBB7[4oBCaenRa"]}                                            
     1                                                                     
    111                                                                    
   11111                                                                   
  1111111                                                                  
    111                                                                    
   11111                                                                   
 111111111                                                                 
11111111111                                                                
    111                                                                    
    111                                                                    
Merrv ChristMas                                                            </pre>
        </blockquote>
        <p>
While it may seem like magic, it in fact was not – just some terribly obtuse PowerShell
scripting. Let’s take a look at what makes it tick. Rather than deconstruct it, we’ll
build it up from scratch.
</p>
        <p>
In a text editor, I drew the tree you see in the main output. In thinking how to compress
this down into a shorter script, the essence of the solution is that the tree is really
just a set of ON (“1”) cells, and OFF (“ “) cells. Binary is a system that describes
ON and OFF really well, so perhaps we can store the tree’s pattern of ON and OFF in
a binary number?
</p>
        <p>
Converting this to more realistic binary, we get:
</p>
        <blockquote>
          <p>
            <font face="Courier New">000001000000 
<br />
000011100000 
<br />
000111110000 
<br />
001111111000 
<br />
000011100000 
<br />
000111110000 
<br />
011111111100 
<br />
111111111110 
<br />
000011100000 
<br />
000011100000</font>
          </p>
        </blockquote>
        <p>
Now, NUMBERS do a great job of encoding binary patterns. For example, “1234” is 10011010010
in binary. What if we just concatenate all those ones and zeros together to find the
number it represents?
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;$result = [Convert]::ToInt64("00000100000000001110000000011111000000111
111100000001110000000011111000001111111110011111111111000001110000000001110
0000", 2)                                                                  
<span style="background-color: #012456; color: #cc6666">Exception
calling "ToInt64" with "2" argument(s): "Value was either
too la</span><span style="background-color: #012456; color: #cc6666">rge or too small
for a UInt64."</span><span style="background-color: #012456; color: #cc6666">At
line:1 char:29</span><span style="background-color: #012456; color: #cc6666">+ $result
= [Convert]::ToInt64 <span>&lt;</span><span>&lt;</span><span>&lt;</span><span>&lt;</span> ("000001000000000011100000000111110000</span><span style="background-color: #012456; color: #cc6666">00111111100000001110000000011111000001111111110011111111111000001110000000</span><span style="background-color: #012456; color: #cc6666">0011100000",
2)</span><span style="background-color: #012456; color: #cc6666"> + CategoryInfo
: NotSpecified: (:) [], MethodInvocationExcep </span><span style="background-color: #012456; color: #cc6666"> tion</span><span style="background-color: #012456; color: #cc6666"> +
FullyQualifiedErrorId : DotNetMethodException</span></pre>
        </blockquote>
        <p>
Unfortunately, there are too many bits (120) to fit in a single 64-bit number. While
there are some “big number” libraries about, this should stand on its own. Instead,
lets break it up into two smaller 60-bit chunks, and convert those:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;[Convert]::ToInt64("000001000000000011100000000111110000001111111000000
011100000", 2)                                                             
18029799997931744                                                          
PS &gt;[Convert]::ToInt64("000111110000011111111100111111111110000011100000000
011100000", 2)                                                             
139752119745773792                                                         </pre>
        </blockquote>
        <p>
Perfect. There are the magic numbers you see at the beginning of the script. We should
be able to recreate our greeting by converting them back to binary, and outputting
them:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;18029799997931744,139752119745773792 | Foreach-Object {                
&gt;&gt;     [Convert]::ToString($_, 2)                                          
&gt;&gt; }                                                                       
&gt;&gt;                                                                         
1000000000011100000000111110000001111111000000011100000                    
111110000011111111100111111111110000011100000000011100000                  </pre>
        </blockquote>
        <p>
Hmm. These don’t match up any longer. Since leading zeroes are not important when
converting numbers to binary, the .NET Framework doesn’t put any. After all, how many
would it put? We can get around this problem by right-aligning the strings back to
60 characters:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;18029799997931744,139752119745773792 | Foreach-Object {                
&gt;&gt;     "{0,60}" -f [Convert]::ToString($_, 2)                              
&gt;&gt; }                                                                       
&gt;&gt;                                                                         
     1000000000011100000000111110000001111111000000011100000               
   111110000011111111100111111111110000011100000000011100000               </pre>
        </blockquote>
        <p>
That’s got the correct width again, but those zeroes are going to get in the way.
Let’s convert them back to spaces:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;18029799997931744,139752119745773792 | Foreach-Object {                
&gt;&gt;     "{0,60}" -f [Convert]::ToString($_, 2).Replace("0"," ")             
&gt;&gt; }                                                                       
&gt;&gt;                                                                         
     1          111        11111      1111111       111                    
   11111     111111111  11111111111     111         111                    </pre>
        </blockquote>
        <p>
That’s getting pretty close. In fact, many trees look exactly like this when they
come from a box. However, it’s not stacked properly – our original tree rows were
12 wide, and now they are 60. Busting out a <a href="http://www.leeholmes.com/blog/EmailQuotingAndWrappingIn59Bytes.aspx">gnarly
word wrapping regular expression</a> I blogged out a while ago, let’s apply it:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;(                                                                      
&gt;&gt;     18029799997931744,139752119745773792 | Foreach-Object {             
&gt;&gt;         "{0,60}" -f [Convert]::ToString($_, 2).Replace("0"," ")         
&gt;&gt;     }                                                                   
&gt;&gt; ) -split '(.{12})' | Where-Object { $_ }                                
&gt;&gt;                                                                         
     1                                                                     
    111                                                                    
   11111                                                                   
  1111111                                                                  
    111                                                                    
   11111                                                                   
 111111111                                                                 
11111111111                                                                
    111                                                                    
    111                                                                    </pre>
        </blockquote>
        <p>
Hey, that rings a bell!
</p>
        <p>
The next step is to add the “Merry Christmas” greeting at the end. Rather than write
it directly or invent some cool scheme to encode the characters, what if we picked
characters from the script itself, so far? If we have access to the script as a string,
we can use PowerShell’s array slicing to pick whatever letters we want out. For example:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;"ABCDEF"[3,4,0,3,1,4,4,5]                                              
D                                                                          
E                                                                          
A                                                                          
D                                                                          
B                                                                          
E                                                                          
E                                                                          
F                                                                          </pre>
        </blockquote>
        <p>
We don’t actually have access to the script as a string, so instead – let’s pack it
into a string first, and then run it with Invoke-Expression. We’ll drop a bunch of
spaces and use a bunch of aliases to compress things further:
</p>
        <blockquote>
          <p>
'(18029799997931744,139752119745773792|%{"{0,60}"-f [Convert]::ToString($_,
2).Replace("0"," ")})-split''(.{12})''|?{$_}'|iex
</p>
        </blockquote>
        <p>
Now, how can we invoke that string, but also have it available for the letter picking
process we still want to do? We could store it in a variable (and reuse that variable,)
but it might be easier to use the Foreach-Object cmdlet to loop over the (single)
string, and then reuse the implicit $_ variable.
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;'"Hello"' | Foreach-Object { Invoke-Expression $_; $_[3,2,2] }         
Hello                                                                      
l                                                                          
e                                                                          
e                                                                          </pre>
        </blockquote>
        <p>
PowerShell naturally emits those last objects one-by-one, so let’s join them into
a string:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;'"Hello"' | Foreach-Object { Invoke-Expression $_; -join $_[3,2,2] }   
Hello                                                                      
lee                                                                        </pre>
        </blockquote>
        <p>
That looks like the approach we need to pick the letters out of our original script.
I generated a table and reviewed its output:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;$script = '(18029799997931744,139752119745773792|%{"{0,60}"-f [Convert]
::ToString($_, 2).Replace("0"," ")})-split''(.{12})''|?{$_}'               
PS &gt;$x = 0; $script.ToCharArray() | % { "$x : $_"; $x++ }                  
0 : (                                                                      
1 : 1                                                                      
2 : 8                                                                      
3 : 0                                                                      
4 : 2                                                                      
5 : 9                                                                      
6 : 7                                                                      
51 : [                                                                     
52 : C                                                                     
53 : o                                                                     
54 : n                                                                     
55 : v                                                                     
56 : e                                                                     
57 : r                                                                     
58 : t                                                                     
59 : ]                                                                     
116 : }                                                                    </pre>
        </blockquote>
        <p>
Unfortunately, the script output is missing a few chararcters: “M”, and “h”. It’s
also missing a “y”, but using a “v” is a common trick due to its visual similarity.
Where can we pack those letters in, though?
</p>
        <p>
The regular expression looks like the perfect place. It splits on sequences of 12
characters, so we could also ask it to split on the non-existent string “Mh”. It would
have no impact, but would give us the characters we need. Some readers thought that
the “v” instead of a “y” was a typo, so Robert (in the comments) fixed the script
by adding the “y” to this throwaway piece of the regular expression.
</p>
        <blockquote>
          <p>
            <em>'(18029799997931744,139752119745773792|%{"{0,60}"-f [Convert]::ToString($_,
2).Replace("0"," ")})-split''(.{12}<font color="#ff0000">|Mhy</font>)''|?{$_}</em>
          </p>
        </blockquote>
        <p>
After adding the extra text to the script, review the output again and get a big list
of numbers:
</p>
        <blockquote>
          <p>
… –join $_[110,79,66,66,55,91,52,111,66,67,97,101,110,82,97]
</p>
        </blockquote>
        <p>
That’s unbecoming of an obfuscated script. Luckily, those numbers are in the regular
ASCII range, and we can convert them to a string:
</p>
        <blockquote>
          <pre style="background-color: #012456; color: #eeedf0">PS &gt;[char[]] (110,79,66,66,55,91,52,111,66,67,97,101,110,82,97)            
n                                                                          
O                                                                          
B                                                                          
B                                                                          
7                                                                          
[                                                                          
4                                                                          
o                                                                          
B                                                                          
C                                                                          
a                                                                          
e                                                                          
n                                                                          
R                                                                          
a                                                                          
PS &gt;[int[]] [char[]] "nOBB7[4oBCaenRa"                                     
110                                                                        
79                                                                         
66                                                                         
66                                                                         
55                                                                         
91                                                                         
52                                                                         
111                                                                        
66                                                                         
67                                                                         
97                                                                         
101                                                                        
110                                                                        
82                                                                         
97                                                                         </pre>
        </blockquote>
        <p>
PowerShell’s array slicing does automatic integer casting if needed, so we are fine
just converting the string to a sequence of characters:
</p>
        <blockquote>
          <p>
… $_[[char[]]"nOBB7[4oBCaenRa"]}
</p>
        </blockquote>
        <p>
And there you have it: 1200 words to describe 177 characters.
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=770f10b8-ee39-48aa-b627-a70d1b11bc76" />
      </body>
      <title>An Exercise in De-Obfuscation</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,770f10b8-ee39-48aa-b627-a70d1b11bc76.aspx</guid>
      <link>http://www.leeholmes.com/blog/AnExerciseInDeObfuscation.aspx</link>
      <pubDate>Mon, 04 Jan 2010 22:46:18 GMT</pubDate>
      <description>&lt;p&gt;
I don’t like to post line noise very often, but I did break that exception in the &lt;a href="http://www.leeholmes.com/blog/HolidayWishes.aspx"&gt;Holiday
Wishes&lt;/a&gt; post a few weeks ago. I hate quoting entire blog posts, but, 177 characters
isn’t too bad:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;'(18029799997931744,139752119745773792|%{&amp;quot;{0,60}&amp;quot;-f [Convert]::ToString($_,
2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)})-split''(.{12}|Mh)''|?{$_}'|%{iex $_;-join[char[]]$_[[char[]]&amp;quot;nOBB7[4oBCaenRa&amp;quot;]}&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
When it runs, you get this for output:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;'(18029799997931744,139752119745773792|%{&amp;quot;{0,60}&amp;quot;-f [Convert]::ToString
($_, 2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)})-split''(.{12}|Mh)''|?{$_}'|%{iex $_;-join[char[]
]$_[[char[]]&amp;quot;nOBB7[4oBCaenRa&amp;quot;]}                                            
     1                                                                     
    111                                                                    
   11111                                                                   
  1111111                                                                  
    111                                                                    
   11111                                                                   
 111111111                                                                 
11111111111                                                                
    111                                                                    
    111                                                                    
Merrv ChristMas                                                            &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
While it may seem like magic, it in fact was not – just some terribly obtuse PowerShell
scripting. Let’s take a look at what makes it tick. Rather than deconstruct it, we’ll
build it up from scratch.
&lt;/p&gt;
&lt;p&gt;
In a text editor, I drew the tree you see in the main output. In thinking how to compress
this down into a shorter script, the essence of the solution is that the tree is really
just a set of ON (“1”) cells, and OFF (“ “) cells. Binary is a system that describes
ON and OFF really well, so perhaps we can store the tree’s pattern of ON and OFF in
a binary number?
&lt;/p&gt;
&lt;p&gt;
Converting this to more realistic binary, we get:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;000001000000 
&lt;br /&gt;
000011100000 
&lt;br /&gt;
000111110000 
&lt;br /&gt;
001111111000 
&lt;br /&gt;
000011100000 
&lt;br /&gt;
000111110000 
&lt;br /&gt;
011111111100 
&lt;br /&gt;
111111111110 
&lt;br /&gt;
000011100000 
&lt;br /&gt;
000011100000&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Now, NUMBERS do a great job of encoding binary patterns. For example, “1234” is 10011010010
in binary. What if we just concatenate all those ones and zeros together to find the
number it represents?
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;$result = [Convert]::ToInt64(&amp;quot;00000100000000001110000000011111000000111
111100000001110000000011111000001111111110011111111111000001110000000001110
0000&amp;quot;, 2)                                                                  
&lt;span style="background-color: #012456; color: #cc6666"&gt;Exception
calling &amp;quot;ToInt64&amp;quot; with &amp;quot;2&amp;quot; argument(s): &amp;quot;Value was either
too la&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt;rge or too small
for a UInt64.&amp;quot;&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt;At
line:1 char:29&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt;+ $result
= [Convert]::ToInt64 &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt; (&amp;quot;000001000000000011100000000111110000&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt;00111111100000001110000000011111000001111111110011111111111000001110000000&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt;0011100000&amp;quot;,
2)&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt; + CategoryInfo
: NotSpecified: (:) [], MethodInvocationExcep &lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt; tion&lt;/span&gt; &lt;span style="background-color: #012456; color: #cc6666"&gt; +
FullyQualifiedErrorId : DotNetMethodException&lt;/span&gt; &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Unfortunately, there are too many bits (120) to fit in a single 64-bit number. While
there are some “big number” libraries about, this should stand on its own. Instead,
lets break it up into two smaller 60-bit chunks, and convert those:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;[Convert]::ToInt64(&amp;quot;000001000000000011100000000111110000001111111000000
011100000&amp;quot;, 2)                                                             
18029799997931744                                                          
PS &amp;gt;[Convert]::ToInt64(&amp;quot;000111110000011111111100111111111110000011100000000
011100000&amp;quot;, 2)                                                             
139752119745773792                                                         &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Perfect. There are the magic numbers you see at the beginning of the script. We should
be able to recreate our greeting by converting them back to binary, and outputting
them:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;18029799997931744,139752119745773792 | Foreach-Object {                
&amp;gt;&amp;gt;     [Convert]::ToString($_, 2)                                          
&amp;gt;&amp;gt; }                                                                       
&amp;gt;&amp;gt;                                                                         
1000000000011100000000111110000001111111000000011100000                    
111110000011111111100111111111110000011100000000011100000                  &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Hmm. These don’t match up any longer. Since leading zeroes are not important when
converting numbers to binary, the .NET Framework doesn’t put any. After all, how many
would it put? We can get around this problem by right-aligning the strings back to
60 characters:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;18029799997931744,139752119745773792 | Foreach-Object {                
&amp;gt;&amp;gt;     &amp;quot;{0,60}&amp;quot; -f [Convert]::ToString($_, 2)                              
&amp;gt;&amp;gt; }                                                                       
&amp;gt;&amp;gt;                                                                         
     1000000000011100000000111110000001111111000000011100000               
   111110000011111111100111111111110000011100000000011100000               &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That’s got the correct width again, but those zeroes are going to get in the way.
Let’s convert them back to spaces:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;18029799997931744,139752119745773792 | Foreach-Object {                
&amp;gt;&amp;gt;     &amp;quot;{0,60}&amp;quot; -f [Convert]::ToString($_, 2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)             
&amp;gt;&amp;gt; }                                                                       
&amp;gt;&amp;gt;                                                                         
     1          111        11111      1111111       111                    
   11111     111111111  11111111111     111         111                    &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That’s getting pretty close. In fact, many trees look exactly like this when they
come from a box. However, it’s not stacked properly – our original tree rows were
12 wide, and now they are 60. Busting out a &lt;a href="http://www.leeholmes.com/blog/EmailQuotingAndWrappingIn59Bytes.aspx"&gt;gnarly
word wrapping regular expression&lt;/a&gt; I blogged out a while ago, let’s apply it:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;(                                                                      
&amp;gt;&amp;gt;     18029799997931744,139752119745773792 | Foreach-Object {             
&amp;gt;&amp;gt;         &amp;quot;{0,60}&amp;quot; -f [Convert]::ToString($_, 2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)         
&amp;gt;&amp;gt;     }                                                                   
&amp;gt;&amp;gt; ) -split '(.{12})' | Where-Object { $_ }                                
&amp;gt;&amp;gt;                                                                         
     1                                                                     
    111                                                                    
   11111                                                                   
  1111111                                                                  
    111                                                                    
   11111                                                                   
 111111111                                                                 
11111111111                                                                
    111                                                                    
    111                                                                    &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Hey, that rings a bell!
&lt;/p&gt;
&lt;p&gt;
The next step is to add the “Merry Christmas” greeting at the end. Rather than write
it directly or invent some cool scheme to encode the characters, what if we picked
characters from the script itself, so far? If we have access to the script as a string,
we can use PowerShell’s array slicing to pick whatever letters we want out. For example:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;&amp;quot;ABCDEF&amp;quot;[3,4,0,3,1,4,4,5]                                              
D                                                                          
E                                                                          
A                                                                          
D                                                                          
B                                                                          
E                                                                          
E                                                                          
F                                                                          &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
We don’t actually have access to the script as a string, so instead – let’s pack it
into a string first, and then run it with Invoke-Expression. We’ll drop a bunch of
spaces and use a bunch of aliases to compress things further:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
'(18029799997931744,139752119745773792|%{&amp;quot;{0,60}&amp;quot;-f [Convert]::ToString($_,
2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)})-split''(.{12})''|?{$_}'|iex
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Now, how can we invoke that string, but also have it available for the letter picking
process we still want to do? We could store it in a variable (and reuse that variable,)
but it might be easier to use the Foreach-Object cmdlet to loop over the (single)
string, and then reuse the implicit $_ variable.
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;'&amp;quot;Hello&amp;quot;' | Foreach-Object { Invoke-Expression $_; $_[3,2,2] }         
Hello                                                                      
l                                                                          
e                                                                          
e                                                                          &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
PowerShell naturally emits those last objects one-by-one, so let’s join them into
a string:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;'&amp;quot;Hello&amp;quot;' | Foreach-Object { Invoke-Expression $_; -join $_[3,2,2] }   
Hello                                                                      
lee                                                                        &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That looks like the approach we need to pick the letters out of our original script.
I generated a table and reviewed its output:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;$script = '(18029799997931744,139752119745773792|%{&amp;quot;{0,60}&amp;quot;-f [Convert]
::ToString($_, 2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)})-split''(.{12})''|?{$_}'               
PS &amp;gt;$x = 0; $script.ToCharArray() | % { &amp;quot;$x : $_&amp;quot;; $x++ }                  
0 : (                                                                      
1 : 1                                                                      
2 : 8                                                                      
3 : 0                                                                      
4 : 2                                                                      
5 : 9                                                                      
6 : 7                                                                      
51 : [                                                                     
52 : C                                                                     
53 : o                                                                     
54 : n                                                                     
55 : v                                                                     
56 : e                                                                     
57 : r                                                                     
58 : t                                                                     
59 : ]                                                                     
116 : }                                                                    &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Unfortunately, the script output is missing a few chararcters: “M”, and “h”. It’s
also missing a “y”, but using a “v” is a common trick due to its visual similarity.
Where can we pack those letters in, though?
&lt;/p&gt;
&lt;p&gt;
The regular expression looks like the perfect place. It splits on sequences of 12
characters, so we could also ask it to split on the non-existent string “Mh”. It would
have no impact, but would give us the characters we need. Some readers thought that
the “v” instead of a “y” was a typo, so Robert (in the comments) fixed the script
by adding the “y” to this throwaway piece of the regular expression.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;em&gt;'(18029799997931744,139752119745773792|%{&amp;quot;{0,60}&amp;quot;-f [Convert]::ToString($_,
2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)})-split''(.{12}&lt;font color="#ff0000"&gt;|Mhy&lt;/font&gt;)''|?{$_}&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
After adding the extra text to the script, review the output again and get a big list
of numbers:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
… –join $_[110,79,66,66,55,91,52,111,66,67,97,101,110,82,97]
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
That’s unbecoming of an obfuscated script. Luckily, those numbers are in the regular
ASCII range, and we can convert them to a string:
&lt;/p&gt;
&lt;blockquote&gt; &lt;pre style="background-color: #012456; color: #eeedf0"&gt;PS &amp;gt;[char[]] (110,79,66,66,55,91,52,111,66,67,97,101,110,82,97)            
n                                                                          
O                                                                          
B                                                                          
B                                                                          
7                                                                          
[                                                                          
4                                                                          
o                                                                          
B                                                                          
C                                                                          
a                                                                          
e                                                                          
n                                                                          
R                                                                          
a                                                                          
PS &amp;gt;[int[]] [char[]] &amp;quot;nOBB7[4oBCaenRa&amp;quot;                                     
110                                                                        
79                                                                         
66                                                                         
66                                                                         
55                                                                         
91                                                                         
52                                                                         
111                                                                        
66                                                                         
67                                                                         
97                                                                         
101                                                                        
110                                                                        
82                                                                         
97                                                                         &lt;/pre&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
PowerShell’s array slicing does automatic integer casting if needed, so we are fine
just converting the string to a sequence of characters:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
… $_[[char[]]&amp;quot;nOBB7[4oBCaenRa&amp;quot;]}
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
And there you have it: 1200 words to describe 177 characters.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=770f10b8-ee39-48aa-b627-a70d1b11bc76" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,770f10b8-ee39-48aa-b627-a70d1b11bc76.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=1c1bacab-737d-416b-885a-811a25963bd3</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,1c1bacab-737d-416b-885a-811a25963bd3.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,1c1bacab-737d-416b-885a-811a25963bd3.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1c1bacab-737d-416b-885a-811a25963bd3</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
'(18029799997931744,139752119745773792|%{"{0,60}"-f [Convert]::ToString($_,
2).Replace("0"," ")})-split''(.{12}|Mh)''|?{$_}'|%{iex $_;-join[char[]]$_[[char[]]"nOBB7[4oBCaenRa"]}
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=1c1bacab-737d-416b-885a-811a25963bd3" />
      </body>
      <title>Holiday Wishes</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,1c1bacab-737d-416b-885a-811a25963bd3.aspx</guid>
      <link>http://www.leeholmes.com/blog/HolidayWishes.aspx</link>
      <pubDate>Fri, 18 Dec 2009 22:17:11 GMT</pubDate>
      <description>&lt;p&gt;
'(18029799997931744,139752119745773792|%{&amp;quot;{0,60}&amp;quot;-f [Convert]::ToString($_,
2).Replace(&amp;quot;0&amp;quot;,&amp;quot; &amp;quot;)})-split''(.{12}|Mh)''|?{$_}'|%{iex $_;-join[char[]]$_[[char[]]&amp;quot;nOBB7[4oBCaenRa&amp;quot;]}
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=1c1bacab-737d-416b-885a-811a25963bd3" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,1c1bacab-737d-416b-885a-811a25963bd3.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=58d4c1e1-bb86-49c4-98c5-bbf7ba720a37</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,58d4c1e1-bb86-49c4-98c5-bbf7ba720a37.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,58d4c1e1-bb86-49c4-98c5-bbf7ba720a37.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=58d4c1e1-bb86-49c4-98c5-bbf7ba720a37</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Marcel has been posting some interesting articles on using PowerShell to <a href="http://blogs.msdn.com/monad/archive/2005/09/13/465250.aspx">generate
the MD5 hashes of files</a>.  Now, an MD5 hash of a file is just an array of
bytes.  Typical hashing programs display this in a more friendly manner:
</p>
        <p>
          <font face="Courier New">PS:15 C:\Temp &gt;md5sum 71-59-B7.bmp 
<br />
a05805e638741bb767f97c0e88962952 *71-59-B7.bmp</font>
        </p>
        <p>
Although the output of Marcel’s scripts could definitely be crafted to display this
output, they currently output the string representation of a byte array:
</p>
        <p>
          <font face="Courier New">PS:19 C:\Temp &gt;get-md5 (get-childitem 71-59-B7.bmp) 
<br />
160 88 5 230 56 116 27 183 103 249 124 14 136 150 41 82</font>
        </p>
        <p>
One of the comments in response to Marcel’s post was that PowerShell should, by default,
output byte arrays as hex.  This is a good suggestion, and we can go even further
with it.  Let’s write a script to give us a full hex editor-like view of a byte
array:
</p>
        <p>
          <font face="Courier New">PS:20 C:\Temp &gt;get-md5 (get-childitem 71-59-B7.bmp) |
format-hex</font>
        </p>
        <p>
          <br />
          <font face="Courier New">           
0  1  2  3  4  5  6  7  8  9  A 
B  C  D  E  F</font>
        </p>
        <p>
          <br />
          <font face="Courier New">00000000   A0 58 05 E6 38 74 1B B7 67 F9 7C 0E
88 96 29 52   X.æ8t.•gù|.??)R</font>
        </p>
        <p>
Or even better, let’s use it to dump out a very small bitmap – 10 pixels of the colour
(R=0x71 G=0x59 B=0xB7)
</p>
        <p>
          <font face="Courier New">PS:21 C:\Temp &gt;Format-Hex 71-59-B7.bmp</font>
        </p>
        <p>
          <br />
          <font face="Courier New">           
0  1  2  3  4  5  6  7  8  9  A 
B  C  D  E  F</font>
        </p>
        <p>
          <br />
          <font face="Courier New">00000000   42 4D 5E 00 00 00 00 00 00 00 36 00
00 00 28 00  BM^.......6...(. 
<br />
00000010   00 00 0A 00 00 00 01 00 00 00 01 00 20 00 00 00  ............
... 
<br />
00000020   00 00 00 00 00 00 C4 0E 00 00 C4 0E 00 00 00 00  ......Ä...Ä..... 
<br />
00000030   00 00 00 00 00 00 B7 59 71 FF B7 59 71 FF B7 59  ......•Yq.•Yq.•Y 
<br />
00000040   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF B7 59  q.•Yq.•Yq.•Yq.•Y 
<br />
00000050   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF       
q.•Yq.•Yq.•Yq.</font>
        </p>
        <p>
To make it easier to determine byte offsets, files are usually broken down into 16-byte
rows.  The left-hand section gives the offset of the 16-byte chunk.  The
middle section gives the hex representation of the data at that location.  These
pieces of data are aligned in columns also, corresponding to their location within
the 16-byte chunk.  So column “E” in row 0x40 means a file offset of (0x40 +
0x0E) = 0x4E.  The last section gives an ASCII representation of the data.
</p>
        <p>
In this representation, it becomes possible to see some of the underlying <a href="http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html">structure
of the bitmap format</a>:
</p>
        <p>
          <table border="1" align="center">
            <tbody>
              <tr>
                <td>
                  <font size="2">Offset</font>
                </td>
                <td>
                  <font size="2">Length</font>
                </td>
                <td>
                  <font size="2">Comment</font>
                </td>
              </tr>
              <tr>
                <td>
                  <font size="2">0x00</font>
                </td>
                <td>
                  <font size="2">2</font>
                </td>
                <td>
                  <font size="2">“BM,” the magic bitmap header</font>
                </td>
              </tr>
              <tr>
                <td>
                  <font size="2">0x02</font>
                </td>
                <td>
                  <font size="2">4</font>
                </td>
                <td>
                  <font size="2">“0x5E,” the length of the file. Notice that our last data byte is at
0x5D.  Since we started counting from zero, this means that we have 0x5E bytes
of data.</font>
                </td>
              </tr>
              <tr>
                <td>
                  <font size="2">(...)</font>
                </td>
                <td>
                  <font size="2">(...)</font>
                </td>
                <td>
                  <font size="2">(...)</font>
                </td>
              </tr>
              <tr>
                <td>
                  <font size="2">0x0A</font>
                </td>
                <td>
                  <font size="2">4</font>
                </td>
                <td>
                  <font size="2">“0x36”, specifies the absolute start of the bitmap data. Notice that
the data begins at offset (0x30 + 0x06).</font>
                </td>
              </tr>
              <tr>
                <td>
                  <font size="2">0x36</font>
                </td>
                <td>
                  <font size="2">40</font>
                </td>
                <td>
                  <font size="2">10 4-byte pixel representations. In Bitmaps, they are laid out as (B=0xB7
G=0x59 R=0x71 &lt;reserved&gt;)</font>
                </td>
              </tr>
            </tbody>
          </table>
        </p>
        <p>
Now, for the script:
</p>
        <blockquote>
          <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
            <table border="0" cellspacing="0" cellpadding="5">
              <tbody>
                <tr>
                  <td valign="top">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br />
014 
<br />
015 
<br />
016 
<br />
017 
<br />
018 
<br />
019 
<br />
020 
<br />
021 
<br />
022 
<br />
023 
<br />
024 
<br />
025 
<br />
026 
<br />
027 
<br />
028 
<br />
029 
<br />
030 
<br />
031 
<br />
032 
<br />
033 
<br />
034 
<br />
035 
<br />
036 
<br />
037 
<br />
038 
<br />
039 
<br />
040 
<br />
041 
<br />
042 
<br />
043 
<br />
044 
<br />
045 
<br />
046 
<br />
047 
<br />
048 
<br />
049 
<br />
050 
<br />
051 
<br />
052 
<br />
053 
<br />
054 
<br />
055 
<br />
056 
<br />
057 
<br />
058 
<br />
059 
<br />
060 
<br />
061 
<br />
062 
<br />
063 
<br />
064 
<br />
065 
<br />
066 
<br />
067 
<br />
068 
<br />
069 
<br />
070 
<br />
071 
<br />
072 
<br />
073 
<br />
074 
<br />
075 
<br />
076 
<br />
077 
<br />
078 
<br />
079 
<br />
080 
<br />
081 
<br />
082 
<br />
083 
<br />
084 
<br />
085 
<br />
086 
<br />
087 
<br />
088 
<br />
089 
<br />
090 
<br />
091 
<br />
092 
<br />
093 
<br />
094 
<br />
095 
<br />
096 
<br />
097 
<br />
098 
<br />
099 
<br />
100 
<br />
101 
<br />
102 
<br />
103 
<br />
104 
<br />
105 
<br />
106 
<br />
107 
<br />
108 
<br />
109 
<br />
110 
<br />
111 
<br />
112 
<br />
113 
<br />
114 
<br />
115 
<br />
116 
<br />
117 
<br />
118 
<br />
119 
<br />
120 
<br />
121 
<br />
122 
<br />
123 
<br />
124 
<br />
125 
<br />
126 
<br />
127 
<br />
128 
<br />
129 
<br />
130 
<br />
131 
<br /></div>
                  </td>
                  <td valign="top" nowrap="nowrap">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                      <span style="color: #006400">##############################################################################</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">## Format-Hex</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">## From Windows PowerShell Cookbook (O'Reilly)</span>
                      <br />
                      <span style="color: #006400">## by Lee Holmes (http://www.leeholmes.com/guide)</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">##############################################################################</span>
                      <br />
                      <br />
                      <span style="color: #006400">&lt;# 
<br /><br />
.SYNOPSIS 
<br />
Outputs a file or pipelined input as a hexadecimal display. To determine the 
<br />
offset of a character in the input, add the number at the far-left of the row 
<br />
with the the number at the top of the column for that character. 
<br />
  
<br />
.EXAMPLE 
<br />
PS &gt;"Hello World" | Format-Hex 
<br /><br />
            0 1 2 3 4 5 6 7
8 9 A B C D E F 
<br />
  
<br />
00000000 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 H.e.l.l.o. .W.o. 
<br />
00000010 72 00 6C 00 64 00 r.l.d. 
<br />
  
<br />
.EXAMPLE 
<br />
PS &gt;Format-Hex c:\temp\example.bmp 
<br />
   
<br />
#&gt;</span>
                      <br />
                      <br />
                      <span style="color: #a9a9a9">[</span>
                      <span style="color: #add8e6">CmdletBinding</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">DefaultParameterSetName</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"ByPath"</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">]</span>
                      <br />
                      <span style="color: #00008b">param</span>
                      <span style="color: #000000">(</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
The file to read the content from</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #a9a9a9">[</span>
                      <span style="color: #add8e6">Parameter</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">ParameterSetName</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"ByPath"</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">Position</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">]</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #008080">[string]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$Path</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
The input (bytes or strings) to format as hexadecimal</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #a9a9a9">[</span>
                      <span style="color: #add8e6">Parameter</span>
                      <span style="color: #000000">(</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">ParameterSetName</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"ByInput"</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">Position</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">ValueFromPipeline</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$true</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">]</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #008080">[Object]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$InputObject</span>
                      <br />
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #00008b">begin</span>
                      <span style="color: #000000"> </span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Create the array to hold the content. If the user specified the</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
-Path parameter, read the bytes from the path.</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #008080">[byte[]]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$inputBytes</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$null</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$Path</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$inputBytes</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[IO.File]</span>
                      <span style="color: #a9a9a9">::</span>
                      <span style="color: #000000">ReadAllBytes</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">(</span>
                      <span style="color: #0000ff">Resolve-Path</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$Path</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Store our header, and formatting information</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$header</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"
0 1 2 3 4 5 6 7 8 9 A B C D E F"</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$nextLine</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"{0}
"</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-f</span>
                      <span style="color: #000000">  </span>
                      <span style="color: #008080">[Convert]</span>
                      <span style="color: #a9a9a9">::</span>
                      <span style="color: #000000">ToString</span>
                      <span style="color: #000000">(</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">16</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">ToUpper</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">PadLeft</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #800080">8</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">'0'</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$asciiEnd</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">""</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Output the header</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #8b0000">"`r`n$header`r`n"</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #00008b">process</span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
If they specified the -InputObject parameter, retrieve the bytes</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
from that input</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$InputObject</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
If it's an actual byte, add it to the inputBytes array.</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$InputObject</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-is</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[Byte]</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$inputBytes</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$InputObject</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">else</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #006400">##
Otherwise, convert it to a string and extract the bytes</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #006400">##
from that.</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$inputString</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[string]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$InputObject</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$inputBytes</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[Text.Encoding]</span>
                      <span style="color: #a9a9a9">::</span>
                      <span style="color: #000000">Unicode</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">GetBytes</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$inputString</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Now go through the input bytes</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">foreach</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$byte</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">in</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$inputBytes</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
Display each byte, in 2-digit hexidecimal, and add that to the</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
left-hand side.</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$nextLine</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"{0:X2}
"</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-f</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$byte</span>
                      <br />
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
If the character is printable, add its ascii representation to</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
the right-hand side. Otherwise, add a dot to the right hand side.</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$byte</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-ge</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0x20</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-and</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$byte</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-le</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0xFE</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">           </span>
                      <span style="color: #ff4500">$asciiEnd</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[char]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$byte</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">else</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">           </span>
                      <span style="color: #ff4500">$asciiEnd</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"."</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #a9a9a9">++</span>
                      <span style="color: #000000">;</span>
                      <br />
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
If we've hit the end of a line, combine the right half with the</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
left half, and start a new line.</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">%</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">16</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-eq</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #8b0000">"$nextLine
$asciiEnd"</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$nextLine</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"{0}
"</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-f</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[Convert]</span>
                      <span style="color: #a9a9a9">::</span>
                      <span style="color: #000000">ToString</span>
                      <span style="color: #000000">(</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">16</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">ToUpper</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">PadLeft</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #800080">8</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">'0'</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$asciiEnd</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">""</span>
                      <span style="color: #000000">;</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #00008b">end</span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
At the end of the file, we might not have had the chance to output</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
the end of the line yet. Only do this if we didn't exit on the 16-byte</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
boundary, though.</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">%</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">16</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-ne</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">       </span>
                      <span style="color: #00008b">while</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">%</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">16</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-ne</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">       </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">          </span>
                      <span style="color: #ff4500">$nextLine</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"
"</span>
                      <br />
                      <span style="color: #000000">          </span>
                      <span style="color: #ff4500">$asciiEnd</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"
"</span>
                      <br />
                      <span style="color: #000000">          </span>
                      <span style="color: #ff4500">$counter</span>
                      <span style="color: #a9a9a9">++</span>
                      <span style="color: #000000">;</span>
                      <br />
                      <span style="color: #000000">       </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">       </span>
                      <span style="color: #8b0000">"$nextLine
$asciiEnd"</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #8b0000">""</span>
                      <br />
                      <span style="color: #000000">}</span>
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <p>
 
</p>
        <p>
[<i>Edit: Monad has now been renamed to Windows PowerShell. This script or discussion
may require slight adjustments before it applies directly to newer builds.</i>]
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=58d4c1e1-bb86-49c4-98c5-bbf7ba720a37" />
      </body>
      <title>Hex Dumper in PowerShell</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,58d4c1e1-bb86-49c4-98c5-bbf7ba720a37.aspx</guid>
      <link>http://www.leeholmes.com/blog/HexDumperInPowerShell.aspx</link>
      <pubDate>Mon, 23 Nov 2009 22:05:11 GMT</pubDate>
      <description>&lt;p&gt;
Marcel has been posting some interesting articles on using PowerShell to &lt;a href="http://blogs.msdn.com/monad/archive/2005/09/13/465250.aspx"&gt;generate
the MD5 hashes of files&lt;/a&gt;.&amp;#160; Now, an MD5 hash of a file is just an array of
bytes.&amp;#160; Typical hashing programs display this in a more friendly manner:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;PS:15 C:\Temp &amp;gt;md5sum 71-59-B7.bmp 
&lt;br /&gt;
a05805e638741bb767f97c0e88962952 *71-59-B7.bmp&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Although the output of Marcel’s scripts could definitely be crafted to display this
output, they currently output the string representation of a byte array:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;PS:19 C:\Temp &amp;gt;get-md5 (get-childitem 71-59-B7.bmp) 
&lt;br /&gt;
160 88 5 230 56 116 27 183 103 249 124 14 136 150 41 82&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
One of the comments in response to Marcel’s post was that PowerShell should, by default,
output byte arrays as hex.&amp;#160; This is a good suggestion, and we can go even further
with it.&amp;#160; Let’s write a script to give us a full hex editor-like view of a byte
array:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;PS:20 C:\Temp &amp;gt;get-md5 (get-childitem 71-59-B7.bmp) |
format-hex&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
0&amp;#160; 1&amp;#160; 2&amp;#160; 3&amp;#160; 4&amp;#160; 5&amp;#160; 6&amp;#160; 7&amp;#160; 8&amp;#160; 9&amp;#160; A&amp;#160;
B&amp;#160; C&amp;#160; D&amp;#160; E&amp;#160; F&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;font face="Courier New"&gt;00000000&amp;#160;&amp;#160; A0 58 05 E6 38 74 1B B7 67 F9 7C 0E
88 96 29 52&amp;#160;&amp;#160; X.æ8t.•gù|.??)R&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Or even better, let’s use it to dump out a very small bitmap – 10 pixels of the colour
(R=0x71 G=0x59 B=0xB7)
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;PS:21 C:\Temp &amp;gt;Format-Hex 71-59-B7.bmp&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
0&amp;#160; 1&amp;#160; 2&amp;#160; 3&amp;#160; 4&amp;#160; 5&amp;#160; 6&amp;#160; 7&amp;#160; 8&amp;#160; 9&amp;#160; A&amp;#160;
B&amp;#160; C&amp;#160; D&amp;#160; E&amp;#160; F&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;font face="Courier New"&gt;00000000&amp;#160;&amp;#160; 42 4D 5E 00 00 00 00 00 00 00 36 00
00 00 28 00&amp;#160; BM^.......6...(. 
&lt;br /&gt;
00000010&amp;#160;&amp;#160; 00 00 0A 00 00 00 01 00 00 00 01 00 20 00 00 00&amp;#160; ............
... 
&lt;br /&gt;
00000020&amp;#160;&amp;#160; 00 00 00 00 00 00 C4 0E 00 00 C4 0E 00 00 00 00&amp;#160; ......Ä...Ä..... 
&lt;br /&gt;
00000030&amp;#160;&amp;#160; 00 00 00 00 00 00 B7 59 71 FF B7 59 71 FF B7 59&amp;#160; ......•Yq.•Yq.•Y 
&lt;br /&gt;
00000040&amp;#160;&amp;#160; 71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF B7 59&amp;#160; q.•Yq.•Yq.•Yq.•Y 
&lt;br /&gt;
00000050&amp;#160;&amp;#160; 71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;
q.•Yq.•Yq.•Yq.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
To make it easier to determine byte offsets, files are usually broken down into 16-byte
rows.&amp;#160; The left-hand section gives the offset of the 16-byte chunk.&amp;#160; The
middle section gives the hex representation of the data at that location.&amp;#160; These
pieces of data are aligned in columns also, corresponding to their location within
the 16-byte chunk.&amp;#160; So column “E” in row 0x40 means a file offset of (0x40 +
0x0E) = 0x4E.&amp;#160; The last section gives an ASCII representation of the data.
&lt;/p&gt;
&lt;p&gt;
In this representation, it becomes possible to see some of the underlying &lt;a href="http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html"&gt;structure
of the bitmap format&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&lt;table border="1" align="center"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size="2"&gt;Offset&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;Length&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;Comment&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size="2"&gt;0x00&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;2&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;“BM,” the magic bitmap header&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size="2"&gt;0x02&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;4&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;“0x5E,” the length of the file. Notice that our last data byte is at
0x5D.&amp;#160; Since we started counting from zero, this means that we have 0x5E bytes
of data.&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size="2"&gt;(...)&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;(...)&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;(...)&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size="2"&gt;0x0A&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;4&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;“0x36”, specifies the absolute start of the bitmap data. Notice that
the data begins at offset (0x30 + 0x06).&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size="2"&gt;0x36&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;40&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size="2"&gt;10 4-byte pixel representations. In Bitmaps, they are laid out as (B=0xB7
G=0x59 R=0x71 &amp;lt;reserved&amp;gt;)&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Now, for the script:
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
014 
&lt;br /&gt;
015 
&lt;br /&gt;
016 
&lt;br /&gt;
017 
&lt;br /&gt;
018 
&lt;br /&gt;
019 
&lt;br /&gt;
020 
&lt;br /&gt;
021 
&lt;br /&gt;
022 
&lt;br /&gt;
023 
&lt;br /&gt;
024 
&lt;br /&gt;
025 
&lt;br /&gt;
026 
&lt;br /&gt;
027 
&lt;br /&gt;
028 
&lt;br /&gt;
029 
&lt;br /&gt;
030 
&lt;br /&gt;
031 
&lt;br /&gt;
032 
&lt;br /&gt;
033 
&lt;br /&gt;
034 
&lt;br /&gt;
035 
&lt;br /&gt;
036 
&lt;br /&gt;
037 
&lt;br /&gt;
038 
&lt;br /&gt;
039 
&lt;br /&gt;
040 
&lt;br /&gt;
041 
&lt;br /&gt;
042 
&lt;br /&gt;
043 
&lt;br /&gt;
044 
&lt;br /&gt;
045 
&lt;br /&gt;
046 
&lt;br /&gt;
047 
&lt;br /&gt;
048 
&lt;br /&gt;
049 
&lt;br /&gt;
050 
&lt;br /&gt;
051 
&lt;br /&gt;
052 
&lt;br /&gt;
053 
&lt;br /&gt;
054 
&lt;br /&gt;
055 
&lt;br /&gt;
056 
&lt;br /&gt;
057 
&lt;br /&gt;
058 
&lt;br /&gt;
059 
&lt;br /&gt;
060 
&lt;br /&gt;
061 
&lt;br /&gt;
062 
&lt;br /&gt;
063 
&lt;br /&gt;
064 
&lt;br /&gt;
065 
&lt;br /&gt;
066 
&lt;br /&gt;
067 
&lt;br /&gt;
068 
&lt;br /&gt;
069 
&lt;br /&gt;
070 
&lt;br /&gt;
071 
&lt;br /&gt;
072 
&lt;br /&gt;
073 
&lt;br /&gt;
074 
&lt;br /&gt;
075 
&lt;br /&gt;
076 
&lt;br /&gt;
077 
&lt;br /&gt;
078 
&lt;br /&gt;
079 
&lt;br /&gt;
080 
&lt;br /&gt;
081 
&lt;br /&gt;
082 
&lt;br /&gt;
083 
&lt;br /&gt;
084 
&lt;br /&gt;
085 
&lt;br /&gt;
086 
&lt;br /&gt;
087 
&lt;br /&gt;
088 
&lt;br /&gt;
089 
&lt;br /&gt;
090 
&lt;br /&gt;
091 
&lt;br /&gt;
092 
&lt;br /&gt;
093 
&lt;br /&gt;
094 
&lt;br /&gt;
095 
&lt;br /&gt;
096 
&lt;br /&gt;
097 
&lt;br /&gt;
098 
&lt;br /&gt;
099 
&lt;br /&gt;
100 
&lt;br /&gt;
101 
&lt;br /&gt;
102 
&lt;br /&gt;
103 
&lt;br /&gt;
104 
&lt;br /&gt;
105 
&lt;br /&gt;
106 
&lt;br /&gt;
107 
&lt;br /&gt;
108 
&lt;br /&gt;
109 
&lt;br /&gt;
110 
&lt;br /&gt;
111 
&lt;br /&gt;
112 
&lt;br /&gt;
113 
&lt;br /&gt;
114 
&lt;br /&gt;
115 
&lt;br /&gt;
116 
&lt;br /&gt;
117 
&lt;br /&gt;
118 
&lt;br /&gt;
119 
&lt;br /&gt;
120 
&lt;br /&gt;
121 
&lt;br /&gt;
122 
&lt;br /&gt;
123 
&lt;br /&gt;
124 
&lt;br /&gt;
125 
&lt;br /&gt;
126 
&lt;br /&gt;
127 
&lt;br /&gt;
128 
&lt;br /&gt;
129 
&lt;br /&gt;
130 
&lt;br /&gt;
131 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #006400"&gt;##############################################################################&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Format-Hex&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## From Windows PowerShell Cookbook (O'Reilly)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## by Lee Holmes (http://www.leeholmes.com/guide)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##############################################################################&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #006400"&gt;&amp;lt;# 
&lt;br /&gt;
&lt;br /&gt;
.SYNOPSIS 
&lt;br /&gt;
Outputs a file or pipelined input as a hexadecimal display. To determine the 
&lt;br /&gt;
offset of a character in the input, add the number at the far-left of the row 
&lt;br /&gt;
with the the number at the top of the column for that character. 
&lt;br /&gt;
&amp;#160; 
&lt;br /&gt;
.EXAMPLE 
&lt;br /&gt;
PS &amp;gt;&amp;quot;Hello World&amp;quot; | Format-Hex 
&lt;br /&gt;
&lt;br /&gt;
&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 1 2 3 4 5 6 7
8 9 A B C D E F 
&lt;br /&gt;
&amp;#160; 
&lt;br /&gt;
00000000 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 H.e.l.l.o. .W.o. 
&lt;br /&gt;
00000010 72 00 6C 00 64 00 r.l.d. 
&lt;br /&gt;
&amp;#160; 
&lt;br /&gt;
.EXAMPLE 
&lt;br /&gt;
PS &amp;gt;Format-Hex c:\temp\example.bmp 
&lt;br /&gt;
&amp;#160;&amp;#160; 
&lt;br /&gt;
#&amp;gt;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #a9a9a9"&gt;[&lt;/span&gt;&lt;span style="color: #add8e6"&gt;CmdletBinding&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;DefaultParameterSetName&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;ByPath&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;]&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
The file to read the content from&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;[&lt;/span&gt;&lt;span style="color: #add8e6"&gt;Parameter&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;ParameterSetName&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;ByPath&amp;quot;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;Position&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;]&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[string]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$Path&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
The input (bytes or strings) to format as hexadecimal&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;[&lt;/span&gt;&lt;span style="color: #add8e6"&gt;Parameter&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;ParameterSetName&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;ByInput&amp;quot;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;Position&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;ValueFromPipeline&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;]&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[Object]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$InputObject&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;begin&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Create the array to hold the content. If the user specified the&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
-Path parameter, read the bytes from the path.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[byte[]]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$null&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[IO.File]&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;::&lt;/span&gt;&lt;span style="color: #000000"&gt;ReadAllBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Resolve-Path&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Store our header, and formatting information&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$header&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;
0 1 2 3 4 5 6 7 8 9 A B C D E F&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$nextLine&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;{0}
&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-f&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[Convert]&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;::&lt;/span&gt;&lt;span style="color: #000000"&gt;ToString&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;ToUpper&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;PadLeft&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;'0'&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$asciiEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Output the header&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;`r`n$header`r`n&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;process&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If they specified the -InputObject parameter, retrieve the bytes&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
from that input&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$InputObject&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If it's an actual byte, add it to the inputBytes array.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$InputObject&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-is&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[Byte]&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$InputObject&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;else&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Otherwise, convert it to a string and extract the bytes&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
from that.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputString&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[string]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$InputObject&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[Text.Encoding]&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;::&lt;/span&gt;&lt;span style="color: #000000"&gt;Unicode&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;GetBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputString&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Now go through the input bytes&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$byte&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Display each byte, in 2-digit hexidecimal, and add that to the&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
left-hand side.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$nextLine&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;{0:X2}
&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-f&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$byte&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If the character is printable, add its ascii representation to&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
the right-hand side. Otherwise, add a dot to the right hand side.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$byte&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-ge&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0x20&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-and&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$byte&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-le&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0xFE&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$asciiEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[char]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$byte&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;else&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$asciiEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If we've hit the end of a line, combine the right half with the&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
left half, and start a new line.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;$nextLine
$asciiEnd&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$nextLine&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;{0}
&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-f&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[Convert]&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;::&lt;/span&gt;&lt;span style="color: #000000"&gt;ToString&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;ToUpper&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;PadLeft&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;8&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;'0'&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$asciiEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;end&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
At the end of the file, we might not have had the chance to output&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
the end of the line yet. Only do this if we didn't exit on the 16-byte&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
boundary, though.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-ne&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-ne&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$nextLine&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;
&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$asciiEnd&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;
&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$counter&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;++&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;$nextLine
$asciiEnd&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
[&lt;i&gt;Edit: Monad has now been renamed to Windows PowerShell. This script or discussion
may require slight adjustments before it applies directly to newer builds.&lt;/i&gt;]
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=58d4c1e1-bb86-49c4-98c5-bbf7ba720a37" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,58d4c1e1-bb86-49c4-98c5-bbf7ba720a37.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=8fd96bcb-e391-4389-829b-71f9f67f863d</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,8fd96bcb-e391-4389-829b-71f9f67f863d.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,8fd96bcb-e391-4389-829b-71f9f67f863d.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8fd96bcb-e391-4389-829b-71f9f67f863d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When you’re writing a script that depends on PowerShell Remoting, it’s often helpful
to know that the remoting channel is open and will support the activities of your
script.
</p>
        <p>
PowerShell has a Test-WSMan command, but that only verifies that a WSMan connection
is possible. There are other scenarios you could be impacted by:
</p>
        <ul>
          <li>
Not having permission on the remote machine</li>
          <li>
Misconfiguration of the PowerShell endpoint</li>
          <li>
Corrupted installation</li>
          <li>
(etc)</li>
        </ul>
        <p>
As you dig deeper, you realize that the only way to really test the viability of the
remoting channel is to just do something on it, and verify that you got the results
you expected to. Since the implementation was so simple, we didn’t write a cmdlet
for it. In retrospect, the concept is more difficult than the implementation, so we
probably should have written it anyways. Here’s an example function that tests the
remoting connection to a specific machine.
</p>
        <blockquote>
          <table style="margin-left: 32.25pt; mso-cellspacing: 0in; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 0in 0in 0in" class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
            <tbody>
              <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
                <td style="padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt; padding-top: 3.75pt" valign="top">
                  <p style="background: #cecece; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal">
                    <span style="font-family: consolas; font-size: 10pt">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br />
014 
<br />
015 
<br />
016 
<br />
017 
<br />
018 
<br />
019 
<br />
020 
<br />
021 
<br />
022 
<br />
023 
<br />
024 
<br />
025 
<br />
026 
<br />
027 
<br />
028</span>
                  </p>
                  <p>
                  </p>
                </td>
                <td style="padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt; padding-top: 3.75pt" valign="top" nowrap="nowrap">
                  <p style="background: #fcfcfc; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal">
                    <span style="font-family: consolas; color: darkblue; font-size: 10pt">function</span>
                    <span style="font-family: consolas; color: black; font-size: 10pt"> </span>
                    <span style="font-family: consolas; color: blueviolet; font-size: 10pt">Test-PsRemoting</span>
                    <span style="font-family: consolas; font-size: 10pt">
                      <br />
                      <span style="color: black">{</span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: darkblue">param</span>
                      <span style="color: black">(</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: darkgray">[</span>
                      <span style="color: lightblue">Parameter</span>
                      <span style="color: black">(Mandatory </span>
                      <span style="color: darkgray">=</span>
                      <span style="color: black"> </span>
                      <span style="color: orangered">$true</span>
                      <span style="color: black">)</span>
                      <span style="color: darkgray">]</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: orangered">$computername</span>
                      <br />
                      <span style="color: black">    )</span>
                      <br />
                      <span style="color: black">    </span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: darkblue">try</span>
                      <br />
                      <span style="color: black">    {</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: orangered">$errorActionPreference</span>
                      <span style="color: black"> </span>
                      <span style="color: darkgray">=</span>
                      <span style="color: black"> </span>
                      <span style="color: darkred">"Stop"</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: orangered">$result</span>
                      <span style="color: black"> </span>
                      <span style="color: darkgray">=</span>
                      <span style="color: black"> </span>
                      <span style="color: blue">Invoke-Command</span>
                      <span style="color: black"> </span>
                      <span style="color: navy">-ComputerName</span>
                      <span style="color: black"> </span>
                      <span style="color: orangered">$computername</span>
                      <span style="color: black"> { </span>
                      <span style="color: purple">1</span>
                      <span style="color: black"> }</span>
                      <br />
                      <span style="color: black">    }</span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: darkblue">catch</span>
                      <br />
                      <span style="color: black">    {</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: blue">Write-Verbose</span>
                      <span style="color: black"> </span>
                      <span style="color: orangered">$_</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: darkblue">return</span>
                      <span style="color: black"> </span>
                      <span style="color: orangered">$false</span>
                      <br />
                      <span style="color: black">    }</span>
                      <br />
                      <span style="color: black">    </span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: darkgreen">##
I've never seen this happen, but if you want to be</span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: darkgreen">##
thorough....</span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: darkblue">if</span>
                      <span style="color: black">(</span>
                      <span style="color: orangered">$result</span>
                      <span style="color: black"> </span>
                      <span style="color: darkgray">-ne</span>
                      <span style="color: black"> </span>
                      <span style="color: purple">1</span>
                      <span style="color: black">)</span>
                      <br />
                      <span style="color: black">    {</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: blue">Write-Verbose</span>
                      <span style="color: black"> </span>
                      <span style="color: darkred">"Remoting
to $computerName returned an unexpected result."</span>
                      <br />
                      <span style="color: black">        </span>
                      <span style="color: darkblue">return</span>
                      <span style="color: black"> </span>
                      <span style="color: orangered">$false</span>
                      <br />
                      <span style="color: black">    }</span>
                      <br />
                      <span style="color: black">    </span>
                      <br />
                      <span style="color: black">    </span>
                      <span style="color: orangered">$true</span>
                      <span style="color: black">    </span>
                      <br />
                      <span style="color: black">}</span>
                    </span>
                  </p>
                  <p>
                  </p>
                </td>
              </tr>
            </tbody>
          </table>
        </blockquote>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=8fd96bcb-e391-4389-829b-71f9f67f863d" />
      </body>
      <title>Testing for PowerShell Remoting: Test-PsRemoting</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,8fd96bcb-e391-4389-829b-71f9f67f863d.aspx</guid>
      <link>http://www.leeholmes.com/blog/TestingForPowerShellRemotingTestPsRemoting.aspx</link>
      <pubDate>Fri, 20 Nov 2009 19:42:09 GMT</pubDate>
      <description>&lt;p&gt;
When you’re writing a script that depends on PowerShell Remoting, it’s often helpful
to know that the remoting channel is open and will support the activities of your
script.
&lt;/p&gt;
&lt;p&gt;
PowerShell has a Test-WSMan command, but that only verifies that a WSMan connection
is possible. There are other scenarios you could be impacted by:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Not having permission on the remote machine&lt;/li&gt;
&lt;li&gt;
Misconfiguration of the PowerShell endpoint&lt;/li&gt;
&lt;li&gt;
Corrupted installation&lt;/li&gt;
&lt;li&gt;
(etc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
As you dig deeper, you realize that the only way to really test the viability of the
remoting channel is to just do something on it, and verify that you got the results
you expected to. Since the implementation was so simple, we didn’t write a cmdlet
for it. In retrospect, the concept is more difficult than the implementation, so we
probably should have written it anyways. Here’s an example function that tests the
remoting connection to a specific machine.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;table style="margin-left: 32.25pt; mso-cellspacing: 0in; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 0in 0in 0in" class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt; padding-top: 3.75pt" valign="top"&gt;
&lt;p style="background: #cecece; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; font-size: 10pt"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
014 
&lt;br /&gt;
015 
&lt;br /&gt;
016 
&lt;br /&gt;
017 
&lt;br /&gt;
018 
&lt;br /&gt;
019 
&lt;br /&gt;
020 
&lt;br /&gt;
021 
&lt;br /&gt;
022 
&lt;br /&gt;
023 
&lt;br /&gt;
024 
&lt;br /&gt;
025 
&lt;br /&gt;
026 
&lt;br /&gt;
027 
&lt;br /&gt;
028&lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;/td&gt;
&lt;td style="padding-bottom: 3.75pt; padding-left: 3.75pt; padding-right: 3.75pt; padding-top: 3.75pt" valign="top" nowrap="nowrap"&gt;
&lt;p style="background: #fcfcfc; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal"&gt;
&lt;span style="font-family: consolas; color: darkblue; font-size: 10pt"&gt;function&lt;/span&gt;&lt;span style="font-family: consolas; color: black; font-size: 10pt"&gt;&amp;#160;&lt;/span&gt;&lt;span style="font-family: consolas; color: blueviolet; font-size: 10pt"&gt;Test-PsRemoting&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 10pt"&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkblue"&gt;param&lt;/span&gt;&lt;span style="color: black"&gt;(&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkgray"&gt;[&lt;/span&gt;&lt;span style="color: lightblue"&gt;Parameter&lt;/span&gt;&lt;span style="color: black"&gt;(Mandatory &lt;/span&gt;&lt;span style="color: darkgray"&gt;=&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: orangered"&gt;$true&lt;/span&gt;&lt;span style="color: black"&gt;)&lt;/span&gt;&lt;span style="color: darkgray"&gt;]&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: orangered"&gt;$computername&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; )&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkblue"&gt;try&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: orangered"&gt;$errorActionPreference&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: darkgray"&gt;=&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: darkred"&gt;&amp;quot;Stop&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: orangered"&gt;$result&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: darkgray"&gt;=&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: blue"&gt;Invoke-Command&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: navy"&gt;-ComputerName&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: orangered"&gt;$computername&lt;/span&gt;&lt;span style="color: black"&gt; { &lt;/span&gt;&lt;span style="color: purple"&gt;1&lt;/span&gt;&lt;span style="color: black"&gt; }&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkblue"&gt;catch&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;Write-Verbose&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: orangered"&gt;$_&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkblue"&gt;return&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: orangered"&gt;$false&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkgreen"&gt;##
I've never seen this happen, but if you want to be&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkgreen"&gt;##
thorough....&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkblue"&gt;if&lt;/span&gt;&lt;span style="color: black"&gt;(&lt;/span&gt;&lt;span style="color: orangered"&gt;$result&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: darkgray"&gt;-ne&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: purple"&gt;1&lt;/span&gt;&lt;span style="color: black"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;Write-Verbose&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: darkred"&gt;&amp;quot;Remoting
to $computerName returned an unexpected result.&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: darkblue"&gt;return&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: orangered"&gt;$false&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: orangered"&gt;$true&lt;/span&gt;&lt;span style="color: black"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: black"&gt;}&lt;/span&gt; &lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=8fd96bcb-e391-4389-829b-71f9f67f863d" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,8fd96bcb-e391-4389-829b-71f9f67f863d.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=4d388e75-c9c1-4ce0-a5cf-864d05f5acc7</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,4d388e75-c9c1-4ce0-a5cf-864d05f5acc7.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,4d388e75-c9c1-4ce0-a5cf-864d05f5acc7.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=4d388e75-c9c1-4ce0-a5cf-864d05f5acc7</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Over the past few years, Pumpkin carving in my family has somehow ended up focusing
on two themes: Math, and Knitting.
</p>
        <p>
A Sierpinski Triangle -- which surprisingly only took a toothpick or two to repair
isolated triangles:
</p>
        <p align="center">
          <img border="0" src="http://www.leeholmes.com/blog/content/binary/sierpinski_pumpkin.jpg" />
        </p>
        <p>
          <a href="http://en.wikipedia.org/wiki/Sierpinski_carpet">Sierpinski Carpet</a> (along
with a wee bit of evil, of course:)
</p>
        <p align="center">
          <img border="0" src="http://www.leeholmes.com/blog/content/binary/sierpinski_carpet_pumpkin.jpg" /> <img border="0" src="http://www.leeholmes.com/blog/content/binary/crossed_trident_pumpkin.jpg" /></p>
        <p>
Not being one to cut 64 of the level-three squares by hand, a cordless drill came
in extremely handy.
</p>
        <p>
Mandelbrot, and Koch snowflake:
</p>
        <p align="center">
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="030" border="0" alt="030" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/030_3.jpg" width="404" height="304" /> <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="112" border="0" alt="112" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/112_3.jpg" width="404" height="304" /></p>
        <p>
 
</p>
        <p>
Knitting randoms:
</p>
        <p align="center">
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="106" border="0" alt="106" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/106_1.jpg" width="404" height="304" />
          <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="109" border="0" alt="109" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/109_1.jpg" width="404" height="304" />
        </p>
        <p>
And just a cool cat in a window:
</p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Picture 636" border="0" alt="Picture 636" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/Picture%20636_1.jpg" width="404" height="304" />
        </p>
        <p>
Unfortunately, when I'm out trick-or-treating, there's nobody around to give candy
to the little monsters.  I leave a note above a bowl on a chair – and now I finally
know why my calligraphy pens include red in the set!
</p>
        <p>
 
</p>
        <p align="center">
          <img border="0" src="http://www.leeholmes.com/blog/content/binary/candy_warning.jpg" />
        </p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=4d388e75-c9c1-4ce0-a5cf-864d05f5acc7" />
      </body>
      <title>Mathematical Pumpkins</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,4d388e75-c9c1-4ce0-a5cf-864d05f5acc7.aspx</guid>
      <link>http://www.leeholmes.com/blog/MathematicalPumpkins.aspx</link>
      <pubDate>Thu, 29 Oct 2009 18:10:58 GMT</pubDate>
      <description>&lt;p&gt;
Over the past few years, Pumpkin carving in my family has somehow ended up focusing
on two themes: Math, and Knitting.
&lt;/p&gt;
&lt;p&gt;
A Sierpinski Triangle -- which surprisingly only took a toothpick or two to repair
isolated triangles:
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img border="0" src="http://www.leeholmes.com/blog/content/binary/sierpinski_pumpkin.jpg" /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Sierpinski_carpet"&gt;Sierpinski Carpet&lt;/a&gt; (along
with a wee bit of evil, of course:)
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img border="0" src="http://www.leeholmes.com/blog/content/binary/sierpinski_carpet_pumpkin.jpg" /&gt;&amp;#160;&lt;img border="0" src="http://www.leeholmes.com/blog/content/binary/crossed_trident_pumpkin.jpg" /&gt;
&lt;/p&gt;
&lt;p&gt;
Not being one to cut 64 of the level-three squares by hand, a cordless drill came
in extremely handy.
&lt;/p&gt;
&lt;p&gt;
Mandelbrot, and Koch snowflake:
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="030" border="0" alt="030" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/030_3.jpg" width="404" height="304" /&gt;&amp;#160;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="112" border="0" alt="112" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/112_3.jpg" width="404" height="304" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Knitting randoms:
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="106" border="0" alt="106" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/106_1.jpg" width="404" height="304" /&gt; &lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="109" border="0" alt="109" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/109_1.jpg" width="404" height="304" /&gt; 
&lt;/p&gt;
&lt;p&gt;
And just a cool cat in a window:
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Picture 636" border="0" alt="Picture 636" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/MathematicalPumpkins_9D3F/Picture%20636_1.jpg" width="404" height="304" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Unfortunately, when I'm out trick-or-treating, there's nobody around to give candy
to the little monsters.&amp;#160; I leave a note above a bowl on a chair – and now I finally
know why my calligraphy pens include red in the set!
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img border="0" src="http://www.leeholmes.com/blog/content/binary/candy_warning.jpg" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=4d388e75-c9c1-4ce0-a5cf-864d05f5acc7" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,4d388e75-c9c1-4ce0-a5cf-864d05f5acc7.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=2da304f2-6be6-4eca-805a-944bcce93b9a</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,2da304f2-6be6-4eca-805a-944bcce93b9a.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,2da304f2-6be6-4eca-805a-944bcce93b9a.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=2da304f2-6be6-4eca-805a-944bcce93b9a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One thing you might notice if you have an iPhone connecting to an Inbox via the IMAP
protocol is that messages you delete tend to stick around when viewed from other devices
(such as Outlook, Outlook Web Access, etc.)
</p>
        <p>
This is caused by an out-of-date view of mail management, where your Inbox handles
everything. When you delete an item, some IMAP clients (such as the iPhone) mark them
as deleted, but don’t actually remove the item from the server. Some clients hide
these deleted items. Some show them with a line through them. Some ignore the deleted
flag altogether.
</p>
        <p>
Most email clients (including iPhone) move deleted items to their own sub-folder,
so marking items as deleted just ends up being an annoyance:
</p>
        <p>
          <a title="http://discussions.apple.com/thread.jspa?messageID=4934598" href="http://discussions.apple.com/thread.jspa?messageID=4934598">http://discussions.apple.com/thread.jspa?messageID=4934598</a>
          <br />
          <a title="http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=44a01293-3b32-4ee0-b23c-fac99348e1cd" href="http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=44a01293-3b32-4ee0-b23c-fac99348e1cd">http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=44a01293-3b32-4ee0-b23c-fac99348e1cd</a>
          <br />
          <a title="http://www.robichaux.net/blog/2007/07/iphone_vs_windows_mobile_part_3_mail.php" href="http://www.robichaux.net/blog/2007/07/iphone_vs_windows_mobile_part_3_mail.php">http://www.robichaux.net/blog/2007/07/iphone_vs_windows_mobile_part_3_mail.php</a>
        </p>
        <p>
The solution is the IMAP ‘EXPUNGE’ command. It permanently deletes items that have
been marked for deletion (while of course leaving everything in Deleted Items untouched.)
The iPhone has an option to do this once a day, but it doesn’t seem to work very well
(and a day lag feels like an eternity, anyways.)
</p>
        <p>
The folks at freshlogic have a fine application to run the command against your mail
server. We can improve on it in a few ways by writing it in PowerShell. Our version:
</p>
        <ul>
          <li>
Enables support for securely cached credentials</li>
          <li>
Doesn’t require an always-running application</li>
          <li>
Runs in the background</li>
        </ul>
        <p>
To do this, our script imports our saved password, and then uses <a href="http://www.leeholmes.com/blog/ScriptingNetworkTCPConnectionsInPowerShell.aspx">Send-TcpRequest</a> to
simply connect to the server and send the EXPUNGE command. Finally, we use schtasks.exe
to automate it.
</p>
        <blockquote>
          <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
            <table border="0" cellspacing="0" cellpadding="5">
              <tbody>
                <tr>
                  <td valign="top">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br />
014 
<br />
015 
<br />
016 
<br />
017 
<br />
018 
<br />
019 
<br />
020 
<br />
021 
<br />
022 
<br />
023 
<br />
024 
<br />
025 
<br /></div>
                  </td>
                  <td valign="top" nowrap="nowrap">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                      <span style="color: #006400">#
1) Get your password into a securestring:</span>
                      <br />
                      <span style="color: #006400"># $ss = Read-Host -AsSecureString</span>
                      <br />
                      <span style="color: #006400"># 2) Export it to disk</span>
                      <br />
                      <span style="color: #006400"># $ss | ConvertFrom-SecureString | </span>
                      <br />
                      <span style="color: #006400"># Out-File (Join-Path (Split-Path $profile) Sync-MailboxDeletedState.ps1.credential)</span>
                      <br />
                      <span style="color: #006400"># 3) Create the scheduled task</span>
                      <br />
                      <span style="color: #006400"># schtasks /Create /TN MailboxUpdater /SC MINUTE /MO
5 /TR </span>
                      <br />
                      <span style="color: #006400"># "powershell -NoProfile -WindowStyle Hidden -File
'c:\path\to\Sync-MailboxDeletedState.ps1'"</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$username</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"user@example.com"</span>
                      <br />
                      <span style="color: #ff4500">$server</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"imap.example.com"</span>
                      <br />
                      <span style="color: #ff4500">$port</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">993</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$passwordPath</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Join-Path</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">(</span>
                      <span style="color: #0000ff">Split-Path</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$profile</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">Sync-MailboxDeletedState.ps1.credential</span>
                      <br />
                      <span style="color: #ff4500">$password</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Get-Content</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$passwordPath</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">ConvertTo-SecureString</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$cred</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">New-Object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">System.Management.Automation.PsCredential</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$username</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #ff4500">$password</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$nc</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$cred</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">GetNetworkCredential</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #ff4500">$commands</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"A1
LOGIN $($nc.UserName + '@' + $nc.Domain) $($nc.Password)"</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #8b0000">'A2
SELECT INBOX'</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #8b0000">'A3
EXPUNGE'</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #8b0000">'A4
LOGOUT'</span>
                      <br />
                      <br />
                      <span style="color: #ff4500">$commands</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">|</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Send-TcpRequest</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$server</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$port</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-UseSSL</span>
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=2da304f2-6be6-4eca-805a-944bcce93b9a" />
      </body>
      <title>Removing Deleted Items Left by the iPhone</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,2da304f2-6be6-4eca-805a-944bcce93b9a.aspx</guid>
      <link>http://www.leeholmes.com/blog/RemovingDeletedItemsLeftByTheIPhone.aspx</link>
      <pubDate>Wed, 28 Oct 2009 03:28:01 GMT</pubDate>
      <description>&lt;p&gt;
One thing you might notice if you have an iPhone connecting to an Inbox via the IMAP
protocol is that messages you delete tend to stick around when viewed from other devices
(such as Outlook, Outlook Web Access, etc.)
&lt;/p&gt;
&lt;p&gt;
This is caused by an out-of-date view of mail management, where your Inbox handles
everything. When you delete an item, some IMAP clients (such as the iPhone) mark them
as deleted, but don’t actually remove the item from the server. Some clients hide
these deleted items. Some show them with a line through them. Some ignore the deleted
flag altogether.
&lt;/p&gt;
&lt;p&gt;
Most email clients (including iPhone) move deleted items to their own sub-folder,
so marking items as deleted just ends up being an annoyance:
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://discussions.apple.com/thread.jspa?messageID=4934598" href="http://discussions.apple.com/thread.jspa?messageID=4934598"&gt;http://discussions.apple.com/thread.jspa?messageID=4934598&lt;/a&gt; 
&lt;br /&gt;
&lt;a title="http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=44a01293-3b32-4ee0-b23c-fac99348e1cd" href="http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=44a01293-3b32-4ee0-b23c-fac99348e1cd"&gt;http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=44a01293-3b32-4ee0-b23c-fac99348e1cd&lt;/a&gt; 
&lt;br /&gt;
&lt;a title="http://www.robichaux.net/blog/2007/07/iphone_vs_windows_mobile_part_3_mail.php" href="http://www.robichaux.net/blog/2007/07/iphone_vs_windows_mobile_part_3_mail.php"&gt;http://www.robichaux.net/blog/2007/07/iphone_vs_windows_mobile_part_3_mail.php&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The solution is the IMAP ‘EXPUNGE’ command. It permanently deletes items that have
been marked for deletion (while of course leaving everything in Deleted Items untouched.)
The iPhone has an option to do this once a day, but it doesn’t seem to work very well
(and a day lag feels like an eternity, anyways.)
&lt;/p&gt;
&lt;p&gt;
The folks at freshlogic have a fine application to run the command against your mail
server. We can improve on it in a few ways by writing it in PowerShell. Our version:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Enables support for securely cached credentials&lt;/li&gt;
&lt;li&gt;
Doesn’t require an always-running application&lt;/li&gt;
&lt;li&gt;
Runs in the background&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
To do this, our script imports our saved password, and then uses &lt;a href="http://www.leeholmes.com/blog/ScriptingNetworkTCPConnectionsInPowerShell.aspx"&gt;Send-TcpRequest&lt;/a&gt; to
simply connect to the server and send the EXPUNGE command. Finally, we use schtasks.exe
to automate it.
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
014 
&lt;br /&gt;
015 
&lt;br /&gt;
016 
&lt;br /&gt;
017 
&lt;br /&gt;
018 
&lt;br /&gt;
019 
&lt;br /&gt;
020 
&lt;br /&gt;
021 
&lt;br /&gt;
022 
&lt;br /&gt;
023 
&lt;br /&gt;
024 
&lt;br /&gt;
025 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #006400"&gt;#
1) Get your password into a securestring:&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# $ss = Read-Host -AsSecureString&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# 2) Export it to disk&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# $ss | ConvertFrom-SecureString | &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# Out-File (Join-Path (Split-Path $profile) Sync-MailboxDeletedState.ps1.credential)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# 3) Create the scheduled task&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# schtasks /Create /TN MailboxUpdater /SC MINUTE /MO
5 /TR &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;# &amp;quot;powershell -NoProfile -WindowStyle Hidden -File
'c:\path\to\Sync-MailboxDeletedState.ps1'&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$username&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;user@example.com&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$server&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;imap.example.com&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$port&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;993&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$passwordPath&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Split-Path&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$profile&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Sync-MailboxDeletedState.ps1.credential&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$password&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Get-Content&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$passwordPath&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ConvertTo-SecureString&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$cred&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Management.Automation.PsCredential&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$username&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$password&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$nc&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$cred&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;GetNetworkCredential&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$commands&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;A1
LOGIN $($nc.UserName + '@' + $nc.Domain) $($nc.Password)&amp;quot;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;'A2
SELECT INBOX'&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;'A3
EXPUNGE'&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #8b0000"&gt;'A4
LOGOUT'&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$commands&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Send-TcpRequest&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$server&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$port&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-UseSSL&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=2da304f2-6be6-4eca-805a-944bcce93b9a" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,2da304f2-6be6-4eca-805a-944bcce93b9a.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Awhile back, I introduced a script that allows you interact with remote TCP ports
(such as Telnet.) While useful, it worked only interactively. It would be even more
useful if you were able to script a network or TCP connection.
</p>
        <p>
Let me introduce <font face="Courier New">Send-TcpRequest.ps1</font> v2, which allows
exactly that:
</p>
        <p>
First, a simple scripted HTTP session:
</p>
        <blockquote style="margin-right: 0px" dir="ltr">
          <div style="border-bottom: gray 1px solid; border-left: gray 1px solid; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid" id="htmlcode">
            <div style="font-family: courier new">$http = @" 
<br />
GET / HTTP/<span style="color: maroon">1</span><span style="color: maroon">.1</span><br />
Host:search.msn.com 
<br />
`n`n 
<br />
"@ 
<br /><br />
$http | Send-TcpRequest search.msn.com <span style="color: maroon">80</span></div>
          </div>
        </blockquote>
        <p>
Second, a scripted POP3 session (Parse-TextObject comes from here: <a href="http://www.leeholmes.com/blog/parsetextObjectAWKWithAVengeance.aspx">http://www.leeholmes.com/blog/parsetextObjectAWKWithAVengeance.aspx</a>):
</p>
        <blockquote style="margin-right: 0px" dir="ltr">
          <div style="border-bottom: gray 1px solid; border-left: gray 1px solid; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid" id="htmlcode">
            <div style="font-family: courier new">
              <span style="color: blue">if</span>(-not (test-path
Variable:\mailCredential)) 
<br />
{ 
<br />
   $mailCredential = Get-Credential 
<br />
} 
<br />
$address = $mailCredential.UserName 
<br />
$password = $mailCredential.GetNetworkCredential().Password 
<br />
$pop3Commands = <span style="color: maroon">"USER $address"</span>,<span style="color: maroon">"PASS
$password"</span>,<span style="color: maroon">"STAT"</span>,<span style="color: maroon">"QUIT"</span><br />
$output = $pop3Commands | Send-TcpRequest mail.leeholmes.com <span style="color: maroon">110</span><br />
$inbox = $output.Split(<span style="color: maroon">"`n"</span>)[<span style="color: maroon">3</span>] 
<br />
$status = $inbox | Parse-TextObject -PropertyName <span style="color: maroon">"Response"</span>,<span style="color: maroon">"Waiting"</span>,<span style="color: maroon">"BytesTotal"</span>,<span style="color: maroon">"Extra"</span><br /><span style="color: maroon">"{0} messages waiting, totaling {1} bytes."</span> -f
$status.Waiting,$status.BytesTotal
</div>
          </div>
        </blockquote>
        <p>
 
</p>
        <p>
Now, here is Send-TcpRequest.ps1
</p>
        <blockquote>
          <div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px">
            <table border="0" cellspacing="0" cellpadding="5">
              <tbody>
                <tr>
                  <td valign="top">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px">001 
<br />
002 
<br />
003 
<br />
004 
<br />
005 
<br />
006 
<br />
007 
<br />
008 
<br />
009 
<br />
010 
<br />
011 
<br />
012 
<br />
013 
<br />
014 
<br />
015 
<br />
016 
<br />
017 
<br />
018 
<br />
019 
<br />
020 
<br />
021 
<br />
022 
<br />
023 
<br />
024 
<br />
025 
<br />
026 
<br />
027 
<br />
028 
<br />
029 
<br />
030 
<br />
031 
<br />
032 
<br />
033 
<br />
034 
<br />
035 
<br />
036 
<br />
037 
<br />
038 
<br />
039 
<br />
040 
<br />
041 
<br />
042 
<br />
043 
<br />
044 
<br />
045 
<br />
046 
<br />
047 
<br />
048 
<br />
049 
<br />
050 
<br />
051 
<br />
052 
<br />
053 
<br />
054 
<br />
055 
<br />
056 
<br />
057 
<br />
058 
<br />
059 
<br />
060 
<br />
061 
<br />
062 
<br />
063 
<br />
064 
<br />
065 
<br />
066 
<br />
067 
<br />
068 
<br />
069 
<br />
070 
<br />
071 
<br />
072 
<br />
073 
<br />
074 
<br />
075 
<br />
076 
<br />
077 
<br />
078 
<br />
079 
<br />
080 
<br />
081 
<br />
082 
<br />
083 
<br />
084 
<br />
085 
<br />
086 
<br />
087 
<br />
088 
<br />
089 
<br />
090 
<br />
091 
<br />
092 
<br />
093 
<br />
094 
<br />
095 
<br />
096 
<br />
097 
<br />
098 
<br />
099 
<br />
100 
<br />
101 
<br />
102 
<br />
103 
<br />
104 
<br />
105 
<br />
106 
<br />
107 
<br />
108 
<br />
109 
<br />
110 
<br />
111 
<br />
112 
<br />
113 
<br />
114 
<br />
115 
<br />
116 
<br />
117 
<br />
118 
<br />
119 
<br />
120 
<br />
121 
<br />
122 
<br />
123 
<br />
124 
<br />
125 
<br />
126 
<br />
127 
<br />
128 
<br />
129 
<br />
130 
<br />
131 
<br />
132 
<br />
133 
<br />
134 
<br />
135 
<br />
136 
<br />
137 
<br />
138 
<br />
139 
<br />
140 
<br />
141 
<br />
142 
<br />
143 
<br />
144 
<br />
145 
<br />
146 
<br />
147 
<br />
148 
<br />
149 
<br />
150 
<br />
151 
<br />
152 
<br />
153 
<br />
154 
<br />
155 
<br />
156 
<br />
157 
<br />
158 
<br />
159 
<br /></div>
                  </td>
                  <td valign="top" nowrap="nowrap">
                    <div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px">
                      <span style="color: #006400">##############################################################################</span>
                      <br />
                      <span style="color: #006400">## Send-TcpRequest.ps1</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">## From Windows PowerShell Cookbook (O'Reilly)</span>
                      <br />
                      <span style="color: #006400">## by Lee Holmes (http://www.leeholmes.com/guide)</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">## Send a TCP request to a remote computer, and return
the response.</span>
                      <br />
                      <span style="color: #006400">## If you do not supply input to this script (via either
the pipeline, or the</span>
                      <br />
                      <span style="color: #006400">## -InputObject parameter,) the script operates in interactive
mode.</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">## Example:</span>
                      <br />
                      <span style="color: #006400">##</span>
                      <br />
                      <span style="color: #006400">## $http = @"</span>
                      <br />
                      <span style="color: #006400">## GET / HTTP/1.1</span>
                      <br />
                      <span style="color: #006400">## Host:search.msn.com</span>
                      <br />
                      <span style="color: #006400">## `n`n</span>
                      <br />
                      <span style="color: #006400">## "@</span>
                      <br />
                      <span style="color: #006400">## </span>
                      <br />
                      <span style="color: #006400">## $http | Send-TcpRequest search.msn.com 80</span>
                      <br />
                      <span style="color: #006400">##############################################################################</span>
                      <br />
                      <span style="color: #00008b">param</span>
                      <span style="color: #000000">(</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #008080">[string]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$remoteHost</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"localhost"</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #008080">[int]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$port</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">80</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #008080">[switch]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$UseSSL</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #008080">[string]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$inputObject</span>
                      <span style="color: #a9a9a9">,</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #008080">[int]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$commandDelay</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">100</span>
                      <br />
                      <span style="color: #000000">     </span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #008080">[string]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$output</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">""</span>
                      <br />
                      <br />
                      <span style="color: #006400">## Store the input into an array that we can scan over.
If there was no input,</span>
                      <br />
                      <span style="color: #006400">## then we will be in interactive mode.</span>
                      <br />
                      <span style="color: #ff4500">$currentInput</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$inputObject</span>
                      <br />
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #a9a9a9">-not</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$currentInput</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$SCRIPT:currentInput</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">@(</span>
                      <span style="color: #ff4500">$input</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #ff4500">$scriptedMode</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #008080">[bool]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$currentInput</span>
                      <br />
                      <br />
                      <span style="color: #00008b">function</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">Main</span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Open the socket, and connect to the computer on the specified port</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #a9a9a9">-not</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$scriptedMode</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #0000ff">write-host</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"Connecting
to $remoteHost on port $port"</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">trap</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Write-Error</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"Could
not connect to remote computer: $_"</span>
                      <span style="color: #000000">;</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">exit</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$socket</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">new-object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">System.Net.Sockets.TcpClient</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$remoteHost</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$port</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #a9a9a9">-not</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$scriptedMode</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #0000ff">write-host</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">"Connected.
Press ^D followed by [ENTER] to exit.`n"</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$stream</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$socket</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">GetStream</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$UseSSL</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$sslStream</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">New-Object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">System.Net.Security.SslStream</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$stream</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #ff4500">$false</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$sslStream</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">AuthenticateAsClient</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$remoteHost</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$stream</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$sslStream</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$writer</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">new-object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">System.IO.StreamWriter</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$stream</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">while</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$true</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
Receive the output that has buffered so far</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$SCRIPT:output</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">GetOutput</span>
                      <br />
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
If we're in scripted mode, send the commands,</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
receive the output, and exit.</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$scriptedMode</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #00008b">foreach</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$line</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">in</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$currentInput</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #ff4500">$writer</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">WriteLine</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$line</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #ff4500">$writer</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Flush</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #0000ff">Start-Sleep</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-m</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$commandDelay</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #ff4500">$SCRIPT:output</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">GetOutput</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #00008b">break</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
If we're in interactive mode, write the buffered</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
output, and respond to input.</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">else</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$output</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #00008b">foreach</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$line</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">in</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$output</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Split</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #8b0000">"`n"</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">                    </span>
                      <span style="color: #0000ff">write-host</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$line</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #ff4500">$SCRIPT:output</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">""</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #006400">##
Read the user's command, quitting if they hit ^D</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$command</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">read-host</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$command</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-eq</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">(</span>
                      <span style="color: #008080">[char]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">4</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">break</span>
                      <span style="color: #000000">;</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #006400">##
Otherwise, Write their command to the remote host </span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$writer</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">WriteLine</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$command</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #ff4500">$writer</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Flush</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Close the streams</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$writer</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Close</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$stream</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Close</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
If we're in scripted mode, return the output</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$scriptedMode</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$output</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #006400">## Read output from a remote host</span>
                      <br />
                      <span style="color: #00008b">function</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">GetOutput</span>
                      <br />
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Create a buffer to receive the response</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$buffer</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">new-object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">System.Byte[]</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">1024</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$encoding</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">new-object</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8a2be2">System.Text.AsciiEncoding</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$outputBuffer</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #8b0000">""</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$foundMore</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$false</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
Read all the data available from the stream, writing it to the</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #006400">##
output buffer when done.</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #00008b">do</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
Allow data to buffer for a bit</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #0000ff">start-sleep</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000080">-m</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">1000</span>
                      <br />
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #006400">##
Read what data is available</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$foundmore</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$false</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #ff4500">$stream</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">ReadTimeout</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">1000</span>
                      <br />
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #00008b">do</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #00008b">try</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #ff4500">$read</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$stream</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">Read</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$buffer</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">1024</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #00008b">if</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$read</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-gt</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #000000">{</span>
                      <br />
                      <span style="color: #000000">                    </span>
                      <span style="color: #ff4500">$foundmore</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$true</span>
                      <br />
                      <span style="color: #000000">                    </span>
                      <span style="color: #ff4500">$outputBuffer</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">+=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$encoding</span>
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000">GetString</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$buffer</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #a9a9a9">,</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$read</span>
                      <span style="color: #000000">)</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">                </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">            </span>
                      <span style="color: #000000">}</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">catch</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">{</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$foundMore</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$false</span>
                      <span style="color: #000000">;</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #ff4500">$read</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">=</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #000000">}</span>
                      <br />
                      <span style="color: #000000">        </span>
                      <span style="color: #000000">}</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">while</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$read</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #a9a9a9">-gt</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #800080">0</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #000000">}</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #00008b">while</span>
                      <span style="color: #000000">(</span>
                      <span style="color: #ff4500">$foundmore</span>
                      <span style="color: #000000">)</span>
                      <br />
                      <br />
                      <span style="color: #000000">    </span>
                      <span style="color: #ff4500">$outputBuffer</span>
                      <br />
                      <span style="color: #000000">}</span>
                      <br />
                      <br />
                      <span style="color: #a9a9a9">.</span>
                      <span style="color: #000000"> </span>
                      <span style="color: #0000ff">Main</span>
                    </div>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </blockquote>
        <p>
[Edit: Thanks to Marco for pointing out a few issues that come up when you try to
retrieve massive amounts of data (such as a newsgroup listing). I've updated the script
to fix those.] 
<br />
[Edit2: Updated to call it Send-TcpRequest, and support SSL]
</p>
        <img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6" />
      </body>
      <title>Scripting Network / TCP Connections in PowerShell</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6.aspx</guid>
      <link>http://www.leeholmes.com/blog/ScriptingNetworkTCPConnectionsInPowerShell.aspx</link>
      <pubDate>Wed, 28 Oct 2009 02:51:58 GMT</pubDate>
      <description>&lt;p&gt;
Awhile back, I introduced a script that allows you interact with remote TCP ports
(such as Telnet.) While useful, it worked only interactively. It would be even more
useful if you were able to script a network or TCP connection.
&lt;/p&gt;
&lt;p&gt;
Let me introduce &lt;font face="Courier New"&gt;Send-TcpRequest.ps1&lt;/font&gt; v2, which allows
exactly that:
&lt;/p&gt;
&lt;p&gt;
First, a simple scripted HTTP session:
&lt;/p&gt;
&lt;blockquote style="margin-right: 0px" dir="ltr"&gt; 
&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid" id="htmlcode"&gt;
&lt;div style="font-family: courier new"&gt;$http = @&amp;quot; 
&lt;br /&gt;
GET / HTTP/&lt;span style="color: maroon"&gt;1&lt;/span&gt;&lt;span style="color: maroon"&gt;.1&lt;/span&gt; 
&lt;br /&gt;
Host:search.msn.com 
&lt;br /&gt;
`n`n 
&lt;br /&gt;
&amp;quot;@ 
&lt;br /&gt;
&lt;br /&gt;
$http | Send-TcpRequest search.msn.com &lt;span style="color: maroon"&gt;80&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Second, a scripted POP3 session (Parse-TextObject comes from here: &lt;a href="http://www.leeholmes.com/blog/parsetextObjectAWKWithAVengeance.aspx"&gt;http://www.leeholmes.com/blog/parsetextObjectAWKWithAVengeance.aspx&lt;/a&gt;):
&lt;/p&gt;
&lt;blockquote style="margin-right: 0px" dir="ltr"&gt; 
&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; overflow: auto; border-top: gray 1px solid; border-right: gray 1px solid" id="htmlcode"&gt;
&lt;div style="font-family: courier new"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;(-not (test-path
Variable:\mailCredential)) 
&lt;br /&gt;
{ 
&lt;br /&gt;
&amp;#160;&amp;#160; $mailCredential = Get-Credential 
&lt;br /&gt;
} 
&lt;br /&gt;
$address = $mailCredential.UserName 
&lt;br /&gt;
$password = $mailCredential.GetNetworkCredential().Password 
&lt;br /&gt;
$pop3Commands = &lt;span style="color: maroon"&gt;&amp;quot;USER $address&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon"&gt;&amp;quot;PASS
$password&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon"&gt;&amp;quot;STAT&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon"&gt;&amp;quot;QUIT&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
$output = $pop3Commands | Send-TcpRequest mail.leeholmes.com &lt;span style="color: maroon"&gt;110&lt;/span&gt; 
&lt;br /&gt;
$inbox = $output.Split(&lt;span style="color: maroon"&gt;&amp;quot;`n&amp;quot;&lt;/span&gt;)[&lt;span style="color: maroon"&gt;3&lt;/span&gt;] 
&lt;br /&gt;
$status = $inbox | Parse-TextObject -PropertyName &lt;span style="color: maroon"&gt;&amp;quot;Response&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon"&gt;&amp;quot;Waiting&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon"&gt;&amp;quot;BytesTotal&amp;quot;&lt;/span&gt;,&lt;span style="color: maroon"&gt;&amp;quot;Extra&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: maroon"&gt;&amp;quot;{0} messages waiting, totaling {1} bytes.&amp;quot;&lt;/span&gt; -f
$status.Waiting,$status.BytesTotal
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Now, here is Send-TcpRequest.ps1
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 5px; padding-left: 5px; width: 650px; padding-right: 5px; font-family: consolas,lucida console; font-size: 10pt; overflow: auto; border-top: black 1px solid; border-right: black 1px solid; padding-top: 5px"&gt;
&lt;table border="0" cellspacing="0" cellpadding="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #cecece; font-size: 10pt; padding-top: 5px"&gt;001 
&lt;br /&gt;
002 
&lt;br /&gt;
003 
&lt;br /&gt;
004 
&lt;br /&gt;
005 
&lt;br /&gt;
006 
&lt;br /&gt;
007 
&lt;br /&gt;
008 
&lt;br /&gt;
009 
&lt;br /&gt;
010 
&lt;br /&gt;
011 
&lt;br /&gt;
012 
&lt;br /&gt;
013 
&lt;br /&gt;
014 
&lt;br /&gt;
015 
&lt;br /&gt;
016 
&lt;br /&gt;
017 
&lt;br /&gt;
018 
&lt;br /&gt;
019 
&lt;br /&gt;
020 
&lt;br /&gt;
021 
&lt;br /&gt;
022 
&lt;br /&gt;
023 
&lt;br /&gt;
024 
&lt;br /&gt;
025 
&lt;br /&gt;
026 
&lt;br /&gt;
027 
&lt;br /&gt;
028 
&lt;br /&gt;
029 
&lt;br /&gt;
030 
&lt;br /&gt;
031 
&lt;br /&gt;
032 
&lt;br /&gt;
033 
&lt;br /&gt;
034 
&lt;br /&gt;
035 
&lt;br /&gt;
036 
&lt;br /&gt;
037 
&lt;br /&gt;
038 
&lt;br /&gt;
039 
&lt;br /&gt;
040 
&lt;br /&gt;
041 
&lt;br /&gt;
042 
&lt;br /&gt;
043 
&lt;br /&gt;
044 
&lt;br /&gt;
045 
&lt;br /&gt;
046 
&lt;br /&gt;
047 
&lt;br /&gt;
048 
&lt;br /&gt;
049 
&lt;br /&gt;
050 
&lt;br /&gt;
051 
&lt;br /&gt;
052 
&lt;br /&gt;
053 
&lt;br /&gt;
054 
&lt;br /&gt;
055 
&lt;br /&gt;
056 
&lt;br /&gt;
057 
&lt;br /&gt;
058 
&lt;br /&gt;
059 
&lt;br /&gt;
060 
&lt;br /&gt;
061 
&lt;br /&gt;
062 
&lt;br /&gt;
063 
&lt;br /&gt;
064 
&lt;br /&gt;
065 
&lt;br /&gt;
066 
&lt;br /&gt;
067 
&lt;br /&gt;
068 
&lt;br /&gt;
069 
&lt;br /&gt;
070 
&lt;br /&gt;
071 
&lt;br /&gt;
072 
&lt;br /&gt;
073 
&lt;br /&gt;
074 
&lt;br /&gt;
075 
&lt;br /&gt;
076 
&lt;br /&gt;
077 
&lt;br /&gt;
078 
&lt;br /&gt;
079 
&lt;br /&gt;
080 
&lt;br /&gt;
081 
&lt;br /&gt;
082 
&lt;br /&gt;
083 
&lt;br /&gt;
084 
&lt;br /&gt;
085 
&lt;br /&gt;
086 
&lt;br /&gt;
087 
&lt;br /&gt;
088 
&lt;br /&gt;
089 
&lt;br /&gt;
090 
&lt;br /&gt;
091 
&lt;br /&gt;
092 
&lt;br /&gt;
093 
&lt;br /&gt;
094 
&lt;br /&gt;
095 
&lt;br /&gt;
096 
&lt;br /&gt;
097 
&lt;br /&gt;
098 
&lt;br /&gt;
099 
&lt;br /&gt;
100 
&lt;br /&gt;
101 
&lt;br /&gt;
102 
&lt;br /&gt;
103 
&lt;br /&gt;
104 
&lt;br /&gt;
105 
&lt;br /&gt;
106 
&lt;br /&gt;
107 
&lt;br /&gt;
108 
&lt;br /&gt;
109 
&lt;br /&gt;
110 
&lt;br /&gt;
111 
&lt;br /&gt;
112 
&lt;br /&gt;
113 
&lt;br /&gt;
114 
&lt;br /&gt;
115 
&lt;br /&gt;
116 
&lt;br /&gt;
117 
&lt;br /&gt;
118 
&lt;br /&gt;
119 
&lt;br /&gt;
120 
&lt;br /&gt;
121 
&lt;br /&gt;
122 
&lt;br /&gt;
123 
&lt;br /&gt;
124 
&lt;br /&gt;
125 
&lt;br /&gt;
126 
&lt;br /&gt;
127 
&lt;br /&gt;
128 
&lt;br /&gt;
129 
&lt;br /&gt;
130 
&lt;br /&gt;
131 
&lt;br /&gt;
132 
&lt;br /&gt;
133 
&lt;br /&gt;
134 
&lt;br /&gt;
135 
&lt;br /&gt;
136 
&lt;br /&gt;
137 
&lt;br /&gt;
138 
&lt;br /&gt;
139 
&lt;br /&gt;
140 
&lt;br /&gt;
141 
&lt;br /&gt;
142 
&lt;br /&gt;
143 
&lt;br /&gt;
144 
&lt;br /&gt;
145 
&lt;br /&gt;
146 
&lt;br /&gt;
147 
&lt;br /&gt;
148 
&lt;br /&gt;
149 
&lt;br /&gt;
150 
&lt;br /&gt;
151 
&lt;br /&gt;
152 
&lt;br /&gt;
153 
&lt;br /&gt;
154 
&lt;br /&gt;
155 
&lt;br /&gt;
156 
&lt;br /&gt;
157 
&lt;br /&gt;
158 
&lt;br /&gt;
159 
&lt;br /&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td valign="top" nowrap="nowrap"&gt;
&lt;div style="padding-bottom: 5px; padding-left: 5px; padding-right: 5px; font-family: consolas,lucida console; background: #fcfcfc; font-size: 10pt; padding-top: 5px"&gt;&lt;span style="color: #006400"&gt;##############################################################################&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Send-TcpRequest.ps1&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## From Windows PowerShell Cookbook (O'Reilly)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## by Lee Holmes (http://www.leeholmes.com/guide)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Send a TCP request to a remote computer, and return
the response.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## If you do not supply input to this script (via either
the pipeline, or the&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## -InputObject parameter,) the script operates in interactive
mode.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Example:&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## $http = @&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## GET / HTTP/1.1&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Host:search.msn.com&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## `n`n&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## &amp;quot;@&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## $http | Send-TcpRequest search.msn.com 80&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;##############################################################################&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;param&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[string]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$remoteHost&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[int]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$port&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;80&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[switch]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$UseSSL&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[string]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputObject&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #008080"&gt;[int]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$commandDelay&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;100&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #008080"&gt;[string]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$output&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Store the input into an array that we can scan over.
If there was no input,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## then we will be in interactive mode.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$currentInput&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$inputObject&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-not&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentInput&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$SCRIPT:currentInput&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;@(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$input&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #ff4500"&gt;$scriptedMode&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #008080"&gt;[bool]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentInput&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;Main&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Open the socket, and connect to the computer on the specified port&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-not&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$scriptedMode&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;write-host&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;Connecting
to $remoteHost on port $port&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;trap&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Write-Error&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;Could
not connect to remote computer: $_&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;exit&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$socket&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Net.Sockets.TcpClient&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$remoteHost&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$port&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-not&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$scriptedMode&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;write-host&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;Connected.
Press ^D followed by [ENTER] to exit.`n&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$socket&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;GetStream&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$UseSSL&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$sslStream&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Net.Security.SslStream&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$false&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$sslStream&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;AuthenticateAsClient&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$remoteHost&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$sslStream&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$writer&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.IO.StreamWriter&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Receive the output that has buffered so far&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$SCRIPT:output&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;GetOutput&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If we're in scripted mode, send the commands,&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
receive the output, and exit.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$scriptedMode&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$line&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$currentInput&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$writer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;WriteLine&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$line&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$writer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Flush&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Start-Sleep&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-m&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$commandDelay&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$SCRIPT:output&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;GetOutput&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;break&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If we're in interactive mode, write the buffered&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
output, and respond to input.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;else&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$output&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$line&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$output&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Split&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;`n&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;write-host&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$line&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$SCRIPT:output&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Read the user's command, quitting if they hit ^D&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$command&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;read-host&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$command&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #008080"&gt;[char]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;break&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Otherwise, Write their command to the remote host &lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$writer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;WriteLine&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$command&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$writer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Flush&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Close the streams&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$writer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Close&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Close&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
If we're in scripted mode, return the output&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$scriptedMode&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$output&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #006400"&gt;## Read output from a remote host&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #00008b"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;GetOutput&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Create a buffer to receive the response&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$buffer&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Byte[]&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;1024&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$encoding&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new-object&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8a2be2"&gt;System.Text.AsciiEncoding&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$outputBuffer&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #8b0000"&gt;&amp;quot;&amp;quot;&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$foundMore&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$false&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Read all the data available from the stream, writing it to the&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
output buffer when done.&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;do&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Allow data to buffer for a bit&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;start-sleep&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000080"&gt;-m&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;1000&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #006400"&gt;##
Read what data is available&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$foundmore&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$false&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;ReadTimeout&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;1000&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;do&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;try&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$read&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$stream&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;Read&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$buffer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;1024&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #00008b"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$read&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$foundmore&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$true&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$outputBuffer&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$encoding&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;GetString&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$buffer&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;,&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$read&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$foundMore&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$false&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$read&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$read&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #a9a9a9"&gt;-gt&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #00008b"&gt;while&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff4500"&gt;$foundmore&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #ff4500"&gt;$outputBuffer&lt;/span&gt; 
&lt;br /&gt;
&lt;span style="color: #000000"&gt;}&lt;/span&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #a9a9a9"&gt;.&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Main&lt;/span&gt; 
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
[Edit: Thanks to Marco for pointing out a few issues that come up when you try to
retrieve massive amounts of data (such as a newsgroup listing). I've updated the script
to fix those.] 
&lt;br /&gt;
[Edit2: Updated to call it Send-TcpRequest, and support SSL]
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,dc3839e7-56b3-43b8-9a1f-fbf46cbb3ca6.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.leeholmes.com/blog/Trackback.aspx?guid=9afc7ec1-1cc2-443a-80c0-4a1e577cbd39</trackback:ping>
      <pingback:server>http://www.leeholmes.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.leeholmes.com/blog/PermaLink,guid,9afc7ec1-1cc2-443a-80c0-4a1e577cbd39.aspx</pingback:target>
      <dc:creator>
      </dc:creator>
      <wfw:comment>http://www.leeholmes.com/blog/CommentView,guid,9afc7ec1-1cc2-443a-80c0-4a1e577cbd39.aspx</wfw:comment>
      <wfw:commentRss>http://www.leeholmes.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9afc7ec1-1cc2-443a-80c0-4a1e577cbd39</wfw:commentRss>
      <title>PowerShell Activity Tracker</title>
      <guid isPermaLink="false">http://www.leeholmes.com/blog/PermaLink,guid,9afc7ec1-1cc2-443a-80c0-4a1e577cbd39.aspx</guid>
      <link>http://www.leeholmes.com/blog/PowerShellActivityTracker.aspx</link>
      <pubDate>Tue, 20 Oct 2009 17:07:26 GMT</pubDate>
      <description>&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Download: &lt;a title="http://www.leeholmes.com/projects/ActivityTracker/ActivityTracker.zip" href="http://www.leeholmes.com/projects/ActivityTracker/ActivityTracker.zip"&gt;http://www.leeholmes.com/projects/ActivityTracker/ActivityTracker.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Over the summer, &lt;a href="http://blogs.technet.com/heyscriptingguy/default.aspx"&gt;The
Scripting Guys&lt;/a&gt; ran an excellent series for the 2009 Summer Scripting Games. They
asked me to be a guest commentator for an event, and it turns out that it was something
I’d been toying with in one version or another for some time.
&lt;/p&gt;
&lt;p&gt;
The topic of this event was an &lt;em&gt;Activity Tracker&lt;/em&gt;. In your work life, it is
incredibly helpful to know how you spend your time. Personally, it greatly helps improve
your estimation skills: did you really spend as much time on the project as you thought
you would? Professionally, it helps you remember important events for a given time
period. For example, pulling status reports together for a manager, or reviewing your
year’s accomplishments in preparation for your yearly review.
&lt;/p&gt;
&lt;p&gt;
I’ve been using an activity tracker in one way or the other for several years now,
and definitely consider it a core tool / technique. 
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;h1&gt;Activity Tracker 
&lt;p&gt;
&lt;/p&gt;
&lt;/h1&gt;
&lt;p class="MsoNormal"&gt;
&lt;i style="mso-bidi-font-style: normal"&gt;A light-weight personal productivity tool 
&lt;p&gt;
&lt;/p&gt;
&lt;/i&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;
Activity Tracker helps you analyze your time by infrequently asking the simple question:
“&lt;i style="mso-bidi-font-style: normal"&gt;What are you doing?&lt;/i&gt;” 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p style="text-align: center" class="MsoNormal" align="center"&gt;
&lt;span style="mso-no-proof: yes"&gt;&lt;a href="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/PowerShellActivityTracker_8E60/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.leeholmes.com/blog/content/binary/WindowsLiveWriter/PowerShellActivityTracker_8E60/clip_image002_thumb.jpg" width="602" height="304" v:shapes="Picture_x0020_4" /&gt;&lt;/a&gt;&lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;h1&gt;Installation 
&lt;p&gt;
&lt;/p&gt;
&lt;/h1&gt;
&lt;p style="text-indent: -0.25in; mso-list: l0 level1 lfo1" class="MsoListParagraphCxSpFirst"&gt;
&lt;span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: ignore"&gt;1)&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Copy
Start-ActivityTracker.ps1 to your local computer 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p style="text-indent: -0.25in; mso-list: l0 level1 lfo1" class="MsoListParagraphCxSpMiddle"&gt;
&lt;span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: ignore"&gt;2)&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Install
the PowerBoots UI scripting library into your Modules directory (&lt;a href="http://powerboots.codeplex.com"&gt;http://powerboots.codeplex.com&lt;/a&gt;).
Note: PowerBoots includes a “Functions” directory. Delete everything in it before
launching the first time. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p style="text-indent: -0.25in; mso-list: l0 level1 lfo1" class="MsoListParagraphCxSpMiddle"&gt;
&lt;span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: ignore"&gt;3)&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Place
a shortcut to the following command in your Startup folder: 
&lt;br /&gt;
&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt"&gt;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
-noprofile -command Start-ActivityTracker -AsApplication&lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p style="text-indent: -0.25in; mso-list: l0 level1 lfo1" class="MsoListParagraphCxSpLast"&gt;
&lt;span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;span style="mso-list: ignore"&gt;4)&lt;span style="font: 7pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(First
time only) Launch the shortcut from your Startup folder 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;h1&gt;How it Works 
&lt;p&gt;
&lt;/p&gt;
&lt;/h1&gt;
&lt;p class="MsoNormal"&gt;
Activity Tracker follows the same principles as a traditional software sampling profiler,
but instead samples humans. By randomly recording your current task, Activity Tracker
lets you analyze your answers as a fairly faithful proxy for how you actually spent
your time. If 20% of your answers were “Status Meeting,” then you spent close to 20%
of your time in status meetings. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;h3&gt;An Alternative to Sampling 
&lt;p&gt;
&lt;/p&gt;
&lt;/h3&gt;
&lt;p class="MsoNormal"&gt;
An alternative to the sampling approach is an instrumentation approach: faithfully
recording your transition between tasks. Activity Tracker avoids this design, since
asking humans to faithfully record transitions between tasks is enormously error-prone.
For example, you might not log a task transition for a task that you consider inconsequential
(for example, “Checking email”,) when in fact that task may account for a significant
portion of your day. Some software attempts to address the human element by tracking
window titles, but the level of data captured by window titles often does not map
well to the task they support. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;h1&gt;Using Activity Tracker 
&lt;p&gt;
&lt;/p&gt;
&lt;/h1&gt;
&lt;p class="MsoNormal"&gt;
Activity Tracker is a PowerShell script. It spawns a new instance of PowerShell to
run itself, but also lets you specify the –AsApplication flag if you want it to have
a unique name for the resulting exe. This new executable is simply a copy of PowerShell.exe. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p class="MsoNormal"&gt;
Once launched, Activity Tracker sits in the background. Once in awhile (randomly,
between 5 and 25 minutes,) it asks you the question, “&lt;i style="mso-bidi-font-style: normal"&gt;What
are you doing?&lt;/i&gt;” It stores your previous answers in a list until you exit the program,
which lets you easily re-use your answers to previous questions. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p class="MsoNormal"&gt;
When you press OK, it adds your answer (along with the current window title) to a
file in “My Documents\ActivityTracker” – one file per week. The file is named to correspond
to the date on the first day of the week. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;p class="MsoNormal"&gt;
If you don’t answer within four minutes, it dismisses the dialog and checks your Outlook
calendar. If you are in a meeting, it records the title of that meeting. If you aren’t
in a meeting, it records nothing. This lets you keep the Activity Tracker running
when you go home for the day without polluting your journal files. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;h1&gt;Slicing and Dicing 
&lt;p&gt;
&lt;/p&gt;
&lt;/h1&gt;
&lt;p class="MsoNormal"&gt;
The Activity Tracker records its output as a simple CSV file. Knowing that, you can
slice and dice results to your heart’s content. For example, to easily get a summary
of your week: 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;pre style="background: #012456"&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;PS &amp;gt;Import-Csv temp.csv | Group Activity
| Sort -Descending Count&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;Count Name&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Group&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;----- ----&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;-----&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160; &lt;/span&gt;23
Hubble Space Telecsope... {@{Date=5/20/2009 8:24:19 AM; WindowTi... 
&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;8
Meeting: Design review&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{@{Date=5/20/2009
1:10:21 PM; WindowTi... 
&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;5
Meeting: Team meeting&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{@{Date=5/20/2009
3:10:20 PM; WindowTi... 
&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;4
Email&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{@{Date=5/20/2009
8:04:26 AM; WindowTi... 
&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;3
Scripting games&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{@{Date=5/19/2009
6:09:16 PM; WindowTi... 
&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: #eeedf0"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&amp;lt;?xml:namespace
prefix = o /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p class="MsoNormal"&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&gt;
&lt;p class="MsoNormal"&gt;
To count how many hours you spent on a task, simply divide by four. 
&lt;p&gt;
&lt;/p&gt;
&gt;
&lt;h1&gt;Dependencies 
&lt;p&gt;
&lt;/p&gt;
&lt;/h1&gt;
&lt;p class="MsoNormal"&gt;
Activity tracker uses the PowerBoots UI scripting library: &lt;a href="http://powerboots.codeplex.com/"&gt;http://powerboots.codeplex.com/&lt;/a&gt;. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.leeholmes.com/blog/aggbug.ashx?id=9afc7ec1-1cc2-443a-80c0-4a1e577cbd39" /&gt;</description>
      <comments>http://www.leeholmes.com/blog/CommentView,guid,9afc7ec1-1cc2-443a-80c0-4a1e577cbd39.aspx</comments>
    </item>
  </channel>
</rss>