<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[TimRayburn.net]]></title>
  
  <link href="http://TimRayburn.net/" />
  <updated>2013-05-18T08:04:17-05:00</updated>
  <id>http://TimRayburn.net/</id>
  <author>
    <name><![CDATA[Tim Rayburn]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TimRayburnsBlog" /><feedburner:info uri="timrayburnsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>32.634203</geo:lat><geo:long>-97.144036</geo:long><feedburner:emailServiceId>TimRayburnsBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
    <title type="html"><![CDATA[Books Every Software Developer Should Read]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/tiGVjgaC8t4/" />
    <updated>2013-05-18T07:30:00-05:00</updated>
    <id>http://TimRayburn.net/blog/books-every-software-developer-should-read</id>
    <content type="html">&lt;p&gt;Yesterday at AgileDotNet, before one of my sessions, we were discussing books which every software developer should read with the room, and particularly with a bunch of SMU students who came down to Houston to attend.  I promised I would post the list of those books to my blog, so here they are:&lt;/p&gt;

&lt;h2&gt;The Must Read List (in Order)&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0596008678/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596008678&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Head First Object-Oriented Analysis and Design by Brett Mclaughlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0132350882/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0132350882&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Clean Code : A Handbook of Agile Software Craftsmanship  by Robert Martin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0735619670/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0735619670&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Code Complete: A Practical Handbook of Software Construction, Second Edition by Steve McConnell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0321213351/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321213351&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Refactoring to Patterns by Joshua Kerievsky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0131177052/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131177052&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Working Effectively with Legacy Code by Michael Feathers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0596007124/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596007124&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Head First Design Patterns by Eric Freeman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Books You Should Read &amp;amp; Own Eventually&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/B000SEIBB8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000SEIBB8&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides aka &amp;#8220;The Gang of Four&amp;#8221;&lt;/a&gt;&lt;br/&gt;
This is the original work which brought about the terminology of Design Patterns.  We recommend the Head First book above over it simply because it&amp;#8217;s examples are in SmallTalk and C++, which means that its showing its age.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0988262592/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0988262592&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win by Kevin Behr&lt;/a&gt;&lt;br/&gt;
This book is a great story about how Operations and Developers can work together, and should be read by most teams trying to tighten their relationship with their operations team.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0321200683/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0321200683&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions by Bobby Woolf and Gregor Hohpe&lt;/a&gt;&lt;br/&gt;
This book should be read and used as the bible for any distributed message application you build.  I&amp;#8217;d remind you that these days most websites with APIs really are a distributed application.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=tiGVjgaC8t4:yAxlA99iY00:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tiGVjgaC8t4:yAxlA99iY00:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=tiGVjgaC8t4:yAxlA99iY00:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/tiGVjgaC8t4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/books-every-software-developer-should-read/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[PowerShell for Developers - DRY]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/-XmuhhICgN0/" />
    <updated>2013-05-12T21:06:00-05:00</updated>
    <id>http://TimRayburn.net/blog/powershell-for-developers-dry</id>
    <content type="html">&lt;p&gt;DRY is an acronym that was created by &lt;a href="http://www.amazon.com/gp/product/020161622X/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=020161622X&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Andrew Hunt and Dave Thomas in their book The Pragmatic Programmer&lt;/a&gt;.  It stands for Don&amp;#8217;t Repeat Yourself.  We&amp;#8217;ve espoused terse commands in all the previous chapters, but how to I avoid having to re-invent the wheel every time I open a PowerShell prompt.&lt;/p&gt;

&lt;h2&gt;Profiles&lt;/h2&gt;

&lt;p&gt;There is a script which runs every time you open a PowerShell prompt, it&amp;#8217;s called your Profile.  The file name varies depending on your operating system and version, but you can find it quickly by opening a prompt and typing &lt;code&gt;$profile&lt;/code&gt; like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $profile
&lt;/span&gt;&lt;span class='line'&gt;C:\Users\Tim\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now if you&amp;#8217;ve got a brand new environment, this file may not even exist.  You can test if it does, and then create it if it does not with the following commands:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Test-Path $PROFILE
&lt;/span&gt;&lt;span class='line'&gt;False
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; New-Item -path $profile -type file -force
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\Users\Tim\Documents\WindowsPowerShell
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;-a---         5/12/2013   6:09 PM          0 Microsoft.PowerShell_profile.ps1
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; notepad $PROFILE&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The first command ensures that the you don&amp;#8217;t already have a profile.  If it returns true, the skip the second command.&lt;/p&gt;

&lt;p&gt;The second command created the profile, as a file, and uses -force to create any directories required to create the item along the way.  This command will work even if you don&amp;#8217;t have a &lt;code&gt;WindowsPowershell&lt;/code&gt; directory in your &lt;code&gt;Documents&lt;/code&gt; folder.&lt;/p&gt;

&lt;h3&gt;What do I put in a $PROFILE?&lt;/h3&gt;

&lt;p&gt;Things you don&amp;#8217;t want to type over and over again, of course.  Don&amp;#8217;t Repeat Yourself (DRY).  Now, in reality you don&amp;#8217;t want your profile to become just a giant function library, we have a concept called Modules for that, which we will discuss in just a minute, but there are some things which belong in your $PROFILE.&lt;/p&gt;

&lt;h4&gt;The Prompt&lt;/h4&gt;

&lt;p&gt;There is a special function called &lt;code&gt;Prompt&lt;/code&gt; which you can define, that controls how what your command prompt looks like.  You may have noticed that during this article I&amp;#8217;ve had a very basic prompt that was just &lt;code&gt;&amp;gt;&lt;/code&gt;, but most of you likely have a prompt that looks more like this &lt;code&gt;PS C:\Source&amp;gt;&lt;/code&gt;.  There is no trickery, I just wanted to make my prompt minimalist for these articles, so I typed the following:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; function prompt { "&amp;gt; " }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, instantly my prompt was set to the minimalist version you&amp;#8217;ve seen in all these articles.  How is the default prompt defined?  Let&amp;#8217;s see, shall we?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; (get-item Function:\prompt).Definition
&lt;/span&gt;&lt;span class='line'&gt;"PS $($executionContext.SessionState.Path.CurrentLocation)$('&amp;gt;' * ($nestedPromptLevel + 1)) "
&lt;/span&gt;&lt;span class='line'&gt;# .Link
&lt;/span&gt;&lt;span class='line'&gt;# http://go.microsoft.com/fwlink/?LinkID=225750
&lt;/span&gt;&lt;span class='line'&gt;# .ExternalHelp System.Management.Automation.dll-help.xml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So this prompt is defined as &lt;code&gt;PS&lt;/code&gt; followed by the expression &lt;code&gt;$executionContext.SessionState.Path.CurrentLocation&lt;/code&gt; which gets the current location of the execution context (aka the directory you&amp;#8217;re in).  Then, it displays one &lt;code&gt;&amp;gt;&lt;/code&gt; for every level of &lt;code&gt;$nestedPromptLevel&lt;/code&gt;, adding one.  Well if your like most people, you&amp;#8217;ve likely got no idea what the heck &lt;code&gt;$nestedPromptLevel&lt;/code&gt; is.  We will discuss it further, but for the most basic idea, there is a command called &lt;code&gt;$Host.EnterNestedPrompt()&lt;/code&gt; which creates a new prompt.  Like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; $host.EnterNestedPrompt()
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&amp;gt; $host.EnterNestedPrompt()
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&amp;gt;&amp;gt; $host.EnterNestedPrompt()
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&amp;gt;&amp;gt;&amp;gt; exit
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&amp;gt;&amp;gt; exit
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&amp;gt; exit
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, each nested level of prompt adds a &lt;code&gt;&amp;gt;&lt;/code&gt;, which makes perfect sense given the above &lt;code&gt;prompt&lt;/code&gt; function definition.&lt;/p&gt;

&lt;h2&gt;Location&lt;/h2&gt;

&lt;p&gt;Your current working directory is on display in the prompt at all times, and you know if you want to change that directory, you use &lt;code&gt;cd&lt;/code&gt;.  It must be named &lt;code&gt;cd&lt;/code&gt;, both DOS and LINUX agree on this, how could it possibly be named something else, right?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; cd Highway
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source\Highway&amp;gt; alias cd
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           cd -&amp;gt; Set-Location&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Well, as you can see, in PowerShell, which &lt;code&gt;cd&lt;/code&gt; is an alias that exists by default for it, the actual command you&amp;#8217;re execution is &lt;code&gt;Set-Location&lt;/code&gt;.  Well, most programs would rightly assume that whatever you can &lt;code&gt;Set-&lt;/code&gt; you can also &lt;code&gt;Get-&lt;/code&gt;, right?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source\Highway&amp;gt; Get-Location
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Path
&lt;/span&gt;&lt;span class='line'&gt;----
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source\Highway&amp;gt; alias -Definition Get-Location
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           gl -&amp;gt; Get-Location
&lt;/span&gt;&lt;span class='line'&gt;Alias           pwd -&amp;gt; Get-Location&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Yup, Get-Location returns the current &lt;code&gt;Path&lt;/code&gt; we are at.  You can see that we have two aliases defined by default for us, one is just shorthand for Get-Item, and the other is a helper alias for our Linux friends, who use &lt;code&gt;pwd&lt;/code&gt; (short for Print Working Directory) to accomplish this same task.&lt;/p&gt;

&lt;h3&gt;Time to get pushy&lt;/h3&gt;

&lt;p&gt;Now, as it happens, in PowerShell (and Linux, and DOS) there are a couple of commands for working with Location that most people didn&amp;#8217;t learn when they were first struggling through how to work at a command prompt.  These two commands are called &lt;code&gt;pushd&lt;/code&gt; and &lt;code&gt;popd&lt;/code&gt; in Linux and DOS, but in PowerShell those are, of course, just aliases:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; alias pushd
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           pushd -&amp;gt; Push-Location
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; alias popd
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           popd -&amp;gt; Pop-Location&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So &lt;code&gt;Push-Location&lt;/code&gt; and &lt;code&gt;Pop-Location&lt;/code&gt; are commands that let you quickly leave your current location, but then return there very quickly.  Let me demonstrate:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; pushd 'C:\Windows\Microsoft.NET\Framework\v4.0.30319'
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Windows\Microsoft.NET\Framework\v4.0.30319&amp;gt; pushd 'C:\Program Files'
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Program Files&amp;gt; pushd 'C:\Program Files (x86)'
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Program Files (x86)&amp;gt; pushd 'C:\Users\Tim\Documents\WindowsPowerShell'
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Users\Tim\Documents\WindowsPowerShell&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Program Files (x86)&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Program Files&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Windows\Microsoft.NET\Framework\v4.0.30319&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; popd
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So initially, &lt;code&gt;pushd&lt;/code&gt; would appear to just be a longer version of &lt;code&gt;cd&lt;/code&gt;, it moves our current working directory to whichever directory we name.  But, when we then invoke &lt;code&gt;popd&lt;/code&gt; the magical nature becomes clear.  When we invoke &lt;code&gt;pushd&lt;/code&gt; it changes our directory, but puts the directory we&amp;#8217;re leaving on a stack of remembered directories.  &lt;a href="http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29"&gt;A stack, hence push and pop.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we pop the locations back off the stack, we are transported back to that location as our current working directory.  Pretty darn useful if you need to move from one path to another and back very quickly.&lt;/p&gt;

&lt;h3&gt;PSDrive&lt;/h3&gt;

&lt;p&gt;Now, Location is all well and good, but that described where you are a given drive.  My default drive, and likely yours, is &lt;code&gt;C:&lt;/code&gt; aka the C-Drive.  From time immemorial this has been the default hard drive letter in Windows. &lt;code&gt;A:&lt;/code&gt; and &lt;code&gt;B:&lt;/code&gt; were reserved for Floppy drives.  Hard drives started at the letter C and incremented from there.  But, that has been simply default for a long time now.&lt;/p&gt;

&lt;p&gt;In PowerShell, I can still use &lt;code&gt;C:&lt;/code&gt; and &lt;code&gt;D:&lt;/code&gt; to move between drives.  This next set of commands will only work if you have two drives (or an SSD and a &lt;a href="http://www.amazon.com/gp/product/B00AK31M3G/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00AK31M3G&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Flash card&lt;/a&gt; as I&amp;#8217;m using on my &lt;a href="http://www.amazon.com/gp/product/B00BE5T2TA/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00BE5T2TA&amp;amp;linkCode=as2&amp;amp;tag=timraybnet-20"&gt;Microsoft Surface Pro&lt;/a&gt;):&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; d:
&lt;/span&gt;&lt;span class='line'&gt;PS D:\&amp;gt; dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: D:\
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----         5/11/2013   2:17 PM            iTunes
&lt;/span&gt;&lt;span class='line'&gt;d----         5/11/2013   2:27 PM            iTunes Library
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;PS D:\&amp;gt; c:
&lt;/span&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\Source
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/7/2013   1:57 PM            Blog
&lt;/span&gt;&lt;span class='line'&gt;d----          5/9/2013   7:06 PM            Highway
&lt;/span&gt;&lt;span class='line'&gt;d----         5/11/2013   4:17 PM            Node
&lt;/span&gt;&lt;span class='line'&gt;d----          5/5/2013   5:13 PM            PowerShell
&lt;/span&gt;&lt;span class='line'&gt;d----         4/11/2013  11:58 PM            Presentation-EasyESB
&lt;/span&gt;&lt;span class='line'&gt;d----         5/10/2013   7:55 PM            RrynVsPS
&lt;/span&gt;&lt;span class='line'&gt;d----         4/20/2013   1:53 PM            SynTask&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, the commands move me between those two drives.  But in reality, the concept of a &lt;em&gt;drive&lt;/em&gt; has been much expanded in PowerShell.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If it has hierarchy (aka Locations) you want to Navigate, or items you want to inspect, then in PowerShell someone will likely have made it a drive.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;There is a command in PowerShell that lists all current drives:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; Get-PSDrive
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
&lt;/span&gt;&lt;span class='line'&gt;----           ---------     --------- --------      ----                                               ---------------
&lt;/span&gt;&lt;span class='line'&gt;Alias                                  Alias
&lt;/span&gt;&lt;span class='line'&gt;C                  78.10         32.42 FileSystem    C:\                                                         Source
&lt;/span&gt;&lt;span class='line'&gt;Cert                                   Certificate   \
&lt;/span&gt;&lt;span class='line'&gt;D                   3.29         56.16 FileSystem    D:\
&lt;/span&gt;&lt;span class='line'&gt;E                                      FileSystem    E:\
&lt;/span&gt;&lt;span class='line'&gt;Env                                    Environment
&lt;/span&gt;&lt;span class='line'&gt;Function                               Function
&lt;/span&gt;&lt;span class='line'&gt;HKCU                                   Registry      HKEY_CURRENT_USER
&lt;/span&gt;&lt;span class='line'&gt;HKLM                                   Registry      HKEY_LOCAL_MACHINE
&lt;/span&gt;&lt;span class='line'&gt;Variable                               Variable
&lt;/span&gt;&lt;span class='line'&gt;WSMan                                  WSMan&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;blink&lt;/strong&gt; &lt;strong&gt;blink&lt;/strong&gt; &amp;#8230; Ok, so that is more drives than I was expecting when I first invoked this command.  So what all drives are those, and how do I use them?&lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;Set-Location&lt;/code&gt;, aka &lt;code&gt;cd&lt;/code&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS C:\Source&amp;gt; cd alias:
&lt;/span&gt;&lt;span class='line'&gt;PS Alias:\&amp;gt; ls | select -first 5
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           % -&amp;gt; ForEach-Object
&lt;/span&gt;&lt;span class='line'&gt;Alias           ? -&amp;gt; Where-Object
&lt;/span&gt;&lt;span class='line'&gt;Alias           ac -&amp;gt; Add-Content
&lt;/span&gt;&lt;span class='line'&gt;Alias           asnp -&amp;gt; Add-PSSnapin
&lt;/span&gt;&lt;span class='line'&gt;Alias           cat -&amp;gt; Get-Content&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Here I&amp;#8217;ve &lt;code&gt;Set-Location&lt;/code&gt; to the Alias drive, and listed the first 5 items.  Each PSDrive has different contents depending on what it is representing.  Here&amp;#8217;s a sum-up of the contents of the &lt;strong&gt;default&lt;/strong&gt; set of drives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C, D and E drive are File System drives, representing your various mounted drives.  In my case they are my SSD, Flash card, and virtual CD drive.&lt;/li&gt;
&lt;li&gt;Cert represents your digital certificate store, both CurrentUser and LocalMachine, which are the two root locations.&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Alias:\&amp;gt; cd Cert:
&lt;/span&gt;&lt;span class='line'&gt;PS Cert:\&amp;gt; ls | select -first 5
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Location   : CurrentUser
&lt;/span&gt;&lt;span class='line'&gt;StoreNames : {SmartCardRoot, Root, Trust, AuthRoot...}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Location   : LocalMachine
&lt;/span&gt;&lt;span class='line'&gt;StoreNames : {TrustedPublisher, ClientAuthIssuer, Remote Desktop, Root...}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;ul&gt;
&lt;li&gt;Env represents your Environment Variables, which contains all defined environment variables for your machine.&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Cert:\&amp;gt; cd env:
&lt;/span&gt;&lt;span class='line'&gt;PS Env:\&amp;gt; ls | select -first 5
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;ALLUSERSPROFILE                C:\ProgramData
&lt;/span&gt;&lt;span class='line'&gt;APPDATA                        C:\Users\Tim\AppData\Roaming
&lt;/span&gt;&lt;span class='line'&gt;asl.log                        Destination=file
&lt;/span&gt;&lt;span class='line'&gt;ChocolateyInstall              C:\Chocolatey
&lt;/span&gt;&lt;span class='line'&gt;CommonProgramFiles             C:\Program Files\Common Files&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;ul&gt;
&lt;li&gt;Function represents all functions defined in PowerShell, and in fact is how I showed you the definition of &lt;code&gt;prompt&lt;/code&gt; earlier in this chapter (go ahead, look back, I don&amp;#8217;t mind)&lt;/li&gt;
&lt;li&gt;HKCU and HKLM represent your register, and specifically the &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt; and &lt;strong&gt;HKEY_LOCAL_MACHINE&lt;/strong&gt; sections of it.  For instance, want to know all versions of the .NET Framework 4.0 installed on your box?&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Env:\&amp;gt; ls HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs | %{$_.Name}
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.1
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.1,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.2
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.2,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3,Profile=Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.5
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\Client
&lt;/span&gt;&lt;span class='line'&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\Default&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;ul&gt;
&lt;li&gt;Variable represents all current variables defined in your scope.&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;PS Env:\&amp;gt; ls Variable:\ | select -first 3
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;$                              Get-PSDrive
&lt;/span&gt;&lt;span class='line'&gt;?                              True
&lt;/span&gt;&lt;span class='line'&gt;^                              Get-PSDrive&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;ul&gt;
&lt;li&gt;WSMan represents the &amp;#8220;Windows Remote Management&amp;#8221; aka WinRM settings.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Moreover, these are just the beginning.  Lots of modules, which we are about to discuss, create even more drives.  With the right modules you can browse around Active Directory, SQL Servers, IIS Websites, and so much more.&lt;/p&gt;

&lt;h2&gt;Modules Basics&lt;/h2&gt;

&lt;p&gt;Modules are a way to expand your available functions, drives, etc in PowerShell, but in an optional manner.  Any given PowerShell environment can load many different Modules, in and adhoc manner.  You can get a list of the current Modules you&amp;#8217;re running as so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Module
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;ModuleType Name                                ExportedCommands
&lt;/span&gt;&lt;span class='line'&gt;---------- ----                                ----------------
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Content...}
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.PowerShell.Security       {ConvertFrom-SecureString, ConvertTo-SecureString, Get-Acl, Get-Authe...
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
&lt;/span&gt;&lt;span class='line'&gt;Manifest   Microsoft.WSMan.Management          {Connect-WSMan, Disable-WSManCredSSP, Disconnect-WSMan, Enable-WSManC...
&lt;/span&gt;&lt;span class='line'&gt;Manifest   pki                                 {Add-CertificateEnrollmentPolicyServer, Export-Certificate, Export-Pf...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, I have four modules loaded at the current time.  But those are just what I have loaded.  What I have available to me is quite another thing.  If you type &lt;code&gt;Get-Module -ListAvailable&lt;/code&gt; it will show you all of your possible options, but that output is large.  I&amp;#8217;m going to limit it somewhat here:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Module -ListAvailable | select -first 10
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\Users\Tim\Documents\WindowsPowerShell\Modules
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;ModuleType Name                                ExportedCommands
&lt;/span&gt;&lt;span class='line'&gt;---------- ----                                ----------------
&lt;/span&gt;&lt;span class='line'&gt;Script     EZOut                               {Add-FormatData, Clear-FormatData, Out-FormatData, Remove-FormatData...}
&lt;/span&gt;&lt;span class='line'&gt;Script     IsePackV2                           {Add-PowerGUIMenu, Add-IseMenu, Add-Icicle, Clear-Icicle...}
&lt;/span&gt;&lt;span class='line'&gt;Script     Pester                              {Assert-MockCalled, Assert-VerifiableMocks, Context, Describe...}
&lt;/span&gt;&lt;span class='line'&gt;Script     Pipeworks                           {Get-FunctionFromScript, Write-PowerShellHashtable, Import-PSData, Ex...
&lt;/span&gt;&lt;span class='line'&gt;Script     psake                               {Assert, Exec, FormatTaskName, Framework...}
&lt;/span&gt;&lt;span class='line'&gt;Script     PsGet                               {Get-PsGetModuleHash, Get-PsGetModuleInfo, Install-Module, Update-Mod...
&lt;/span&gt;&lt;span class='line'&gt;Script     ScriptCop                           {Get-ScriptCopRule, Register-ScriptCopRule, Unregister-ScriptCopRule,...
&lt;/span&gt;&lt;span class='line'&gt;Script     Send-Growl                          {Get-GrowlPath, Register-GrowlCallback, Register-GrowlType, Send-Grow...
&lt;/span&gt;&lt;span class='line'&gt;Script     ShowUI                              {Add-CodeGenerationRule, Add-UIModule, Select-UIType, Get-AssemblyNam...
&lt;/span&gt;&lt;span class='line'&gt;Script     TRayburn-Utils                      {New-BasicAuth, Set-AppSetting, Set-NuSpecVersion, Test-Item}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, I have a number of Modules installed, and they are installed by in the &lt;code&gt;WindowsPowerShell\Modules&lt;/code&gt; folder of my Documents folder.  But as I said, there are alot of them:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Module -ListAvailable | measure
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Count    : 62
&lt;/span&gt;&lt;span class='line'&gt;Average  :
&lt;/span&gt;&lt;span class='line'&gt;Sum      :
&lt;/span&gt;&lt;span class='line'&gt;Maximum  :
&lt;/span&gt;&lt;span class='line'&gt;Minimum  :
&lt;/span&gt;&lt;span class='line'&gt;Property :&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;62 in fact, on my box alone, and it isn&amp;#8217;t part of a domain, or a server, or one of many other things which might add to that list.&lt;/p&gt;

&lt;h3&gt;Creating your own modules&lt;/h3&gt;

&lt;p&gt;You can create your own modules very simply.  A module is just a PowerShell script, named &lt;code&gt;.psm1&lt;/code&gt; instead of simply &lt;code&gt;.ps1&lt;/code&gt; and which loads up a series of functions, cmdlets, aliases, etc.  The big additional requirement is that the script must also declare what it intends to make available to those who &lt;code&gt;Import&lt;/code&gt; that module.  Simply defining a function in a script isn&amp;#8217;t enough, you must also &lt;code&gt;Export&lt;/code&gt; that function to those who use the module.  This is done with the Cmdlet &lt;code&gt;Export-ModuleMember&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not going to go into details here about how to create a PowerShell module, there is alot of information out there on that already.  If you&amp;#8217;d like to see the source of one, check out either &lt;a href="https://github.com/trayburn/powershell"&gt;my PowerShell repository&lt;/a&gt;, or &lt;a href="https://github.com/pester/pester"&gt;the repository for Pester&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To use a module you have installed, simply type:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Import-Module &amp;lt;name&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Must-Have Modules&lt;/h3&gt;

&lt;p&gt;The community of developers and administrators in the world being the wonderful geeks that they are, there are many awesome Modules that have been made available for others to consume.  While it saddens me to report that there is not one consolidated repository, like NuGet for references, there are several good places.  Both &lt;a href="http://nuget.org"&gt;NuGet&lt;/a&gt; and &lt;a href="http://chocolatey.org"&gt;Chocolatey&lt;/a&gt; have PowerShell modules hiding in their directories, but in my opinion the best overall implementation for PowerShell is &lt;a href="http://psget.net"&gt;PsGet.net&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;PsGet&lt;/h3&gt;

&lt;p&gt;PsGet is the module that drives access to the PsGet.net directory of modules.  To get started with it, simply type:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This will download and install the PsGet module.  Once it&amp;#8217;s installed, go ahead and import that module:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Import-Module PsGet&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You now have two powerful commands are your disposal:
- Install-Module
- Update-Module&lt;/p&gt;

&lt;p&gt;With these, you can install any module from the PsGet.net directory with just one command.&lt;/p&gt;

&lt;h3&gt;Pester&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m a big fan of TDD/BDD and so I was sold the moment Pester was described to me as a BDD framework for PowerShell.  It allows me to test my modules with the familiar Describe, Context, It syntax.  This module was created by the awesome &lt;a href="http://about.me/scottmuc/"&gt;Scott Muc&lt;/a&gt; and I&amp;#8217;ve used it in my own PowerShell work.  Details on how to use it can be found at the &lt;a href="https://github.com/pester/pester/wiki"&gt;GitHub wiki&lt;/a&gt; for the project, and &lt;a href="http://scottmuc.com/powershell-pester-2-and-1-dot-2-released/"&gt;on Scott&amp;#8217;s blog&lt;/a&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Install-Module Pester
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Import-Module Pester&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;PowerShell Community Extensions&lt;/h3&gt;

&lt;p&gt;So what happens when lots of people love PowerShell and start putting together their greatest hits functions and CmdLets?  PowerShell Community Extensions (PSCX) or course!  Think of this as a -contrib project for PowerShell.  It has functions that do all sorts of things, from awesome, to cute.  How many commands?  148 as of this writing.  Everything from &lt;code&gt;Out-Speech&lt;/code&gt; which voice outputs any piped content, to quick helpers like &lt;code&gt;Set-ReadOnly&lt;/code&gt; and &lt;code&gt;Set-Writeable&lt;/code&gt;.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Install-Module PSCX
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Import-Module PSCX&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=-XmuhhICgN0:ZZ_q1ikGoYo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=-XmuhhICgN0:ZZ_q1ikGoYo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=-XmuhhICgN0:ZZ_q1ikGoYo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/-XmuhhICgN0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/powershell-for-developers-dry/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Agile.NET Houston 2013]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/W3k4ehZ6OvI/" />
    <updated>2013-05-10T16:45:00-05:00</updated>
    <id>http://TimRayburn.net/blog/agile-dot-net-houston-2013</id>
    <content type="html">&lt;p&gt;&lt;img class="left" src="http://TimRayburn.net/images/logo-houston-2013.png"&gt;&lt;/p&gt;

&lt;p&gt;So Agile.NET Houston is coming up soon, and I&amp;#8217;ll be there speaking as part of the Quartermaster track.  If you&amp;#8217;d like to attend, we still have some spots available, and you can use the discount code &lt;strong&gt;IEFriends50&lt;/strong&gt; to get 50% off the cost of registration, bringing it in at just $75.&lt;/p&gt;

&lt;h1&gt;&lt;a href="http://adnhouston.eventbrite.com/?discount=IEFriends50"&gt;Register Now&lt;/a&gt;&lt;/h1&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=W3k4ehZ6OvI:djUuUcdoC6M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=W3k4ehZ6OvI:djUuUcdoC6M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=W3k4ehZ6OvI:djUuUcdoC6M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/W3k4ehZ6OvI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/agile-dot-net-houston-2013/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[PowerShell for Developers - Functions]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/s479n3d-Qoc/" />
    <updated>2013-05-10T00:24:00-05:00</updated>
    <id>http://TimRayburn.net/blog/powershell-for-developers-functions</id>
    <content type="html">&lt;h2&gt;Pipeline&lt;/h2&gt;

&lt;p&gt;We&amp;#8217;ve been using it already quite a bit in the past chapters, but lets take a moment and introduce, properly, the pipeline.  Pipeline&amp;#8217;ing is powered in PowerShell using the pipe operator &lt;code&gt;|&lt;/code&gt;.  It passes data from one command, to another command.  That other command had better be able to use that data.  How?  Well there is not magic here, there is conventions instead.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s take a look at the help for our friend &lt;code&gt;Get-Item&lt;/code&gt;, we do that as by typing &lt;code&gt;help Get-Item&lt;/code&gt; or in our case &lt;code&gt;help Get-Item -Parameter Path&lt;/code&gt; which is asking for the help for the Path parameter specifically:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; help get-item -Parameter Path
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;-Path &amp;lt;String[]&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;    Specifies the path to an item. Get-Item gets the item at the specified location. Wildcards are permitted. This
&lt;/span&gt;&lt;span class='line'&gt;    parameter is required, but the parameter name ("Path") is optional.
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Use a dot (.) to specify the current location. Use the wildcard character (*) to specify all the items in the
&lt;/span&gt;&lt;span class='line'&gt;    current location.
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Required?                    true
&lt;/span&gt;&lt;span class='line'&gt;    Position?                    1
&lt;/span&gt;&lt;span class='line'&gt;    Default value
&lt;/span&gt;&lt;span class='line'&gt;    Accept pipeline input?       true (ByValue, ByPropertyName)
&lt;/span&gt;&lt;span class='line'&gt;    Accept wildcard characters?  true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Did you not get this?  You likely need to install the help, run &lt;code&gt;Update-Help&lt;/code&gt; and it will do so.  If you did get this, you&amp;#8217;ll see the line that talks about &lt;code&gt;Accept Pipeline Input?&lt;/code&gt; and that it states &lt;code&gt;true&lt;/code&gt; but more importantly that we can pass either &lt;strong&gt;ByValue&lt;/strong&gt; or &lt;strong&gt;ByPropertyName&lt;/strong&gt;.  Let us explore both of those for a moment.&lt;/p&gt;

&lt;h3&gt;By Value Pipeline&amp;#8217;ing&lt;/h3&gt;

&lt;p&gt;ByValue pipelines are the easiest to understand, in this case we can see from the help above we, the value for Path is expected to a &lt;code&gt;String[]&lt;/code&gt; (a string array).&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ $_.FullName }
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\build
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\src
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\.gitignore
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\license.txt
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\make.ps1
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\NDesk.Options.dll
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\OnRamper.exe
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\push.ps1
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\README.markdown
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So here we have taken a directory listing, which is objects as we have learned previously, and then done a &lt;code&gt;ForEach-Object&lt;/code&gt; on that to select just the FullName property.  FullName is a string, and so we are sending an array of strings out to the console currently.  How, lets send that same data to Get-Item:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ $_.FullName } | Get-Item
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\source\Highway\MVC
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            build
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   8:37 PM            src
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013   2:19 PM        259 .gitignore
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013   2:19 PM      16896 license.txt
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:11 AM        211 make.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013  11:46 PM      22016 NDesk.Options.dll
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013   6:36 PM      15872 OnRamper.exe
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:16 PM         62 push.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/2/2013   2:19 PM      17183 README.markdown
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:26 AM        332 setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Wait &amp;#8230; uhm &amp;#8230; what?  Sure, we just took a bunch of FileSystemInfo objects and dumped them to the console, you know how that formats them?  As a directory listing of course.  But that means we&amp;#8217;ve been successful in binding that data to Get-Item.  Prove it?  Ok&amp;#8230;&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ $_.FullName } | Get-Item | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So we have just bound &lt;strong&gt;ByValue&lt;/strong&gt;, we&amp;#8217;ve passed an array and it went to Path because of the value it was.&lt;/p&gt;

&lt;h3&gt;By Property Name Pipeline&amp;#8217;ing&lt;/h3&gt;

&lt;p&gt;So how do we pass &lt;strong&gt;ByPropertyName&lt;/strong&gt;?  Let us continue the above example:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir | %{ @{ Path=$_.FullName} }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\build
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\src
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\.gitignore
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\license.txt
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\make.ps1
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\NDesk.Options.dll
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\OnRamper.exe
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\push.ps1
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\README.markdown
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So here we have created a bunch of Hashtables that contain a property named Path.  Now this is to simple, it doesn&amp;#8217;t make that point that we could have other data included in these hashtables.  So I&amp;#8217;m going to add some of that, but limit the number of files:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir *.ps1 | %{ @{ Path=$_.FullName; Size=$_.Length; Updated=$_.LastWriteTime} }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\make.ps1
&lt;/span&gt;&lt;span class='line'&gt;Size                           211
&lt;/span&gt;&lt;span class='line'&gt;Updated                        5/4/2013 11:11:03 AM
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\push.ps1
&lt;/span&gt;&lt;span class='line'&gt;Size                           62
&lt;/span&gt;&lt;span class='line'&gt;Updated                        5/4/2013 12:16:29 PM
&lt;/span&gt;&lt;span class='line'&gt;Path                           C:\source\Highway\MVC\setv.ps1
&lt;/span&gt;&lt;span class='line'&gt;Size                           332
&lt;/span&gt;&lt;span class='line'&gt;Updated                        5/4/2013 11:26:16 AM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ok, three entries, each with three properties, and we&amp;#8217;re good &amp;#8230; Right?  &lt;strong&gt;sigh&lt;/strong&gt; No.  So you&amp;#8217;ll see from the output, these are not properties.  They are entries in a Hashtable, and are outputted vertically under &lt;strong&gt;Name&lt;/strong&gt; and &lt;strong&gt;Value&lt;/strong&gt; because of this.  We can easily turn this into a real object with properties though, using a cast to &lt;code&gt;PSCustomObject&lt;/code&gt; which is the PowerShell &lt;code&gt;dynamic&lt;/code&gt; object.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir *.ps1 | %{ [PSCustomObject]@{ Path=$_.FullName; Size=$_.Length; Updated=$_.LastWriteTime} }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Path                                                                       Size Updated
&lt;/span&gt;&lt;span class='line'&gt;----                                                                       ---- -------
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\make.ps1                                              211 5/4/2013 11:11:03 AM
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\push.ps1                                               62 5/4/2013 12:16:29 PM
&lt;/span&gt;&lt;span class='line'&gt;C:\source\Highway\MVC\setv.ps1                                              332 5/4/2013 11:26:16 AM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Alright, now we have the horizontal labels for our properties, and values below that.  Awesome.  Now lets pipe that to Get-Item:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir *.ps1 | %{ [PSCustomObject]@{ Path=$_.FullName; Size=$_.Length; Updated=$_.LastWriteTime} } | Get-Item
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\source\Highway\MVC
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:11 AM        211 make.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:16 PM         62 push.ps1
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:26 AM        332 setv.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Bingo, we bound Path to Get-Item.  That gives you an example now of both types of Pipeline&amp;#8217;ing.&lt;/p&gt;

&lt;h2&gt;Functions&lt;/h2&gt;

&lt;p&gt;Now that we understand pipelines, how do we start to create reusable functionality?  Well, to do that we need to write functions.  And so, lets look at this in practice with everyone&amp;#8217;s favorite demo &amp;#8230; Hello World!&lt;/p&gt;

&lt;h3&gt;Basic Script Blocks&lt;/h3&gt;

&lt;p&gt;We can create a script block simply by using a set of curly braces &lt;code&gt;{ }&lt;/code&gt;.  Like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; { "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt; "Hello World!"   &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That output is kind of odd, right?  It didn&amp;#8217;t output the string, because that would not have the quotes.  What type of object did that return?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; { "Hello World!" }.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     ScriptBlock                              System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Oh, so it&amp;#8217;s a script block!  Ok, is that the string representation of the block then?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; { "Hello World!" }.ToString()
&lt;/span&gt;&lt;span class='line'&gt; "Hello World!"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ah!  Yep, that&amp;#8217;s what happened.  So how do I run a script block?  Just stick a &lt;code&gt;.&lt;/code&gt; or &lt;code&gt;&amp;amp;&lt;/code&gt; in front of it.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; .{ "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;Hello World!
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; &amp;{ "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Yep, both of those do indeed execute, we lose the quotes, and all is well.  So we now have a code block.&lt;/p&gt;

&lt;h3&gt;Named Functions&lt;/h3&gt;

&lt;p&gt;But what if I want to name that script block?  Easy, we define a function:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Done, we&amp;#8217;ve defined that block now as HW.  How do I run it?  I type &lt;code&gt;HW&lt;/code&gt; of course!&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; HW
&lt;/span&gt;&lt;span class='line'&gt;Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now I can assign a script block simply to a variable if I want, but if I do so, then I still need to use &lt;code&gt;&amp;amp;&lt;/code&gt; or &lt;code&gt;.&lt;/code&gt; to execute it, where-as functions are called by name. See:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $hw = { "Hello World!" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $hw
&lt;/span&gt;&lt;span class='line'&gt; "Hello World!"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; &amp;$hw
&lt;/span&gt;&lt;span class='line'&gt;Hello World!
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; .$hw
&lt;/span&gt;&lt;span class='line'&gt;Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;But functions also have an important other aspect, which is that they can have parameters.  So let&amp;#8217;s create a function which takes a parameter, but lets say we want to pass it a location:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW {
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; param($location)
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; "Hello $location!"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; HW Dallas
&lt;/span&gt;&lt;span class='line'&gt;Hello Dallas!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, we can specify types for parameters, so that we can&amp;#8217;t pass bad data:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW {
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  param([int]$location)
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; "Hello $location!"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; HW Dallas
&lt;/span&gt;&lt;span class='line'&gt;HW : Cannot process argument transformation on parameter 'location'. Cannot convert value "Dallas" to type
&lt;/span&gt;&lt;span class='line'&gt;"System.Int32". Error: "Input string was not in a correct format."
&lt;/span&gt;&lt;span class='line'&gt;At line:1 char:4
&lt;/span&gt;&lt;span class='line'&gt;+ HW Dallas
&lt;/span&gt;&lt;span class='line'&gt;+    ~~~~~~
&lt;/span&gt;&lt;span class='line'&gt;    + CategoryInfo          : InvalidData: (:) [HW], ParameterBindingArgumentTransformationException
&lt;/span&gt;&lt;span class='line'&gt;    + FullyQualifiedErrorId : ParameterArgumentTransformationError,HW
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; hw 123
&lt;/span&gt;&lt;span class='line'&gt;Hello 123!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;See that we got an error now when we passed the Dallas string, but when we passed 123, we succeeded.  Now we can change this pipe in an array, passing &lt;strong&gt;ByValue&lt;/strong&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Hello 0!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Huh&amp;#8230; that didn&amp;#8217;t do what we expected.  I guess we&amp;#8217;ll have to give a hint that we want that Parameter to be pipelined.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { param( [Parameter(ValueFromPipeline=$true)][int]$location )
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt; "Hello $location" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Hello 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ok, but still not &amp;#8220;correct&amp;#8221;.  Why?  Because as it happens, we&amp;#8217;re using the simple form of a script blocks.  A script block is &lt;strong&gt;actually&lt;/strong&gt; defined by three sections: Begin, Process, and End.  By default, if we don&amp;#8217;t specify a section, we get &lt;strong&gt;End&lt;/strong&gt;.  What are the differences?  Begin runs once, before pipleline values are bound.  Process is run once for each member of the pipeline.  End runs after all members have been process.  How do we know that we get &lt;strong&gt;End&lt;/strong&gt; by default?  Look at the value we got, it was the last value of the pipeline.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { param( [Parameter(ValueFromPipeline=$true)][int]$location )
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  BEGIN { "Beginning : $location" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  PROCESS {"Processing : $location"}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  END {"Ending: $location"}}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Beginning : 0
&lt;/span&gt;&lt;span class='line'&gt;Processing : 1
&lt;/span&gt;&lt;span class='line'&gt;Processing : 2
&lt;/span&gt;&lt;span class='line'&gt;Processing : 3
&lt;/span&gt;&lt;span class='line'&gt;Processing : 4
&lt;/span&gt;&lt;span class='line'&gt;Processing : 5
&lt;/span&gt;&lt;span class='line'&gt;Ending: 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So here we have redefined our function, and given it a &lt;strong&gt;Begin&lt;/strong&gt;, &lt;strong&gt;Process&lt;/strong&gt; and &lt;strong&gt;End&lt;/strong&gt; block.  And we can see that $location, &lt;strong&gt;because it is marked from pipeline&lt;/strong&gt;, is not set until we are in Process, and then we run process 5 times, and finally we run ending once.&lt;/p&gt;

&lt;h3&gt;Branching&lt;/h3&gt;

&lt;p&gt;So&amp;#8230; it is not programming without if blocks, right?  Well we&amp;#8217;ve got those:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function HW { param( [Parameter(ValueFromPipeline=$true)][int]$location )
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  BEGIN { "Beginning : $location" }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  PROCESS { if(($location % 2) -eq 0) { "Processing : $location" } else { "Else" } }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;  END {"Ending: $location"}}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; 1..5 | HW
&lt;/span&gt;&lt;span class='line'&gt;Beginning : 0
&lt;/span&gt;&lt;span class='line'&gt;Else
&lt;/span&gt;&lt;span class='line'&gt;Processing : 2
&lt;/span&gt;&lt;span class='line'&gt;Else
&lt;/span&gt;&lt;span class='line'&gt;Processing : 4
&lt;/span&gt;&lt;span class='line'&gt;Else
&lt;/span&gt;&lt;span class='line'&gt;Ending: 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Looping&lt;/h3&gt;

&lt;p&gt;First &amp;#8230; don&amp;#8217;t loop, pipeline.  But when you must loop, do so these ways:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function DoWhile { $i = 1; do { Write-Host $i; $i++ } while ($i -le 5) }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; DoWhile
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function WhileLoop { $i = 1; while ($i -le 5) { Write-Host $i;$i++} }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; WhileLoop
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function ForLoop { for ($i=1;$i -le 5;$i++) {Write-Host $i} }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; ForLoop
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; function ForEachLoop { $ints=@(1..5); foreach ($i in $ints) {Write-Host $i} }
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; ForEachLoop
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Those cover all of the major types of looping, and do so in a clean way, very similar to the C# syntax in all cases.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=s479n3d-Qoc:kxBspTw1x80:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=s479n3d-Qoc:kxBspTw1x80:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=s479n3d-Qoc:kxBspTw1x80:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/s479n3d-Qoc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/powershell-for-developers-functions/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[PowerShell for Developers - Cmdlets]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/MBLuRdR9iPw/" />
    <updated>2013-05-08T22:38:00-05:00</updated>
    <id>http://TimRayburn.net/blog/powershell-for-developers-cmdlets</id>
    <content type="html">&lt;h2&gt;Cmdlets (Command-lets)&lt;/h2&gt;

&lt;p&gt;In PowerShell we have a concept called Cmdlets, these are the functions we use.  We&amp;#8217;ve already seem some of them, but this chapter will introduce you to the must-know Cmdlets.  This is not a catalog of all Cmdlets, not even close.  As of PowerShell 3.0 there are 2,430 in Windows Server 2012, without adding those available from the community.&lt;/p&gt;

&lt;p&gt;Microsoft&amp;#8217;s commitment is unfailing, they&amp;#8217;ve committed to shipping PowerShell Cmdlets for every server product.  If you use SQL Server, Exchange, BizTalk, SharePoint or any of the other server products then you simply cannot do anything more powerful to pump up your career than to learn PowerShell.&lt;/p&gt;

&lt;h3&gt;Proper Grammar&lt;/h3&gt;

&lt;p&gt;Cmdlets have a grammar all of their own.  In PowerShell we are encouraged to use a grammar of &lt;strong&gt;Verb-Noun&lt;/strong&gt; when creating Cmdlets and functions.  But more than that, there is a list of common verbs, which help new users discover your functions.  For instance, I created a function to update the value of an &lt;code&gt;AppSetting&lt;/code&gt; in a &lt;code&gt;web.config&lt;/code&gt; or &lt;code&gt;app.config&lt;/code&gt; file.  Now, I&amp;#8217;ve not memorized the whole list of verbs, so how did I know which one to use?  Well, I used the Cmdlet called &lt;code&gt;Get-Verb&lt;/code&gt; like so:&lt;/p&gt;

&lt;p&gt;Hmm&amp;#8230; I wonder if it should be called Create-AppSetting:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb C*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Clear                                                       Common
&lt;/span&gt;&lt;span class='line'&gt;Close                                                       Common
&lt;/span&gt;&lt;span class='line'&gt;Copy                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Checkpoint                                                  Data
&lt;/span&gt;&lt;span class='line'&gt;Compare                                                     Data
&lt;/span&gt;&lt;span class='line'&gt;Compress                                                    Data
&lt;/span&gt;&lt;span class='line'&gt;Convert                                                     Data
&lt;/span&gt;&lt;span class='line'&gt;ConvertFrom                                                 Data
&lt;/span&gt;&lt;span class='line'&gt;ConvertTo                                                   Data
&lt;/span&gt;&lt;span class='line'&gt;Complete                                                    Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Confirm                                                     Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Connect                                                     Communications&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Nope, no listing for Create.  How about Set-AppSetting:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb S*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Search                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Select                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Set                                                         Common
&lt;/span&gt;&lt;span class='line'&gt;Show                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Skip                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Split                                                       Common
&lt;/span&gt;&lt;span class='line'&gt;Step                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Switch                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Save                                                        Data
&lt;/span&gt;&lt;span class='line'&gt;Sync                                                        Data
&lt;/span&gt;&lt;span class='line'&gt;Start                                                       Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Stop                                                        Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Submit                                                      Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Suspend                                                     Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Send                                                        Communications&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Alright, yep, that could work.  But I&amp;#8217;m curious, how about Update-AppSetting?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb U*
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Undo                                                        Common
&lt;/span&gt;&lt;span class='line'&gt;Unlock                                                      Common
&lt;/span&gt;&lt;span class='line'&gt;Unpublish                                                   Data
&lt;/span&gt;&lt;span class='line'&gt;Update                                                      Data
&lt;/span&gt;&lt;span class='line'&gt;Uninstall                                                   Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Unregister                                                  Lifecycle
&lt;/span&gt;&lt;span class='line'&gt;Unblock                                                     Security
&lt;/span&gt;&lt;span class='line'&gt;Unprotect                                                   Security
&lt;/span&gt;&lt;span class='line'&gt;Use                                                         Other&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Bingo, Update-AppSetting is a good choice, so is Set-AppSetting.  I chose Set-AppSetting, but either would have been an excellent choice.&lt;/p&gt;

&lt;p&gt;Likewise, if you were to look-up Delete:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Delete
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Nope, not there.  How about Erase?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Delete
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Erase
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Nope again.  How about Remove?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Delete
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Erase
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; Get-Verb Remove
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Verb                                                        Group
&lt;/span&gt;&lt;span class='line'&gt;----                                                        -----
&lt;/span&gt;&lt;span class='line'&gt;Remove                                                      Common&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;There it is!  So remember, use Get-Verb when deciding how to name things, it will help everyone out in the long run.&lt;/p&gt;

&lt;h3&gt;For-Each&lt;/h3&gt;

&lt;p&gt;So what is the most important Cmdlet in PowerShell?  Well, for sheer utility, I&amp;#8217;ve got to give this award to ForEach-Object.  It allows you to iterate over any array or list of data.  So how do we use it?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 | ForEach-Object { Write-Host $_ ($_ * $_) }
&lt;/span&gt;&lt;span class='line'&gt;1 1
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;3 9
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;5 25
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Alright, we&amp;#8217;ve got one call to the script block (inside the &lt;code&gt;{ }&lt;/code&gt;) for every member of the array.  Now, you might be thinking, &amp;#8220;man that is really verbose for a scripting language&amp;#8221;, well good news that is the really long form version of that command.  Shall we terse it up a bit?&lt;/p&gt;

&lt;p&gt;First, ForEach-Object has an alias (more on those later) in simply &lt;code&gt;%&lt;/code&gt;.  So we can shorten it up like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 |%{ Write-Host $_ ($_ * $_) }
&lt;/span&gt;&lt;span class='line'&gt;1 1
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;3 9
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;5 25
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Pretty good, but we can get even better.  We&amp;#8217;re explicitly calling Write-Host, but whatever is returned at the end of a command is automatically printed to the host.  So we can shorten it further like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 |%{"$_ $($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;1 1
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;3 9
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;5 25
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Alright, I can hear you already, hold up Mr. Smarty Pants, you just did something tricky there.  Yep, I sure did.  How did that work?  Let me explain.  Any string in double-quotes (&lt;code&gt;" "&lt;/code&gt;) will have any variables (&lt;code&gt;$foo&lt;/code&gt;) inside of it replaced with the value of that variable.&lt;/p&gt;

&lt;p&gt;Moreover, any script block returns the last object it creates by default, so since that script block creates a string, it returns that string.  And ForEach-Object collects those objects and returns them as an Array, here to console, but it could also be piped to yet another Cmdlet or function.  But, the really attentive among you will be saying, &lt;strong&gt;&amp;#8220;Wait!  You slipped in another $.&amp;#8221;&lt;/strong&gt; Your right, but lets see it without that extra $.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6 |%{"$_ ($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;1 (1 * 1)
&lt;/span&gt;&lt;span class='line'&gt;2 (2 * 2)
&lt;/span&gt;&lt;span class='line'&gt;3 (3 * 3)
&lt;/span&gt;&lt;span class='line'&gt;4 (4 * 4)
&lt;/span&gt;&lt;span class='line'&gt;5 (5 * 5)
&lt;/span&gt;&lt;span class='line'&gt;6 (6 * 6)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ah, you see, this version doesn&amp;#8217;t actually perform the multiplication.  It replaces the $_ with each value, but the rest is just considered a string.  But PowerShell has a way to evaluate expressions in the middle of strings as well, using &lt;code&gt;$( expression )&lt;/code&gt;.  So the extra $ in this &lt;code&gt;1,2,3,4,5,6 |%{"$_ $($_ * $_)"}&lt;/code&gt; version evaluates the multiplication and gives us our &amp;#8220;most terse form&amp;#8221; of this command.&lt;/p&gt;

&lt;h3&gt;Where-Object&lt;/h3&gt;

&lt;p&gt;So we&amp;#8217;ve now seen how to iterate over an array, but the other thing we usually need to do is to filter them.  In .NET, we are used to using LINQ for this, but LINQ is pretty verbose itself.  How about we cut down our list of numbers to just the even numbers using &lt;code&gt;Where-Object&lt;/code&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6| Where-Object { ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Outstanding, but verbose.  Well just like with &lt;code&gt;For-Each&lt;/code&gt; above, there is a much shorter alias for &lt;code&gt;Where-Object&lt;/code&gt; which is &lt;code&gt;?&lt;/code&gt;.  That shortens us up to:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"}
&lt;/span&gt;&lt;span class='line'&gt;2 4
&lt;/span&gt;&lt;span class='line'&gt;4 16
&lt;/span&gt;&lt;span class='line'&gt;6 36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;A little diversion&amp;#8230;&lt;/h4&gt;

&lt;p&gt;Now, we&amp;#8217;ve seen how to limit the array, but here&amp;#8217;s a little diversion.  At the current time we&amp;#8217;re returning an array of strings.  Actually, since all arrays in PowerShell are arrays of Objects (in C# &lt;code&gt;Object[]&lt;/code&gt;), this would be an array of objects consisting entirely of string objects.  Prove it?  Sure.  First the type of the array itself:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; (1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"}).GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And now the individual members:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{"$_ $($_ * $_)"} | %{ $_.GetType() }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;But what if I wanted to have access to each of those numbers (the number itself, and the square) at the end of the command.  One way to do this would be to create a &lt;code&gt;Hashtable&lt;/code&gt; instead of a &lt;code&gt;String&lt;/code&gt; like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{@{Num=$_;Square=$_ * $_}}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;Num                            2
&lt;/span&gt;&lt;span class='line'&gt;Square                         4
&lt;/span&gt;&lt;span class='line'&gt;Num                            4
&lt;/span&gt;&lt;span class='line'&gt;Square                         16
&lt;/span&gt;&lt;span class='line'&gt;Num                            6
&lt;/span&gt;&lt;span class='line'&gt;Square                         36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s check the types:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{@{Num=$_;Square=$_ * $_}} | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Hashtable                                System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     Hashtable                                System.Object
&lt;/span&gt;&lt;span class='line'&gt;True     True     Hashtable                                System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Yep, Hashtables.&lt;/p&gt;

&lt;p&gt;But sometimes have to name variable when you don&amp;#8217;t intend to use those names is a bit annoying a verbose.  So instead, we can create an array by simply using the &lt;code&gt;,@( )&lt;/code&gt; array constructor syntax:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a = 1,2,3,4,5,6|?{ ($_ % 2) -eq 0 } |%{,@($_,($_ * $_))}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;16
&lt;/span&gt;&lt;span class='line'&gt;6
&lt;/span&gt;&lt;span class='line'&gt;36&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Uhm, output looks a little wierd.  Lets take a look at the type of &lt;code&gt;$a&lt;/code&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ok, an array. And it&amp;#8217;s members?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a | %{ $_.GetType() }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Alright, more arrays!  And inside the first one of those?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a[0] | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Boom, &lt;code&gt;Int32&lt;/code&gt;s for the win.  Instant multi-dimensional array.  This is powerful, it is a terse syntax which is similar to Tuples in other languages.  Because they are &lt;code&gt;Object[]&lt;/code&gt; arrays, the types don&amp;#8217;t have to match.  Oh yeah, did I mention there is a short form for creating arrays of concurrent integers?  Ohm, my bad. For instance:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $a = 1..6|?{ ($_ % 2) -eq 0 } |%{,@($_,($_ * $_),"Smile")}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a | %{ $_.GetType() }
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;True     True     Object[]                                 System.Array
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $a[0] | %{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType
&lt;/span&gt;&lt;span class='line'&gt;True     True     String                                   System.Object&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Get-ChildItem&lt;/h3&gt;

&lt;p&gt;The last Cmdlet I want to introduce in this chapter is the one most people use without even knowing that they&amp;#8217;re doing so.  If you&amp;#8217;ve every opened a PowerShell command prompt, you&amp;#8217;ve likely done something like:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\Source\Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   2:20 PM            Data
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            MVC
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:37 PM            Onramper
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:46 PM            Services
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:59 AM       1062 dest
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:11 PM        385 distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Or perhaps if you&amp;#8217;re from the &lt;code&gt;bash&lt;/code&gt; or other &lt;code&gt;sh&lt;/code&gt; descendant family of shell users:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\Source\Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   2:20 PM            Data
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            MVC
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:37 PM            Onramper
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:46 PM            Services
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:59 AM       1062 dest
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:11 PM        385 distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, in reality you&amp;#8217;re using a Cmdlet called Get-ChildItem.  Prove it?  Sure:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    Directory: C:\Source\Highway
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Mode                LastWriteTime     Length Name
&lt;/span&gt;&lt;span class='line'&gt;----                -------------     ------ ----
&lt;/span&gt;&lt;span class='line'&gt;d----          5/2/2013   2:20 PM            Data
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013  10:44 PM            MVC
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:37 PM            Onramper
&lt;/span&gt;&lt;span class='line'&gt;d----          5/4/2013   6:46 PM            Services
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  11:59 AM       1062 dest
&lt;/span&gt;&lt;span class='line'&gt;-a---          5/4/2013  12:11 PM        385 distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now this Cmdlet has so much power it almost deserves a chapter to itself.  Let&amp;#8217;s review just a few things that can&amp;#8217;t be skipped over.  First, this Cmdlet returns an array of &lt;code&gt;FileSystemInfo&lt;/code&gt; objects.  Of course that&amp;#8217;s easy to prove:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls |%{$_.GetType()}
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     DirectoryInfo                            System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo
&lt;/span&gt;&lt;span class='line'&gt;True     True     FileInfo                                 System.IO.FileSystemInfo&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That means we have access to all sorts of data about those directory items by pipeing that command along.  For instance, what if I wanted the full path and filename?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls |%{$_.FullName}
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\Data
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\MVC
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\Onramper
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\Services
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\dest
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And if I wanted to get just the files?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File |%{$_.FullName}
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\dest
&lt;/span&gt;&lt;span class='line'&gt;C:\Source\Highway\distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And if I wanted their sizes instead?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File |%{$_.Length}
&lt;/span&gt;&lt;span class='line'&gt;1062
&lt;/span&gt;&lt;span class='line'&gt;385&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h4&gt;Another bonus section? Oh, ok&amp;#8230;&lt;/h4&gt;

&lt;p&gt;We can restrict the types of files to a pattern like so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File *.ps1 |%{$_.Length}
&lt;/span&gt;&lt;span class='line'&gt;385&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;What if I wanted that same thing, recursively, through every subdirectory of my current location?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File *.ps1 -Recurse|%{$_.Length}
&lt;/span&gt;&lt;span class='line'&gt;10275
&lt;/span&gt;&lt;span class='line'&gt;10424
&lt;/span&gt;&lt;span class='line'&gt;4001
&lt;/span&gt;&lt;span class='line'&gt;1332
&lt;/span&gt;&lt;span class='line'&gt;1546
&lt;/span&gt;&lt;span class='line'&gt;2987
&lt;/span&gt;&lt;span class='line'&gt;332
&lt;/span&gt;&lt;span class='line'&gt;188
&lt;/span&gt;&lt;span class='line'&gt;2997
&lt;/span&gt;&lt;span class='line'&gt;344
&lt;/span&gt;&lt;span class='line'&gt;194
&lt;/span&gt;&lt;span class='line'&gt;211
&lt;/span&gt;&lt;span class='line'&gt;62
&lt;/span&gt;&lt;span class='line'&gt;332
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;247
&lt;/span&gt;&lt;span class='line'&gt;243
&lt;/span&gt;&lt;span class='line'&gt;368
&lt;/span&gt;&lt;span class='line'&gt;247
&lt;/span&gt;&lt;span class='line'&gt;243
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;0
&lt;/span&gt;&lt;span class='line'&gt;880
&lt;/span&gt;&lt;span class='line'&gt;265
&lt;/span&gt;&lt;span class='line'&gt;265
&lt;/span&gt;&lt;span class='line'&gt;217
&lt;/span&gt;&lt;span class='line'&gt;62
&lt;/span&gt;&lt;span class='line'&gt;332
&lt;/span&gt;&lt;span class='line'&gt;385&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And &amp;#8230; if I wanted all those summed up?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; ls -File *.ps1 -Recurse|%{$_.Length}|Measure-Object -Sum
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Count    : 34
&lt;/span&gt;&lt;span class='line'&gt;Average  :
&lt;/span&gt;&lt;span class='line'&gt;Sum      : 38979
&lt;/span&gt;&lt;span class='line'&gt;Maximum  :
&lt;/span&gt;&lt;span class='line'&gt;Minimum  :
&lt;/span&gt;&lt;span class='line'&gt;Property :&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Aliases&lt;/h3&gt;

&lt;blockquote&gt;&lt;p&gt;There are a finite number of keystrokes left in your hands before you die. &amp;#8211; &lt;a href="http://www.hanselman.com/blog/DoTheyDeserveTheGiftOfYourKeystrokes.aspx"&gt;Scott Hanselman&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;So, you&amp;#8217;ve likely picked up by now that I&amp;#8217;m a fan of terse commands.  Terse commands allow you to move faster, which to me is a huge part of why I&amp;#8217;m investing in PowerShell.  There is an ability in PowerShell to create shorter versions of Cmdlets, as you&amp;#8217;ve seen already in this article, called Aliases.  There are alot of aliases already defined.  How many?  So many I can&amp;#8217;t just do a screen shot of them, but I can count them:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; alias | Measure-Object
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Count    : 150
&lt;/span&gt;&lt;span class='line'&gt;Average  :
&lt;/span&gt;&lt;span class='line'&gt;Sum      :
&lt;/span&gt;&lt;span class='line'&gt;Maximum  :
&lt;/span&gt;&lt;span class='line'&gt;Minimum  :
&lt;/span&gt;&lt;span class='line'&gt;Property :&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;150 aliases already defined for you.  If you want to see what command is behind something like &lt;code&gt;dir&lt;/code&gt; you can simply:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; alias dir
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           dir -&amp;gt; Get-ChildItem&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, &lt;code&gt;dir&lt;/code&gt; is &lt;code&gt;Get-ChildItem&lt;/code&gt;.  What if I wanted to see all aliases for a given Cmdlet?&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; alias -Definition Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;CommandType     Name                                               ModuleName
&lt;/span&gt;&lt;span class='line'&gt;-----------     ----                                               ----------
&lt;/span&gt;&lt;span class='line'&gt;Alias           dir -&amp;gt; Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;Alias           gci -&amp;gt; Get-ChildItem
&lt;/span&gt;&lt;span class='line'&gt;Alias           ls -&amp;gt; Get-ChildItem&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, aliases are something you can expand on!  You can make it super easy to open text files by aliases &lt;code&gt;notepad.exe&lt;/code&gt; as so:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; New-Alias n C:\Windows\system32\notepad.exe
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; n .\distribute.ps1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That opens Notepad, with the &lt;code&gt;distribute.ps1&lt;/code&gt; file already opened for editing.  I keep aliases around for a lot of things.  For my text editor, my text comparison tool, and so much more.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=MBLuRdR9iPw:49RU0ZKasng:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=MBLuRdR9iPw:49RU0ZKasng:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=MBLuRdR9iPw:49RU0ZKasng:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/MBLuRdR9iPw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/powershell-for-developers-cmdlets/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[PowerShell for Developers - Intro]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/iYC2CYszPFc/" />
    <updated>2013-05-07T13:00:00-05:00</updated>
    <id>http://TimRayburn.net/blog/powershell-for-developers-intro</id>
    <content type="html">&lt;blockquote&gt;&lt;p&gt; I must go down to the seas again, to the lonely sea and the sky,
 And all I ask is a tall ship and a star to steer her by,
 And the wheel&amp;#8217;s kick and the wind&amp;#8217;s song and the white sail&amp;#8217;s shaking,
 And a gray mist on the sea&amp;#8217;s face, and a gray dawn breaking.
 &amp;#8211; Sea Fever by John Masefield&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Every developer knows that in order to be successful at their chosen profession, they need to keep the best tools at their disposal.  We all have our favorite text editors, and our favorite comparison tools, and the wise among us also have our favorite scripting languages and command line environments.&lt;/p&gt;

&lt;p&gt;I am an unabashed fan of GIT, and as such for several years now I&amp;#8217;ve used the &lt;code&gt;bash&lt;/code&gt; shell as my command line environment of choice.  But I recently started paying more attention to &lt;code&gt;PowerShell&lt;/code&gt; and I realized that I had not at all given it it&amp;#8217;s due when I first learned about it several years ago.  I&amp;#8217;ve spoken recently with @DevlinLiles, @AmirRajan, @CoriDrew, and @BForrest about this, and I realized that I wasn&amp;#8217;t alone at all in this.  Most developers working in .NET languages have mostly ignored PowerShell.  I intend this series of blog posts to correct this issue.&lt;/p&gt;

&lt;h2&gt;The Basics&lt;/h2&gt;

&lt;blockquote&gt;&lt;p&gt; Let&amp;#8217;s start at the very beginning
 A very good place to start
 When you read you begin with A-B-C
 When you sing you begin with do-re-mi
 &amp;#8211; &amp;#8220;Do-Re-Mi&amp;#8221; by Rodgers &amp;amp; Hammerstein&lt;/p&gt;&lt;/blockquote&gt;

&lt;h3&gt;PowerShell 3.0&lt;/h3&gt;

&lt;p&gt;So how do I use the &lt;code&gt;PowerShell&lt;/code&gt; thing, Tim?  Easy.  First, we need to know what version of Windows you&amp;#8217;re using now, because we might want to upgrade you to the latest version.  If you&amp;#8217;re using &lt;strong&gt;Windows 8&lt;/strong&gt; or &lt;strong&gt;Windows Server 2012&lt;/strong&gt; then you&amp;#8217;re good, you already have PowerShell 3.0.  If you&amp;#8217;re using &lt;strong&gt;Windows 7&lt;/strong&gt; or &lt;strong&gt;Windows Server 2008&lt;/strong&gt; or &lt;strong&gt;Windows Server 2008 R2&lt;/strong&gt;, then you need to download the &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=34595"&gt;Windows Management Pack 3.0&lt;/a&gt; which upgrades you to PowerShell 3.0.&lt;/p&gt;

&lt;p&gt;Not sure if someone else might have already installed it?  Just open PowerShell (hint: Win+R -&gt; &lt;code&gt;PowerShell&lt;/code&gt; &lt;strong&gt;enter&lt;/strong&gt;) and enter &lt;code&gt;$host.version&lt;/code&gt; at the prompt.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $host.version
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Major  Minor  Build  Revision
&lt;/span&gt;&lt;span class='line'&gt;-----  -----  -----  --------
&lt;/span&gt;&lt;span class='line'&gt;3      0      -1     -1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The above it what we&amp;#8217;re looking for, anything else, and you need to install the &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=34595"&gt;Windows Management Pack 3.0&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Variables&lt;/h3&gt;

&lt;p&gt;The first thing you need to know about PowerShell is how to create a variable.  This is very simple, you just assign it to a variable name.  In PowerShell, all variables are preceded by a &lt;code&gt;$&lt;/code&gt;.  So if you want to create a variable X and assign the integer value 1 to it, you would type:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $X = 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Important to know, especially for C# developers, is that PowerShell is &lt;strong&gt;case-insensitive&lt;/strong&gt;.  As such, &lt;code&gt;$X&lt;/code&gt; is the same as &lt;code&gt;$x&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;Value Types&lt;/h4&gt;

&lt;p&gt;Now, .NET developers, pay attention to this.  In PowerShell all variables are actual objects, not just string values.  What do I mean?  Type this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $X.GetType()
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;IsPublic IsSerial Name                                     BaseType
&lt;/span&gt;&lt;span class='line'&gt;-------- -------- ----                                     --------
&lt;/span&gt;&lt;span class='line'&gt;True     True     Int32                                    System.ValueType&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;strong&gt;Holy smoke!&lt;/strong&gt; That variable is an &lt;code&gt;Int32&lt;/code&gt;, I mean a real &lt;code&gt;System.Int32&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because of this, we can use any type of methods that might exist on those objects.  For instance, we could type:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $X.Equals(4)
&lt;/span&gt;&lt;span class='line'&gt;False&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;So how do we create non-value types then?  That depends&amp;#8230;&lt;/p&gt;

&lt;h4&gt;Reference Types via New-Object&lt;/h4&gt;

&lt;p&gt;Most of the time, we are used to creating .NET objects by typing something like &lt;code&gt;var dt = new System.DateTime()&lt;/code&gt; but in PowerShell we have something similar, but different:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $dt = New-Object System.DateTime&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You can always check the value of a variable, just by typing it&amp;#8217;s name at the prompt like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $dt
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Monday, January 1, 0001 12:00:00 AM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That makes total sense, that is the default value of a DateTime aka &lt;code&gt;default(DateTime)&lt;/code&gt; in C#.  But in reality, I tend to use &lt;code&gt;System.DateTime.Now&lt;/code&gt; to get the system time, more often than I do &lt;code&gt;new DateTime()&lt;/code&gt;, so how to I do that in PowerShell?&lt;/p&gt;

&lt;h4&gt;Reference Types via Static Properties &amp;amp; Methods&lt;/h4&gt;

&lt;p&gt;So if we want to access the .NET Framework&amp;#8217;s static types, we simply need to reference the type, and then the method, as follows:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; [System.DateTime]::Now
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Monday, May 6, 2013 10:22:26 PM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, if we wanted to assign that to our variable, we would just do:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $dt = [System.DateTime]::Now&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Please note, when we assign the value to a variable, we no longer get output to the console.  We&amp;#8217;ll see how to change that in just a bit.&lt;/p&gt;

&lt;h3&gt;Arrays&lt;/h3&gt;

&lt;p&gt;Arrays are common in all programming languages, they represent a series of values.  In PowerShell, those values are not required to be of the same type, you can think of all Arrays in .NET terms as &lt;code&gt;System.Object[]&lt;/code&gt;, an array of Objects.&lt;/p&gt;

&lt;p&gt;Declaring and using arrays could not possibly be easier in PowerShell, we simply put together a series of values, separated by commas.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,2,3
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As I noted above, they don&amp;#8217;t have to be of the same type:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; 1,"abc",[System.DateTime]::Now
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;abc
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Monday, May 6, 2013 10:28:15 PM&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And that is all there is to arrays.  You can add members to arrays many ways, but the simplest is as follows:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $arr = 1,2,3
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $arr
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $arr = $arr + 4,5,6
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $arr
&lt;/span&gt;&lt;span class='line'&gt;1
&lt;/span&gt;&lt;span class='line'&gt;2
&lt;/span&gt;&lt;span class='line'&gt;3
&lt;/span&gt;&lt;span class='line'&gt;4
&lt;/span&gt;&lt;span class='line'&gt;5
&lt;/span&gt;&lt;span class='line'&gt;6&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Hashtable&lt;/h3&gt;

&lt;p&gt;There is one other type of object which is critical to the world of PowerShell, and that is the Hashtable.  PowerShell is a dynamic language, in fact as of 3.0 it&amp;#8217;s even built on top of the Dynamic Language Runtime, but as such it needs a flexible structure for storing loosely types objects.  Enter the Hashtable.&lt;/p&gt;

&lt;p&gt;The syntax for Hashtable couldn&amp;#8217;t possibly be easier, to create one you just use &lt;code&gt;@{ key=value; key2=value2}&lt;/code&gt; So for instance, if you want to create a Hashtable to store a bunch of people, you could do so like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $tim = @{ FirstName="Tim";LastName="Rayburn"}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $cori = @{ FirstName="Cori";LastName="Drew"}
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $barry = @{ FirstName="Barry";LastName="Forrest"}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, as we learned in the last section, we can create an array just by separating items by commas, so lets do so, and then sort these people by FirstName:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $tim,$cori,$barry | Sort-Object FirstName
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Name                           Value
&lt;/span&gt;&lt;span class='line'&gt;----                           -----
&lt;/span&gt;&lt;span class='line'&gt;LastName                       Forrest
&lt;/span&gt;&lt;span class='line'&gt;FirstName                      Barry
&lt;/span&gt;&lt;span class='line'&gt;LastName                       Drew
&lt;/span&gt;&lt;span class='line'&gt;FirstName                      Cori
&lt;/span&gt;&lt;span class='line'&gt;LastName                       Rayburn
&lt;/span&gt;&lt;span class='line'&gt;FirstName                      Tim&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, Barry is now listed first, then Cori, then Tim.  Don&amp;#8217;t worry about understanding Sort-Object just yet, we&amp;#8217;ll get into how that line works more in the next post.&lt;/p&gt;

&lt;p&gt;Now, lets imagine I want to add a value for Employer to each of these.  How to I change a Hashtable once it has been created?  Easy, just refer to a property that doesn&amp;#8217;t exist yet, and set its value.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;&amp;gt; $tim.Employer = "Improving Enterprises"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $barry.Employer = "Improving Enterprises"
&lt;/span&gt;&lt;span class='line'&gt;&amp;gt; $cori.Employer = "Improving Enterprises (Contractor until August)"&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;h3&gt;Constants&lt;/h3&gt;

&lt;p&gt;In addition to all of the above, there are a couple of constants which you might want to know about when developing.  &lt;code&gt;$null&lt;/code&gt; is the constant value of a Null Reference.  In addition there are constants for &lt;code&gt;$true&lt;/code&gt; and &lt;code&gt;$false&lt;/code&gt; though if a boolean is expected you can also always use &lt;code&gt;1&lt;/code&gt; or &lt;code&gt;0&lt;/code&gt; respectively.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=iYC2CYszPFc:TfoSRx79710:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=iYC2CYszPFc:TfoSRx79710:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=iYC2CYszPFc:TfoSRx79710:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/iYC2CYszPFc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/powershell-for-developers-intro/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Working with Dynamic Schema in Azure Mobile Services]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/BXS6s_7ecJc/" />
    <updated>2012-12-12T11:45:00-06:00</updated>
    <id>http://TimRayburn.net/blog/working-with-dynamic-schema-in-azure-mobile-services</id>
    <content type="html">&lt;p&gt;Lately I&amp;#8217;ve been developing on a side project using the awesome &lt;a href="http://chriskoenig.net/2012/10/17/new-azure-sdk-and-services-updates/"&gt;Azure Mobile Services&lt;/a&gt; offering from Microsoft.  Specifically I&amp;#8217;ve been developing a Windows Phone 8 application, the details of which will be revealed in time.  One of the best features of Azure Mobile Services is the ability to work with a Dynamic Schema, it will automatically insert new columns for fields it has never received before.&lt;/p&gt;

&lt;p&gt;There are many great reasons for this during development.  It allows for rapid iteration, which is great.  But, let&amp;#8217;s take the example of the &lt;a href="https://github.com/WindowsAzure-TrainingKit/HOL-Windows8AndMobileServices/blob/master/HOL.md"&gt;Todo Hands On Lab&lt;/a&gt;, and look at the DataContract established for it&amp;#8217;s entity.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;text&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;complete&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, lets say I wanted to add a property called Description to this, I might update the above code as follows:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;text&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;complete&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;description&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;If I change nothing else other than this, I when I run my program I&amp;#8217;d expect that the Description column would be added to the database when I saved a new item.  But, instead, I get the following exception when I save an item:&lt;/p&gt;

&lt;pre&gt;
Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Error: Unable to insert a null value for new property 'description'
  Source=Microsoft.Azure.Zumo.WindowsPhone8.Managed
  InnerException: 
&lt;/pre&gt;


&lt;p&gt;I was more than a little baffled by this concept, my first read of this exception got me thinking things like: &amp;#8221;&lt;em&gt;who on earth would design a dynamic data feature to create NON NULLABLE FIELDS?!?!?&lt;/em&gt;&amp;#8221; and other less kind statements.  Well, as they say, pride commeth before the fall.  As I&amp;#8217;ve researched this error, I&amp;#8217;ve realized it&amp;#8217;s entirely reasonable.  Why?  Ah&amp;#8230; REST.&lt;/p&gt;

&lt;p&gt;Azure Mobile Services data offering is built as a set of RESTful services, using JSON serialization.  That means that initially my request to add an entry named &amp;#8220;Foo&amp;#8221; would have looked like this:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;When I added the additional field but didn&amp;#8217;t set a value for it, the serializer added it to the submitted output, resulting in:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Sure, that makes sense &amp;#8230; Unless your the SQL Server who is now being asked to add that new field.  Why?  Because you&amp;#8217;ve got NO IDEA what the data type of description is.  Whoops!  So how do we solve this?  Well, there are a couple of ways we can do that.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We could add the field manually in SQL Server, specifying the data type desired.  This works great, but kindof unravels the whole point of Dynamic Schema.&lt;/li&gt;
&lt;li&gt;We could put in temporary code, so that the first time we send this up, it&amp;#8217;s populated.  After that, the field is nullable so there is no problem storing nulls from that point onward.  I&amp;#8217;m not a big fan of &amp;#8220;secret recipes&amp;#8221; in code bases, and this model leaves no trace for the next guy of the &amp;#8220;proper procedure&amp;#8221; so I decided against it.&lt;/li&gt;
&lt;li&gt;We could add a Setup script, which pushed a single completely populated entity.  This could be run all sorts of ways, from a unit test to a rake task, but would ensure the schema desired.  This solution is better, but still a little buried for me.&lt;/li&gt;
&lt;li&gt;We could make the DBAs amongst us cry, and decide that our entities will provide a default value for reference types such as string (note value types don&amp;#8217;t have this problem, they can&amp;#8217;t be null) in the constructor of our type.  This technically takes more space, and I&amp;#8217;m certain the DBAs will yell at me about other reasons, but on the other hand it leaves a clear pattern to be followed by future developers.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I chose option 4.  That resulted in this code:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TodoItem&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;TodoItem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;text&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;complete&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="na"&gt;        [DataMember(Name = &amp;quot;description&amp;quot;)]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, you can feel free to make a different choice, but for me and my project, this pattern is working just fine.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=BXS6s_7ecJc:SPhluI3tAaA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=BXS6s_7ecJc:SPhluI3tAaA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=BXS6s_7ecJc:SPhluI3tAaA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/BXS6s_7ecJc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/working-with-dynamic-schema-in-azure-mobile-services/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Windows Phone 8 Development on a Mac]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/QgLnA_WFfTg/" />
    <updated>2012-12-11T07:02:00-06:00</updated>
    <id>http://TimRayburn.net/blog/windows-phone-8-development-on-a-mac</id>
    <content type="html">&lt;p&gt;So you want to do Windows Phone 8 development on a Mac, the traditional answer to this has been, your out of luck.  The hurdles are two fold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Windows Phone Emulator has always, since Windows Phone 7, been run as a HyperV virtual machine.  This means if your running Windows itself inside a VM, running the emulator is like trying to run a VM inside a VM.  This has traditionally been an unsupported scenario.&lt;/li&gt;
&lt;li&gt;The Windows Phone 8 Emulator raised the bar again, because it only runs on Windows 8.  That causes two problems for us.  The first is that Boot Camp hasn&amp;#8217;t been updated to support Windows 8 yet, so we can&amp;#8217;t (easily) get the necessary drivers for our Mac to run Windows 8.&lt;/li&gt;
&lt;li&gt;The second problem that Windows 8 requirement brings us is that HyperV in Windows 8 requires &lt;a href="http://www.ryanlowdermilk.com/2012/09/does-my-computer-support-slat/"&gt;&amp;#8220;Second Level Address Translation&amp;#8221;&lt;/a&gt; support from it&amp;#8217;s CPUs.  That means the CPU its running on has to support very new virtualization support in order to run.  That will make it even more difficult for a VM solution to work for us.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;But fear not my valiant friends, for there is an answer.  &lt;a href="http://www.vmware.com/products/fusion/overview.html"&gt;VMWare Fusion&lt;/a&gt; has heard your cries, and there is a way to solve this problem.  Here are the necessary steps, care of &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/wptools/thread/ed72010c-321c-4667-97b2-3ff1540e7f87"&gt;an awesome MSDN forums post&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using &lt;a href="http://www.vmware.com/products/fusion/overview.html"&gt;VMWare Fusion 5&lt;/a&gt; or better, create and install a Windows 8 virtual machine.  If you have one already, your fine.&lt;/li&gt;
&lt;li&gt;Stop the virtual machine by shutting down Windows 8.&lt;/li&gt;
&lt;li&gt;At the VMWare Virtual Machine list, right click Windows 8 machine then click &amp;#8220;Show in Finder&amp;#8221;.&lt;/li&gt;
&lt;li&gt;Right click the file then click &amp;#8220;Show package contents&amp;#8221;, then find and open with a text editor a file with the extension .vmx&lt;/li&gt;
&lt;li&gt;Go till the end of the file and add this two lines (first check whether they were previously added):
 &lt;pre&gt;
 hypervisor.cpuid.v0 = "FALSE"
 vhv.enable = "TRUE"
 &lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;At the VMWare Virtual Machine list, right click Windows 8, click &amp;#8220;Preferences&amp;#8221; then &amp;#8220;Advanced&amp;#8221;. Choose &amp;#8220;Intel VT-X with EPT&amp;#8221; as &amp;#8220;Preferred virtualization engine&amp;#8221;.&lt;/li&gt;
&lt;li&gt;Start your virtual machine, launch Visual Studio, and develop away.  The emulator will happily run.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Obviously this solution is a &amp;#8220;It works on my machine&amp;#8221; situation, but I&amp;#8217;m sure you will find success down this path.&lt;/p&gt;

&lt;h2&gt;Update 12/12/12&lt;/h2&gt;

&lt;p&gt;Several questions were asked, so quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does Parallels support this?  As of today, no.  &lt;a href="http://forum.parallels.com/showthread.php?t=264780"&gt;See this support forum post from them.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Does your processor have to support SLAT?  Yes, your physical hardware must be current enough to support SLAT.  For Macs, this means you need to be running an i5 or i7 mac.&lt;/li&gt;
&lt;li&gt;What hardware are you running?  As of today, I&amp;#8217;m running this solution on a Thunderbolt MacBook Pro running a 2.3 Ghz i7 and Lion, not Mountain Lion.  The official Model Identifier for my mac is MacBookPro8,3.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=QgLnA_WFfTg:uEUQtJw6rsA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=QgLnA_WFfTg:uEUQtJw6rsA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=QgLnA_WFfTg:uEUQtJw6rsA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/QgLnA_WFfTg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/windows-phone-8-development-on-a-mac/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Azure Bootcamp in Houston]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/H1FHUL1udb4/" />
    <updated>2012-10-05T09:47:00-05:00</updated>
    <id>http://TimRayburn.net/blog/azure-bootcamp-in-houston</id>
    <content type="html">&lt;p&gt;&lt;img src="http://TimRayburn.net/images/ie-logo-small.jpg" title="Improving Enterprises Logo" alt="Improving Enterprises Logo"&gt;&lt;/p&gt;

&lt;p&gt;How would you like a &lt;a href="http://www.improvingenterprises.com/events/event/windows-azure-developer-camp/"&gt;free full day of training&lt;/a&gt; from the best and brightest of &lt;a href="http://improvingenterprises.com"&gt;Improving Enterprises&lt;/a&gt;?  Well have I got a deal for you!&lt;/p&gt;

&lt;p&gt;On October the 22nd, at the Microsoft Offices in Houston, we will be hosting a Windows Azure Developer Camp.  We will be covering all of the basics of Windows Azure, from IaaS to Websites, from SQL Azure to Mobile Services.  And what&amp;#8217;s more?  We&amp;#8217;ve got some rockstar trainers for you.  &lt;a href="http://www.improvingenterprises.com/about/people/todd-girvin/bio/"&gt;Todd Girvin&lt;/a&gt;, &lt;a href="http://www.improvingenterprises.com/about/people/allen-hurst/bio/"&gt;Allen Hurst&lt;/a&gt;, &lt;a href="http://www.improvingenterprises.com/about/people/devlin-liles/bio/"&gt;Devlin Liles&lt;/a&gt;, &lt;a href="http://www.improvingenterprises.com/about/people/chris-weldon/bio/"&gt;Chris Weldon&lt;/a&gt;, &lt;a href="http://www.improvingenterprises.com/about/people/ben-floyd/bio/"&gt;Ben Floyd&lt;/a&gt; and &lt;a href="http://www.improvingenterprises.com/about/people/tim-rayburn/bio/"&gt;myself&lt;/a&gt; will guide you through all the hands on labs, and you&amp;#8217;ll leave ready to bring the incredible scale and ease of Windows Azure to your next project.&lt;/p&gt;

&lt;p&gt;While you&amp;#8217;re there, be sure to ask about our &lt;a href="http://www.improvingenterprises.com/2012/09/10/improving-and-alphaware-join-forces/"&gt;incredible new Houston offices&lt;/a&gt;.  Need consultants in Houston?  We&amp;#8217;re open for business and ready to help.  Looking for a new job?  Drop me a line, and we&amp;#8217;ll talk about the opportunities for you to start improving.&lt;/p&gt;

&lt;p&gt;Even if none of that is true, be sure to ask us that day about our upcoming Monday Night Football event.&lt;/p&gt;

&lt;h1&gt;&lt;a href="http://www.improvingenterprises.com/events/event/windows-azure-developer-camp/"&gt;Signup Now&lt;/a&gt;&lt;/h1&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=H1FHUL1udb4:gucpWuGT5D0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=H1FHUL1udb4:gucpWuGT5D0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=H1FHUL1udb4:gucpWuGT5D0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=H1FHUL1udb4:gucpWuGT5D0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=H1FHUL1udb4:gucpWuGT5D0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=H1FHUL1udb4:gucpWuGT5D0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=H1FHUL1udb4:gucpWuGT5D0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/H1FHUL1udb4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/azure-bootcamp-in-houston/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Six Time Microsoft MVP]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/uwq6Vc_OJzs/" />
    <updated>2012-07-01T14:11:00-05:00</updated>
    <id>http://TimRayburn.net/blog/six-time-microsoft-mvp</id>
    <content type="html">&lt;p&gt;I&amp;#8217;m thrilled to announce that Microsoft has deemed fit to award my efforts over the last year with a Microsoft MVP for Connected Systems Development, once again.  This marks my sixth year as an MVP, a community of such passionate leaders, contributors and influencers that it could boggle the mind.  Every MVP is different, but each brings a passion about their technology that is infectious.&lt;/p&gt;

&lt;p&gt;I look forward to once again getting the chance to visit the Microsoft campus during the MVP Summit, and to continue to help start conversations everywhere I go.  I&amp;#8217;m also thrilled to announce that &lt;a href="http://devlinliles.com"&gt;Devlin Liles&lt;/a&gt;, my co-author for &lt;a href="http://www.packtpub.com/entity-framework-4-1-experts-test-driven-development-architecture-cookbook/book"&gt;Entity Framework 4.1 : An Expert&amp;#8217;s Cookbook&lt;/a&gt;, was also re-awarded today as an MVP for Data Platform Development.  With that, I&amp;#8217;ll let you get back to your day, and I&amp;#8217;ll get back to celebrating my wife&amp;#8217;s birthday which is also July 1st and which she has shared the celebration of my award for the last six years.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=uwq6Vc_OJzs:47WZsn4ZIPA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=uwq6Vc_OJzs:47WZsn4ZIPA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=uwq6Vc_OJzs:47WZsn4ZIPA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=uwq6Vc_OJzs:47WZsn4ZIPA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=uwq6Vc_OJzs:47WZsn4ZIPA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=uwq6Vc_OJzs:47WZsn4ZIPA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=uwq6Vc_OJzs:47WZsn4ZIPA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/uwq6Vc_OJzs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/six-time-microsoft-mvp/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing the Highway Framework]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/oYZqQ7joio0/" />
    <updated>2012-06-29T07:18:00-05:00</updated>
    <id>http://TimRayburn.net/blog/introducing-the-highway-framework</id>
    <content type="html">&lt;p&gt;Today I&amp;#8217;m pleased to announce a combined effort of &lt;a href="http://TimRayburn.net/about/"&gt;myself&lt;/a&gt; and &lt;a href="http://devlinliles.com/"&gt;Devlin Liles&lt;/a&gt; which we are calling &lt;a href="http://HighwayFramework.com"&gt;The Highway Framework&lt;/a&gt;, &amp;#8220;The fastest and smoothest way to great architecture&amp;#8221;.  For this initial release we&amp;#8217;ve focused on data access architecture with Entity Framework, a topic we&amp;#8217;ve recently &lt;a href="http://www.packtpub.com/entity-framework-4-1-experts-test-driven-development-architecture-cookbook/book"&gt;written a book&lt;/a&gt; about, but you can expect further greatness from us on other topics in the future.  As you most likely know, Devlin and I are both consultants with &lt;a href="http://improvingenterprises.com"&gt;Improving Enterprises&lt;/a&gt; and this is framework definitely distills alot of learning from our various clients and from other Improving consultants.  We invite you to read on, check out &lt;a href="http://HighwayFramework.com"&gt;the source code on github&lt;/a&gt;, our &lt;a href="http://highwayframework.github.com/Highway.Data/docs/index.html"&gt;API Documentation&lt;/a&gt;, &lt;a href="http://highwayframework.github.com/Highway.Data"&gt;review the website&lt;/a&gt;, and tells us what you think.  All that said, let&amp;#8217;s tell you about Highway.Data.&lt;/p&gt;

&lt;h2&gt;Highway.Data&lt;/h2&gt;

&lt;p&gt;This project focuses on bringing our recommendations for data access, specifically the Repository and Specification patterns.  For this intial release we&amp;#8217;ve focused on delivering these for Entity Framework, but in the future you can look foward implementations for NHibernate and other data access structures.  If we&amp;#8217;re going to work with Entity Framework in a code first fashion, we will need some POCOs.  Our guidance with Highway.Data is not to use the Mapping attributes, which instantly make your POCOs aware of your database, but rather to use a mapping class.  We provide an interface you can implement to configure your Entity Framework mappings, it is called IMappingConfiguration.  So let&amp;#8217;s say we&amp;#8217;re working with the following POCO:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FirstName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;We can create a very simply mapping class to store that in the database in the People table:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyMappings&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IMappingConfiguration&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ConfigureModelBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DbModelBuilder&lt;/span&gt; &lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;modelBuilder&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;People&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now all that is left is to register with our container, and we&amp;#8217;re off and running.  For this demo, we&amp;#8217;ll show how to do that with Castle.Windsor:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;WindsorContainer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="c1"&gt;// Update, added in the most recent version of Highway.Data 1.2&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resolver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSubResolver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayResolver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Kernel&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMappingConfiguration&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplementedBy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyMappings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IRepository&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplementedBy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EntityFrameworkRepository&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplementedBy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EntityFrameworkContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DependsOn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Connection String Here&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IEventManager&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImplementedBy&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EventManager&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;We now have a completely wired up Highway.Data implementation, and can resolved IRepository into any of our classes which need to access data.  But that&amp;#8217;s only the first half of Highway.Data.&lt;/p&gt;

&lt;h2&gt;Specification Pattern&lt;/h2&gt;

&lt;p&gt;In addition to a repository pattern implementation, we also provide an implementation of Specification pattern in Highway.Data.  We use the pattern to ensure our queries are all testable, without access to a database, and also to be able to quickly enumerate, and if necessary generate SQL for, all the queries are project uses.  There are few things that will make a DBA smile more than to learn that a project using an ORM can quickly produce for him or her a list of all queries used by that application.  That said, let me show you how you create a simple query against the LastName property of our Person.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LastNameQuery&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;LastNameQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="n"&gt;ContextQuery&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsQueryable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LastName&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;As you can see, we create a class to represent our query, and provide the query implementation to the ContextQuery property.  Once we&amp;#8217;ve created this query, using it is as simple as:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;&lt;span class='line'&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DataConsumingClass&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IRepository&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DataConsumingClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IRepository&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;DoSomeWorkHere&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;LastNameQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Rayburn&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="c1"&gt;// Work with the people returned however you want.&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Obviously, this could be any class in your application, we depend on an IRepository, and hand the Find method our query, and our query it&amp;#8217;s parameter.  And that&amp;#8217;s it!&lt;/p&gt;

&lt;h2&gt;NuGet Packages&lt;/h2&gt;

&lt;p&gt;We provide three NuGet Packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nuget.org/packages/Highway.Data.EntityFramework"&gt;Highway.Data.EntityFramework&lt;/a&gt; is the package most people will use, and contains our full Entity Framework implementation.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nuget.org/packages/Highway.Data.EntityFramework.Castle"&gt;Highway.Data.EntityFramework.Castle&lt;/a&gt; contains a Windsor Installer already setup for everything Highway.Data needs other than your Repository, Context and Mappings.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nuget.org/packages/Highway.Data"&gt;Highway.Data&lt;/a&gt; is our core abstractions, without an ORM dependency.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oYZqQ7joio0:62sQH1suMp8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=oYZqQ7joio0:62sQH1suMp8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oYZqQ7joio0:62sQH1suMp8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oYZqQ7joio0:62sQH1suMp8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oYZqQ7joio0:62sQH1suMp8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oYZqQ7joio0:62sQH1suMp8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=oYZqQ7joio0:62sQH1suMp8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/oYZqQ7joio0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/introducing-the-highway-framework/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Write Less Code - Theme Detection on Windows Phone 7]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/yvAdmWXlya8/" />
    <updated>2012-06-16T21:33:00-05:00</updated>
    <id>http://TimRayburn.net/blog/write-less-code-theme-detection-on-windows-phone-7</id>
    <content type="html">&lt;p&gt;I spent alot of time tonight trying to find an elegant solution to the problem of detecting the light or dark theme from Windows Phone 7 and changing images based on those options.  I was people that were doing a ToString in the Foreground Brush, or writing custom methods for every image in their code-behind, and all of that felt  &amp;#8230; dirty.  Finally I &lt;a href="http://stackoverflow.com/questions/7198046/how-to-swap-images-based-on-the-current-theme-wp7"&gt;came across this solution on StackOverflow&lt;/a&gt; which is not the &amp;#8220;accepted&amp;#8221; answer, but is the highest voted answer.  It was good enough to get me to post the answer here as well, so I can remember it, and hopefully some of you who might be working to hard can find a more elegant solution.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='xml'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;Stretch=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Fill&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;Visibility=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{StaticResource PhoneLightThemeVisibility}&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/icons/light.tag.png&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;Stretch=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Fill&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;Visibility=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{StaticResource PhoneDarkThemeVisibility}&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/icons/dark.tag.png&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;



&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=yvAdmWXlya8:B9MOJvjs-gs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=yvAdmWXlya8:B9MOJvjs-gs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=yvAdmWXlya8:B9MOJvjs-gs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=yvAdmWXlya8:B9MOJvjs-gs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=yvAdmWXlya8:B9MOJvjs-gs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=yvAdmWXlya8:B9MOJvjs-gs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=yvAdmWXlya8:B9MOJvjs-gs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/yvAdmWXlya8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/write-less-code-theme-detection-on-windows-phone-7/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Pylon Solver for Windows Phone 7]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/1YVBE1DXqAM/" />
    <updated>2012-06-14T19:22:00-05:00</updated>
    <id>http://TimRayburn.net/blog/pylon-solver-for-windows-phone-7</id>
    <content type="html">&lt;p&gt;&lt;img class="left" src="http://TimRayburn.net/images/pylonsolver.png"&gt;
I&amp;#8217;ve recently started developing for Windows Phone 7 because my apprentices have been very interested in the mobile space.  My first application is a utility used by players in &lt;a href="http://swtor.com"&gt;Star Wars : The Old Republic&lt;/a&gt; called &lt;a href="http://windowsphone.com/s?appid=9b2a529d-8b02-4db7-a954-71677a50268b"&gt;Pylon Solver&lt;/a&gt;.  The application is a solver for the Ancient Pylons puzzle in Eternity Vault.  But unlike so many of the apps out there, this one addresses a common problem, it is color-blind friendly.  Most of the solvers out there use just the colors, not the shapes, from the game.  This app uses both to provide a quick easy interface to solving the puzzle.  I&amp;#8217;d appreciate any &lt;a href="http://swtor.com"&gt;SWTOR&lt;/a&gt; players out there downloading it, trying it out, and letting me know what they think, and leave a review.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=1YVBE1DXqAM:5pbYBxBry5A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=1YVBE1DXqAM:5pbYBxBry5A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=1YVBE1DXqAM:5pbYBxBry5A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=1YVBE1DXqAM:5pbYBxBry5A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=1YVBE1DXqAM:5pbYBxBry5A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=1YVBE1DXqAM:5pbYBxBry5A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=1YVBE1DXqAM:5pbYBxBry5A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/1YVBE1DXqAM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/pylon-solver-for-windows-phone-7/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Join ScottGu for Meet Windows Azure]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/tp5U9jsIbIw/" />
    <updated>2012-06-06T19:17:00-05:00</updated>
    <id>http://TimRayburn.net/blog/join-scottgu-for-meet-windows-azure</id>
    <content type="html">&lt;p&gt;Just a quick note here, tomorrow (June 7th) Scott Guthrie will be hosting a live stream event called &lt;a href="http://www.meetwindowsazure.com/"&gt;Meet Windows Azure&lt;/a&gt;.  The event will start at 1PM PDT (2PM MDT, 3PM CDT, 4PM EDT) and it will be covering some amazing new features in Windows Azure.  In particular I&amp;#8217;d like to draw your attention to this snippet, from their &lt;a href="http://blogs.msdn.com/b/windowsazure/archive/2012/06/06/announcing-new-windows-azure-services-to-deliver-hybrid-cloud.aspx"&gt;announcement blog post&lt;/a&gt; which should get your attention.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Build web sites and applications with this highly elastic solution supporting .NET, Node.js, and PHP while using common deployment techniques like Git and FTP.  Windows Azure Web Sites will also allow easy deployment of open source applications like WordPress, Joomla!, DotNetNuke, Umbraco, and Drupal to the cloud with a few clicks.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What&amp;#8217;s that?  Quick and easy deployment from GIT to Azure?  You&amp;#8217;ve got my attention.  But their not done yet, then they throw down:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Windows Azure SDK June 2012 includes new developer capabilities for writing code against the latest service improvements with updated support for Java, PHP, and .NET, and the addition of Python as a supported language on Windows Azure.  Additionally, the SDK now provides 100% command line support for both Windows and Mac.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ok, where are the hidden cameras? 100% command line support for both Mac and Windows?!  Sign me up!&lt;/p&gt;

&lt;p&gt;Join me tomorrow for &lt;a href="http://www.meetwindowsazure.com/"&gt;Meet Windows Azure&lt;/a&gt; and lets see what ScottGu has done to improve Azure.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tp5U9jsIbIw:e-5R4O25T4E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=tp5U9jsIbIw:e-5R4O25T4E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tp5U9jsIbIw:e-5R4O25T4E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tp5U9jsIbIw:e-5R4O25T4E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tp5U9jsIbIw:e-5R4O25T4E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=tp5U9jsIbIw:e-5R4O25T4E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=tp5U9jsIbIw:e-5R4O25T4E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/tp5U9jsIbIw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/join-scottgu-for-meet-windows-azure/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Windows Phone Bootcamp and Hackathon at Big (D) 2012]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/7I-FBa0kRxI/" />
    <updated>2012-05-28T08:38:00-05:00</updated>
    <id>http://TimRayburn.net/blog/windows-phone-bootcamp-and-hackathon-at-big-d-2012</id>
    <content type="html">&lt;p&gt;Want to learn what it takes to build a Windows Phone application?&lt;/p&gt;

&lt;p&gt;The Windows Phone Bootcamp and Hackathon is a &lt;strong&gt;free&lt;/strong&gt;, two-day event chock-full of everything you need to know to develop a Windows Phone application followed by an application building competition. Whether you&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7I-FBa0kRxI:qjv_rgQqEnA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=7I-FBa0kRxI:qjv_rgQqEnA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7I-FBa0kRxI:qjv_rgQqEnA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7I-FBa0kRxI:qjv_rgQqEnA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7I-FBa0kRxI:qjv_rgQqEnA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7I-FBa0kRxI:qjv_rgQqEnA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=7I-FBa0kRxI:qjv_rgQqEnA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/7I-FBa0kRxI" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/windows-phone-bootcamp-and-hackathon-at-big-d-2012/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Presentation - WCF Topics]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/oL-NOM7_bs0/" />
    <updated>2012-04-17T12:05:00-05:00</updated>
    <id>http://TimRayburn.net/blog/presentation-wcf-topics</id>
    <content type="html">&lt;p&gt;This morning I had the pleasure of review the basics of WCF with a group from Exxon.  As promised to them I&amp;#8217;ve made all code and presentations from that talk available at &lt;a href="https://github.com/trayburn/Presentations.WcfTopics"&gt;GitHub&lt;/a&gt;.  Thank you all for attending, and again if you have any questions please feel free to reach out to me at Tim@TimRayburn.net.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oL-NOM7_bs0:TkyzLsWIQ8g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=oL-NOM7_bs0:TkyzLsWIQ8g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oL-NOM7_bs0:TkyzLsWIQ8g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oL-NOM7_bs0:TkyzLsWIQ8g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oL-NOM7_bs0:TkyzLsWIQ8g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=oL-NOM7_bs0:TkyzLsWIQ8g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=oL-NOM7_bs0:TkyzLsWIQ8g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/oL-NOM7_bs0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/presentation-wcf-topics/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing SWTOR.Parser]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/6JX56v4nbCA/" />
    <updated>2012-03-19T10:50:00-05:00</updated>
    <id>http://TimRayburn.net/blog/introducing-swtor-dot-parser</id>
    <content type="html">&lt;p&gt;&lt;img src="http://TimRayburn.net/images/swtor.jpg"&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m pleased today to introduce to all of you a new project, &lt;a href="https://github.com/trayburn/SWTOR.Parser"&gt;hosted on GitHub&lt;/a&gt;, called &lt;a href="https://github.com/trayburn/SWTOR.Parser"&gt;SWTOR.Parser&lt;/a&gt;.  SWTOR.Parser is a C# library to parse the combat logs of Star Wars : The Old Republic that are now available on their Test Server, and will be introduced into the main game in Patch 1.2.  This library at the current time is very simple, it will read from any System.IO.TextReader, and return an IList&lt;LogEntry&gt;.  LogEntry and it&amp;#8217;s related classes are a simple C# domain object.  The domain classes are simple POCO classes, and can be easily serialized into JSON or anything else you might want.&lt;/p&gt;

&lt;p&gt;This library does not yet contain any analysis code for analyzing logs, it is just a DLL which handles the parsing.  Over the coming weeks I intend to introduce analysis systems for these log files, and welcome any pull requests to that end, but now that the logs are available publicly on the Test Server I thought it time to make this much public so others do not need to replicate the effort.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in contributing, &lt;a href="https://github.com/trayburn/SWTOR.Parser"&gt;fork the project and send me a pull request&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=6JX56v4nbCA:b5AMCpxIzf0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=6JX56v4nbCA:b5AMCpxIzf0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=6JX56v4nbCA:b5AMCpxIzf0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=6JX56v4nbCA:b5AMCpxIzf0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=6JX56v4nbCA:b5AMCpxIzf0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=6JX56v4nbCA:b5AMCpxIzf0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=6JX56v4nbCA:b5AMCpxIzf0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/6JX56v4nbCA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/introducing-swtor-dot-parser/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[PowerTrip FTW]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/G4nB0i5yJ0Y/" />
    <updated>2012-03-13T23:13:00-05:00</updated>
    <id>http://TimRayburn.net/blog/powertrip-ftw-slash</id>
    <content type="html">&lt;p&gt;&lt;img src="http://TimRayburn.net/images/powertrip.jpg"&gt;&lt;/p&gt;

&lt;p&gt;While attending the Microsoft MVP Summit, I was given a gift that I simple must write to you about.  It is called the &lt;a href="http://www.powerstick.com/microsite/products/powertrip/"&gt;PowerTrip by PowerStick&lt;/a&gt; and it is the most terribly useful addition to my consulting bag in quite some time.  This device will power and charge up a USB device from an internal battery.  That battery can, in turn, be charged three ways : by USB, by power outlet, or by included solar cell.  As if that was not enough, it has an included USB flash drive, mine has 8gb of internal storage.  It can take an iPhone from zero to full five times on one charge, or extend the life of an iPad by 6 hours.  Simply put, this device is incredible, and has taken the place of all those other USB chargers in my bag.  One charger can cover all my devices, and serve as emergency power when I&amp;#8217;m running low.  &lt;a href="http://www.powerstick.com/microsite/products/powertrip/"&gt;Check it out if you&amp;#8217;re even have the gadget fiend that I am.&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=G4nB0i5yJ0Y:4tN3I5-IgOs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=G4nB0i5yJ0Y:4tN3I5-IgOs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=G4nB0i5yJ0Y:4tN3I5-IgOs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=G4nB0i5yJ0Y:4tN3I5-IgOs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=G4nB0i5yJ0Y:4tN3I5-IgOs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=G4nB0i5yJ0Y:4tN3I5-IgOs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=G4nB0i5yJ0Y:4tN3I5-IgOs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/G4nB0i5yJ0Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/powertrip-ftw-slash/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Apprentices Update]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/7ASssm2G9v0/" />
    <updated>2012-02-26T10:36:00-06:00</updated>
    <id>http://TimRayburn.net/blog/apprentices-update</id>
    <content type="html">&lt;p&gt;Some time ago, &lt;a href="http://timrayburn.net/blog/apprenticeship-a-journey-begins/"&gt;I wrote about taking my first apprentice&lt;/a&gt; but I&amp;#8217;ve been very lax about keeping you my dear readers up to date on how that has gone.  To sum up the previous post, in January of 2011 I took an Apprentice by the name of Chris Jackson.  I&amp;#8217;d known him for decades, literally, and he wanted to break into the programming career path.  So we set out on a time-boxed experiment.  6 months to see if we could get him employable.&lt;/p&gt;

&lt;p&gt;Well, in June of 2011, Chris Jackson accepted a position with ThinkFinance as an entry level developer.  His annual income quadrupled on the day he signed the paperwork, moving from $13K to over $50k/year.  All credit to Chris, this was his doing.  He put in the hours, he dealt with my berating him about not grasping topics quickly enough, and in the end he succeeded.  All reports are that Chris is doing very well at ThinkFinance, and I&amp;#8217;m very happy about that.  As anyone in the industry knows, getting your foot in the door is the hardest part and I was thrilled to see him get an offer from his very first interview.&lt;/p&gt;

&lt;p&gt;So what&amp;#8217;s the secret sauce?  Looking back on it, several things played key factors in his success.  Some of them were my doing, others were Chris&amp;#8217;, others were luck.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I focused the curriculum on current, market desirable skills.  This made Chris an entry level developer who could write an ASP.NET MVC 3 website, talk intelligently about SOLID, know what an IoC container was and how to use it, and talk about his experiences with Test Driven Development.&lt;/li&gt;
&lt;li&gt;There was an existing relationship between Chris and I which allowed me the latitude to address things directly and sometimes confrontational while knowing we would still part friends.  It is my belief that anyone can do alone what Chris and I did together, but sometimes our own failings are the reason why we don&amp;#8217;t.  If I&amp;#8217;m going to accept someone into this type of relationship, I need the latitude to confront personality flaws that might be holding them back.&lt;/li&gt;
&lt;li&gt;Chris put in the hard work, period, full stop.  8 hours per week of sessions with me, plus homework assignments.&lt;/li&gt;
&lt;li&gt;I required that his spouse, Lynda-Jo, be on board for this before we began.  The time commitment was substantial, and without a spouse&amp;#8217;s support he was going to fail.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;So if there is a secret sauce, I think it&amp;#8217;s somewhere in that list of things above.  I&amp;#8217;ve gone on and accepted two more apprentices since then, Mark Rayburn and Cody Fails.  Mark is my brother, and Cody is his best friend.  Like Chris Jackson, they&amp;#8217;re smack in the middle of learning the fundamentals, but unlike him I&amp;#8217;ve had to start with the very basics of computing.  Chris Jackson had a couple of years of college education in Computer Science behind him, Mark and Cody do not.  It&amp;#8217;s a new challenge, but we&amp;#8217;ll see how they do.  I full well realize that eventually, no matter how careful I am, one of my apprentices will not succeed in the transition of careers.  But the upside of transforming someone&amp;#8217;s life is so huge, that I&amp;#8217;m compelled to continue.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7ASssm2G9v0:JprCTVRKSpI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=7ASssm2G9v0:JprCTVRKSpI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7ASssm2G9v0:JprCTVRKSpI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7ASssm2G9v0:JprCTVRKSpI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7ASssm2G9v0:JprCTVRKSpI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=7ASssm2G9v0:JprCTVRKSpI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=7ASssm2G9v0:JprCTVRKSpI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/7ASssm2G9v0" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/apprentices-update/</feedburner:origLink></entry>
  
  <entry>
    <title type="html"><![CDATA[Where at MVP Summit is Tim Rayburn]]></title>
    <link href="http://feedproxy.google.com/~r/TimRayburnsBlog/~3/VxABR_OXEao/" />
    <updated>2012-02-24T09:22:00-06:00</updated>
    <id>http://TimRayburn.net/blog/where-at-mvp-summit-is-tim-rayburn</id>
    <content type="html">&lt;p&gt;&lt;span class='pullquote-right' data-pullquote='First and foremost is FourSquare, I&amp;#8217;ll post whenever I arrive at a location.'&gt;
The MVP Summit is coming up next week, and it is always a fantastic time to network and get caught up with my friends literally from around the world.  One of the big challenges of Summit is just finding people, so this post will serve as the guidepost of how to find me at Summit.  First and foremost is FourSquare, I&amp;#8217;ll post whenever I arrive at a location.  Even if I&amp;#8217;m not allowed to disclose why I&amp;#8217;m somewhere, because of NDA topics, I can discuss that I&amp;#8217;m somewhere, like &amp;#8220;Building 92 on the MSFT Campus&amp;#8221;.  But beyond that, there are several public events which I can disclose I&amp;#8217;ll be at, so lets list those out.
&lt;/span&gt;&lt;/p&gt;

&lt;h1&gt;Agenda&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Sunday

&lt;ul&gt;
&lt;li&gt;9:30ish - Land at SEATAC Airport&lt;/li&gt;
&lt;li&gt;12:30 - &lt;a href="http://www.bluecsushi.com/default.aspx?ID=43"&gt;Improving Sushi at Blue C Sushi&lt;/a&gt;  &amp;#8230; I love sushi, so does Devlin Liles my fellow Improving employee and Blue C Sushi in Bellevue is awesome.  This is open to one and all, join me if you&amp;#8217;d like sushi or conversation or both.  Your sushi bill is your own, but we&amp;#8217;re fun people.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monday

&lt;ul&gt;
&lt;li&gt;18:00 till 21:00 - &lt;a href="https://www.eventbrite.com/orderconfirmation/2871674255/71508107"&gt;Party with Palermo&lt;/a&gt; &amp;#8230; This is open to anyone who registers, so register at the link, MVP or not.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tuesday

&lt;ul&gt;
&lt;li&gt;20:00 till Who Knows - &lt;a href="https://github.com/blog/1059-bellevue-wa-drinkup"&gt;GitHub Drinkup hosted by Phil Haack&lt;/a&gt; &amp;#8230; This is open to the public, even if you&amp;#8217;re not an MVP come on by!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wednesday

&lt;ul&gt;
&lt;li&gt;7:00 - 9:00 - &lt;a href="http://blog.pluralsight.com/2012/02/09/pluralsight-author-and-recruiting-breakfast-at-the-mvp-summit/"&gt;Pluralsight Author Breakfast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;18:00 till Who Knows - ChezNeward private party&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Thursday

&lt;ul&gt;
&lt;li&gt;19:00 till Who Knows - Attendee Party&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Friday

&lt;ul&gt;
&lt;li&gt;11:00 - &lt;a href="http://www.bluecsushi.com/default.aspx?ID=43"&gt;Improving Sushi at Blue C Sushi Part 2&lt;/a&gt; &amp;#8230; Gotta get my last fix of good sushi in before tripping back to the landlocked Dallas/Fort Worth area.&lt;/li&gt;
&lt;li&gt;14:00ish - Takeoff from SEATAC Airport&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=VxABR_OXEao:9C5B0Bb8gJA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=VxABR_OXEao:9C5B0Bb8gJA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=VxABR_OXEao:9C5B0Bb8gJA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=VxABR_OXEao:9C5B0Bb8gJA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=VxABR_OXEao:9C5B0Bb8gJA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TimRayburnsBlog?a=VxABR_OXEao:9C5B0Bb8gJA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TimRayburnsBlog?i=VxABR_OXEao:9C5B0Bb8gJA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TimRayburnsBlog/~4/VxABR_OXEao" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://TimRayburn.net/blog/where-at-mvp-summit-is-tim-rayburn/</feedburner:origLink></entry>
  
</feed>
