<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Live Powershell with Karl Prosser</title><link>http://powershell.com/cs/blogs/karl-prosser/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>ShellTool’s Portable PowerShell – Description, Survey and Private Beta</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/07/20/shelltools_2D00_portable_2D00_powershell_2D00_description_2D00_survey_2D00_and_2D00_private_2D00_beta.aspx</link><pubDate>Tue, 21 Jul 2009 05:21:43 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:2915</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=2915</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/07/20/shelltools_2D00_portable_2D00_powershell_2D00_description_2D00_survey_2D00_and_2D00_private_2D00_beta.aspx#comments</comments><description>&lt;p&gt;&lt;u&gt;What is it?&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;Portable PowerShell is software that allows you to run PowerShell on machines that don’t have PowerShell installed that you can run from a Machine that doesn’t have PowerShell on it, from a USB stick, on a machine that has a different version of PowerShell, a preinstall environment like BartPE, or WinPE or when booted to a windows 7 recovery DVD. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Why would I want it?&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;Administrators often cannot get their key tools, such as PowerShell installed in the environments they are working. This may be because a server installation has not yet been tested or approved, or the IT pro is working on a client’s environment, or a desktop support engineer is working on a machine that will likely not ever have PowerShell installed or enabled. Additionally you may want to run a different version of PowerShell than that installed, being able to do side by side work or comparisons when developing scripts. Having a thumb drive with portable PowerShell and all your own custom scripts with you at all times would be a dream come true to many administrators and IT pros. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;How does it work?&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;You simple take our “PortablePowerShell” zip file and unzip it on a computer that already has PowerShell and Run “MakePortable.exe” and that will produce a folder containing everything you need to run PowerShell portable. From there you can just run it, or then copy it onto other computers, or onto a USB stick. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Does it use App-V or Thinapp?&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;Though we experimented with ThinApp and App-V for this very purpose a few years ago, we do not use either of those technologies as the past on licensing costs would be prohibitive for the majority of our customers. Instead we have crafted our own “Application Virtualization” particularly targeting the needs of the PowerShell engine. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;What about PowerShell V2&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;In the future after the full release of PowerShell V2 we will release a version that will be able to produce a Portable PowerShell V2, however we made a Portable WinRM so V2 remoting will be limited or non-existent, however we are investigating what is needed to ensure that PowerShell V2 remoting will work. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;What about Third Party Snapins?&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;Snap-in DLLs can be distributed with Portable PowerShell, and we have a configuration tool, and an XML configuration file that ensures that snapins get registered with the Portable PowerShell. However if the third party snapin’s installer puts other files in different places and maintains its own product registry , those snapins may not work. We do however provide a way that you can create and maintain virtual registry settings. We will set up a forum where instructions of including different snapins can be shared with the community. We are confident the majority of Third Party snapins will be able to be run, and we are willing to update the product to accommodate important but “difficult” snapins. &lt;/p&gt;  &lt;p&gt;Other Features include ability to produce “custom portable PowerShell’s with special logging, specific scripts build in, scheduling etc. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;So when can I get this and how much will it Cost?&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;ShellTools debuted with bring PowerShell Analyzer then PowerShellPlus, which is now produced and sold by Idera, successfully to market. We have a commitment to our customers, and we want to ensure that what we make lasts, and is feasible to maintain and support. We also learnt that bringing a product to market requires a lot more effort that just excellent software engineering. So basically we are now starting the process of working out whether ShellTools Portable PowerShell is commercially feasible and that we should bring it to market, or whether we just keep it as our own internal tool. &lt;/p&gt;  &lt;p&gt;To help us decide could you please fill out the following survey? Additionally if you leave your email address with us in the survey you will likely be invited into the private Beta. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://spreadsheets.google.com/viewform?hl=en&amp;amp;formkey=dGQ1UmZqNnVFSmZ6dGdHZS1uQ3R6LWc6MA.."&gt;Link to Survey&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Embedded Survey &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; Loading...  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3c7edb6b-e327-40db-ae87-017b516bd875" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ShellTools" rel="tag"&gt;ShellTools&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Portable+PowerShell" rel="tag"&gt;Portable PowerShell&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;Thanks,    &lt;br /&gt;The ShellTools Team. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=2915" width="1" height="1"&gt;</description></item><item><title>Searching PoshCode repository from your Desktop in Windows 7</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/16/searching-poshcode-repository-from-your-desktop-in-windows-7.aspx</link><pubDate>Mon, 16 Feb 2009 20:49:39 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1477</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1477</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/16/searching-poshcode-repository-from-your-desktop-in-windows-7.aspx#comments</comments><description>&lt;p&gt;A picture says a thousand words&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/karl-prosser/dvxxlk_5F00_3EF8B2BD.jpg"&gt;&lt;img title="dvxxlk" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="439" alt="dvxxlk" src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/karl-prosser/dvxxlk_5F00_thumb_5F00_19FD82F5.jpg" width="644" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Search results from the PowerShell Code Repository right there on your desktop in windows 7 thanks to federated search and Jaykul adding OpenSearch support to PoshCode. YAY&lt;/p&gt;  &lt;p&gt;So how do you get this. Simply download &lt;a href="http://www.karlprosser.com/coder/blogfiles/poshcode.osdx"&gt;this link&lt;/a&gt;&amp;#160; and save is as fileextention OSDX from your windows 7 machine. Then Run it. It seems if you just try to open it in IE, you’ll just get the XML.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt; That is a simple OSDX file that is just an XML file describing the OpenSearch interface. the full text is here. and it comes from PoshCode itself.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;      &lt;br /&gt;&amp;lt;OpenSearchDescription xmlns=&amp;quot;&lt;/strong&gt;&lt;a href="http://a9.com/-/spec/opensearch/1.1/&amp;quot;"&gt;&lt;strong&gt;http://a9.com/-/spec/opensearch/1.1/&amp;quot;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; xmlns:moz=&amp;quot;&lt;/strong&gt;&lt;a href="http://www.mozilla.org/2006/browser/search/&amp;quot;"&gt;&lt;strong&gt;http://www.mozilla.org/2006/browser/search/&amp;quot;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;ShortName&amp;gt;PoshCode&amp;lt;/ShortName&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;Description&amp;gt;PowerShell script repository search interface&amp;lt;/Description&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;Tags&amp;gt;PowerShell Scripts Scripting Code Modules&amp;lt;/Tags&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;Contact&amp;gt;feedback@poshcode.org&amp;lt;/Contact&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;Url type=&amp;quot;text/html&amp;quot; template=&amp;quot;&lt;/strong&gt;&lt;a href="http://poshcode.org/search/{searchTerms}&amp;quot;"&gt;&lt;strong&gt;http://poshcode.org/search/{searchTerms}&amp;quot;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; /&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;Url type=&amp;quot;application/rss+xml&amp;quot; template=&amp;quot;&lt;/strong&gt;&lt;a href="http://poshcode.org/api/{searchTerms}&amp;quot;"&gt;&lt;strong&gt;http://poshcode.org/api/{searchTerms}&amp;quot;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; /&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;Image height=&amp;quot;16&amp;quot; width=&amp;quot;16&amp;quot; type=&amp;quot;image/vnd.microsoft.icon&amp;quot;&amp;gt;&lt;/strong&gt;&lt;a href="http://poshcode.org/favicon.ico"&gt;&lt;strong&gt;http://poshcode.org/favicon.ico&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;lt;/Image&amp;gt;      &lt;br /&gt;&amp;lt;!--&amp;#160;&amp;#160; &amp;lt;Url type=&amp;quot;application/x-suggestions+json&amp;quot; template=&amp;quot;&lt;/strong&gt;&lt;a href="http://localhost:7402/content/notes.opensearchsuggestions.json?qt={searchTerms}&amp;quot;/"&gt;&lt;strong&gt;http://localhost:7402/content/notes.opensearchsuggestions.json?qt={searchTerms}&amp;quot;/&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;#160; --&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/OpenSearchDescription&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1477" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/poshcode/default.aspx">poshcode</category></item><item><title>Sick of an exception happening to just one item in the pipeline when you don’t care.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/13/sick-of-an-exception-happening-to-just-one-item-in-the-pipeline-when-you-don-t-care.aspx</link><pubDate>Fri, 13 Feb 2009 17:59:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1452</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1452</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/13/sick-of-an-exception-happening-to-just-one-item-in-the-pipeline-when-you-don-t-care.aspx#comments</comments><description>&lt;p&gt;How many times have you had something like:    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;get-thousandsofitems | % { do-something $_ } | whatever&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Only to have some exception happen in do-something and it throws the whole thing. When really you don’t care, you’d rather just be able to know what failed and have it move on. This happens a fair bit with Get-WMIobject etc, because one of the machines may be off, firewall blocked, some sort of permissions issues – things that bubble up even when you have the preference set to SilentyContinue. &lt;/p&gt;  &lt;p&gt;So what do we normally do in this scenario. We either pipeline it and make it look like a VBscript, or ruin our beautiful single liner by making that script complicated with V1 traps and the likes, and we usually get the error handling wrong wrong a number of times along the way.&lt;/p&gt;  &lt;p&gt;Well with PowerShell you can always adjust and expand the language. There is nothing particular special about the foreach-object Cmdlet. In its common use you can replicate it with a function as simple as the one below.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;function myforeach-object([scriptblock]$process) { process { &amp;amp;$process } }&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So how about making a looping function that deals with the exceptions for you, you say? Great Idea!, Now you are cooking. The following function is pretty much a simple V1 function, though it should really be completed and production readied into a V2 Advanced function with all the modern trimmings and trappings, however I DO use V2 TRY/CATCH syntax instead of V1 Trapping, because its more sane to us who don’t have a secret VBscript fetish.&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;foreach-withexception&lt;/span&gt;&lt;span style="color:#000000;"&gt; ([scriptblock]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$process&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$outputexception&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
  begin { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$global:foreachex&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @() }
  process { 
            try 
            {
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$local:inputitem&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$process&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
            }
            catch
            {
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$local:exceptionitem&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;select-object&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;,exception
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$local:exceptionitem&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$local:inputitem&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$local:exceptionitem&lt;/span&gt;&lt;span style="color:#000000;"&gt;.exception &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$global:foreachex&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$local:exceptionitem&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            }
          }
  end {}
}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;set-alias&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt;ex &lt;/span&gt;&lt;span style="color:#008080;"&gt;foreach-withexception&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;So i love my aliases , %ex for foreach with exceptions. Really I wish i could come up with a better name for the long function. I also keep a %i for my foreach-index function as well. Basically you use this just like foreach-object (though i haven’t implemented a begin and end area in this), and exceptions get eaten, but after the fact you can access the object that caused the error, and the error in the global $foreachex variable. At a later date i’m going to add an option paramter variable that if can put the exception in instead of a naughty global variable. But as Jeffrey Snover says “To ship is to choose” though for me it really means “this function does what i need it to now, i need to go back and solve the Real problem i’m solving that this function really helps with”&lt;/p&gt;

&lt;p&gt;here is an example&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;100..-5 | %ex {&amp;#160; &amp;quot;yo $_&amp;quot; ;&amp;#160; 1 / $_ } 
    &lt;br /&gt;$foreachex&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/karl-prosser/Capture1_5F00_66FFF994.jpg"&gt;&lt;img title="Capture1" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="293" alt="Capture1" src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/karl-prosser/Capture1_5F00_thumb_5F00_49217593.jpg" width="518" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;normally 0/0 would throw a fuss , and kill the whole thing, but it just works on , and you can check to see if there are any errors in $foreachex Normally the things that i need this for though are “loose web services”, WMI, or networking sort of things. but really it simplifies my one liners, and gets things done quicker.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.poshcode.org/864"&gt;@poshcode&lt;/a&gt; | &lt;a href="http://www.poshcode.org/get/864"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;blockquote dir="ltr" style="margin-right:0px;"&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1452" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/PS+extented/default.aspx">PS extented</category></item><item><title>PowerBoots – a beautiful DSL , not to mention useful.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/11/powerboots-a-beautiful-dsl-not-to-mention-useful.aspx</link><pubDate>Thu, 12 Feb 2009 06:12:38 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1451</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1451</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/11/powerboots-a-beautiful-dsl-not-to-mention-useful.aspx#comments</comments><description>&lt;p&gt;I’ve always liked the fact that I can extend PowerShell, whether its just a little bit of syntax here or there, or a full blown DSL, and end up with something that is still naturally powershelly. &lt;a href="http://huddledmasses.org/"&gt;Jaykul (Joel Bennet)&lt;/a&gt; has really used PowerShell in such a way. really making something that is pithy, follows a DRY philosophy, and is METAPROGRAMMING on two levels (the auto generation of the PowerShell functions and parameters, and of course the XAML). Its not only a beautiful example of PowerShell as a DSL, but also ultimately useful. I really think it has the potential to become the tcl/tk of PowerShell and the primary admin GUI scripting framework. I’m so impressed with it, we at ShellTools are definitely going to adjust our PowerShell WPF designer to support Boots. Boots is also now a &lt;a href="http://www.codeplex.com/PowerBoots"&gt;codeplex project&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Below is an example of the script, and a few screenshots and videos from Jaykul’s blog.&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#000000;"&gt;Boots {
   StackPanel &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;Margin&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
      TextBlock &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;The Question&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;FontSize&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;42&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;FontWeight&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bold &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;Foreground&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;#FF0088&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      TextBlock &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;FontSize&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;24&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
         Hyperlink {
            Bold &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Q. &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Can PowerBoots do async threads?&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
         } &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;NavigateUri&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;On_RequestNavigate&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$global:Answer&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;].Visibility &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Visible&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; }
      }
      TextBlock &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;FontSize&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;16&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
         Span &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;A. &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;FontSize&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;24&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;FontWeight&lt;/span&gt;&lt;span style="color:#000000;"&gt; Bold 
         &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Oh yes we can!&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      } &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;OV&lt;/span&gt;&lt;span style="color:#000000;"&gt; global:Answer &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;Visibility&lt;/span&gt;&lt;span style="color:#000000;"&gt; Collapsed
   }
} &lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img height="451" alt="PowerBoots11.png" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=PowerBoots&amp;amp;DownloadId=57360" width="757" /&gt;&lt;/p&gt;

&lt;p&gt;.&lt;/p&gt;

&lt;p&gt; 

 


 


  
.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1451" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powerboots/default.aspx">powerboots</category></item><item><title>Print-File Function</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/10/print_2D00_file_2D00_function.aspx</link><pubDate>Wed, 11 Feb 2009 05:35:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1450</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1450</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/10/print_2D00_file_2D00_function.aspx#comments</comments><description>&lt;p&gt;Here is a simple function that will ask the associated program to print any file you pass in. It can work with a file as a parameter, or multiple files. How well this works, especially with multiple files at a time, depends on the associated application, first whether it supports the print verb, and secondly how it handles it – more importantly how it handles opening many files at once. I haven’t yet been brave enough to try it on PDFs with adobe reader.    &lt;br /&gt;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;print-file&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
{ 
 begin  { 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;internal-printfile&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$thefile&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
    { 
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$thefile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-is&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) {&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filename&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$thefile&lt;/span&gt;&lt;span style="color:#000000;"&gt; } 
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; { 
                &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$thefile&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-is&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] ) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filename&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$THEfile&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName } 
             } 
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$start&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;new-object&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Diagnostics.ProcessStartInfo &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filename&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$start&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Verb &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;print&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        [System.Diagnostics.Process]::Start(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$start&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
    } 

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { 
                &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filespecified&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;; 
                &lt;/span&gt;&lt;span style="color:#008080;"&gt;internal-printfile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
            } 
       } 
process{&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;!&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filespecified&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#008080;"&gt;write-Host&lt;/span&gt;&lt;span style="color:#000000;"&gt; process ; &lt;/span&gt;&lt;span style="color:#008080;"&gt;internal-printfile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt; } } 

}&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;@&lt;a href="http://poshcode.org/843"&gt;poshcode&lt;/a&gt; | &lt;a href="http://poshcode.org/get/843"&gt;download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can pass in a path to the file , or a fileobject that you get as a response from get-childitem (dir)&lt;/p&gt;

&lt;p&gt;Here are a few examples&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;look recursively through a folder and print all word documents&lt;/span&gt;&lt;span style="color:#008000;"&gt; 
&lt;/span&gt;&lt;span style="color:#000000;"&gt;dir &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt;.doc &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;r&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;print-file&lt;/span&gt;&lt;span style="color:#000000;"&gt; 

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;print one particular pdf file&lt;/span&gt;&lt;span style="color:#008000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;print-file&lt;/span&gt;&lt;span style="color:#000000;"&gt; c:\downloads\myfile.pdf&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Warning, this isn’t up to being a shrink wrapped deliverable. It doesn’t do any error handling, isn’t a nice V2 advanced function or anything, but that&amp;#39;s a beauty of PowerShell, you can just hack out something that fits your needs in a few minutes. With V2 parameter binding, this would be more elegant and actually simpler as i have to do some duplication of logic in my function to get it to work accepting the file both through the pipeline and as a parameter.&lt;/p&gt;

&lt;p&gt;-Enjoy.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1450" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category></item><item><title>PowerShell ISE-Cream</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/05/powershell_2D00_ise_2D00_cream.aspx</link><pubDate>Fri, 06 Feb 2009 05:34:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1449</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1449</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/05/powershell_2D00_ise_2D00_cream.aspx#comments</comments><description>&lt;p&gt;A while back I threw together a &lt;a href="http://karlprosser.com/coder/2009/01/03/powershell-analayzer-like-execution-hotkeys-for-ps-ctp3-ise/"&gt;few scripts&lt;/a&gt; to enhance PowerShell V2 ISE experience that added some PowerShell Analyzer like features . They were a natural fit as ISE (Intergrated Scripting Environment) is like a WPF-based stripped PowerShell Analyzer like with its multiple runspaces, editors, and immediate command area. &lt;/p&gt;  &lt;p&gt;The extensibility model of ISE has caught on, and many people have been writing some great scripts adding hotkeys to do every what not you could imagine, so I&amp;#39;ve decided to start a &lt;a href="http://www.codeplex.com/psisecream"&gt;codeplex project&lt;/a&gt; with the punny name “&lt;a href="http://www.codeplex.com/psisecream"&gt;PowerShell ISE-Cream&lt;/a&gt;” . The Goal of this project is first to gather a huge variety of functionality that various people are willing to share, refactor it into production quality functions, with extensive error handling, and packaged in V2 Modules, and finally incorporate it in a way that users can easily turn on and off different features through a consistent configuration.&lt;/p&gt;  &lt;p&gt;Right now however we are just going to gather whatever scraps there are, whether they conflict with each other or not, and anybody passionate about this can join the project, as we sculpt it hopefully into something both useful and beautiful.&lt;/p&gt;  &lt;p&gt;Doug Finke has already joined the club with his &lt;a href="http://www.codeplex.com/psisecream"&gt;Expand-Alias and Expand-CurrentAlias&lt;/a&gt; functions, and there are quite a few other functions that people i know are willing to share, so it should be good.&lt;/p&gt;  &lt;p&gt;We’ll be brainstorming and deciding on a bunch of design issue, you can join the conversation on the first one in this &lt;a href="http://www.codeplex.com/psisecream/Thread/View.aspx?ThreadId=46157"&gt;discussion thread&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://powerscripting.wordpress.com/"&gt;PowerScripting Podcast&lt;/a&gt; tonight (Thursday 5th Feb 2009) will be talking about ISE. There should be a number of MVPs (including myself) and some PowerShell Team staff calling in. It Should be fun.&lt;/p&gt;  &lt;p&gt;-Karl&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1449" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/PSV2/default.aspx">PSV2</category></item><item><title>Tobias and Idera make PowerShellPlus 2.1 Beta Public.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/04/tobias_2D00_and_2D00_idera_2D00_make_2D00_powershellplus_2D00_21_2D00_beta_2D00_public.aspx</link><pubDate>Thu, 05 Feb 2009 05:32:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1448</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1448</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/02/04/tobias_2D00_and_2D00_idera_2D00_make_2D00_powershellplus_2D00_21_2D00_beta_2D00_public.aspx#comments</comments><description>&lt;p&gt;Well its been six months or more since our baby PowerShell Plus grew up, left home and moved in with Idera. Well its been progressing nicely, and we are happy to see the vision being fulfilled,nd even expanded, with a successful commercial product. Go Tobias – Go Idera.&lt;/p&gt;  &lt;p&gt;Anyhow, I&amp;#39;m pretty much going to reblog the content from Tobias’s blog entry below. If you haven’t tried PS+ yet. I recommend wholeheartedly that you do. It really is about 3 generations and a couple of years ahead of anything else out there. Other vendors have only recently implemented “borrowed” features that have been in PowerShell Analyzer and PowerShell Plus since 2006.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://powershell.com/cs/blogs/news/archive/2009/02/02/powershellplus-v2-1-beta-is-live.aspx" href="http://powershell.com/cs/blogs/news/archive/2009/02/02/powershellplus-v2-1-beta-is-live.aspx"&gt;http://powershell.com/cs/blogs/news/archive/2009/02/02/powershellplus-v2-1-beta-is-live.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;---------------------------------------------------------&lt;/p&gt;  &lt;p&gt;Exciting news! Effective immediately, PowerShellPlus v2.1 Beta is live and publicly available! Below you will find exciting information about an early look at what the PowerShellPlus team has been working on.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.21.03/psp213.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;PowerShellPlus version 2.1 introduces several new and cool features focused on reducing the PowerShell learning curve, increasing the productivity of PowerShell development and exercising the capabilities of PowerShell 2.0. The new features include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Code sharing &lt;/strong&gt;– Enables you to leverage the wealth of scripts that reside in the PowerShell.com and PoshCode.org libraries. Increase your productivity by quickly and easily searching and grabbing the scripts from those libraries. You can also submit your own scripts to the PowerShell.com library directly from PowerShell Plus Editor &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Visual Basic support &lt;/strong&gt;– The PowerShell Plus Editor can now edit and run Visual Basic scripts &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;STA mode support &lt;/strong&gt;– Enables you to produce pretty cool looking GUI’s with Windows Presentation Framework (WPF) using PowerShell 2.0. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;PowerShell Assembly Detection &lt;/strong&gt;– Gives the Learning Center an auto-upgrade path if PowerShell v2 CTP3 is detected and then displays the most up-to-date information &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Learning Center Auto-Load - &lt;/strong&gt;Makes searching for a request with a single match much easier to use since the topic will load automatically, saving extra keystrokes &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cmdlet parameter position – &lt;/strong&gt;Shows you additional information in the code completion popup window about parameters including position and type &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Console size overlay &lt;/strong&gt;– Shows you the height and width of the Console when you resize it &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Additional Sample Scripts &lt;/strong&gt;- Active Directory, IIS 7.0 and MySQL &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;PowerShell v2 CTP3 Support &lt;/strong&gt;– Including Block Comments and the $Profile variable &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;How to get the New Version&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt; Use the link at the bottom of this page to download the installation package, but before you do please read the following disclaimers, warnings and other general portents of doom.  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;This software is a pre-release version and should not be deployed in a production environment. It will not work the way a final version of the software does. Features will change before the final release&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;If you already have a PowerShellPlus license we recommend that you install this version on another machine, but we do support an upgrade in place your production version. &lt;/li&gt;    &lt;li&gt;If you upgrade your production version of 2.0 we will not overwrite any user customizations that have been made to PowerShellPlus but we do recommend you make a copy of the Sample scripts if you have modified them. &lt;/li&gt;    &lt;li&gt;A list of the changes is provided in the Release Notes in the Installation Package. &lt;/li&gt;    &lt;li&gt;This release is designed to provide the PowerShellPlus community with a preview of key features coming in 2.1 and to solicit feedback about them. This Technical Beta is not supported by the Idera Technical Support Team. Please visit the Beta Place: &lt;a href="http://powershell.com/cs/forums/93.aspx"&gt;http://powershell.com/cs/forums/93.aspx&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;System Requirements &lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft Windows PowerShell Version 1 or Version 2 CTP2 or CTP3 &lt;/li&gt;    &lt;li&gt;Windows XP, Server 2003, Windows Vista, Server 2008, Windows 7 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Installation Instructions &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;To install PowerShellPlus:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Click the link at the bottom of this page and complete the download form &lt;/li&gt;    &lt;li&gt;An email will be sent with instructions on how to download the Beta. &lt;/li&gt;    &lt;li&gt;After downloading the Beta, unzip the contents of the Installer package. &lt;/li&gt;    &lt;li&gt;Read the Release Notes for late breaking information about the Beta. &lt;/li&gt;    &lt;li&gt;If you are upgrading from PowerShellPlus 2.0 make that you copy the Sample Scripts to another location, if you have modified them. &lt;/li&gt;    &lt;li&gt;Run the Setup.exe program to install PowerShellPlus 2.1. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Grab your copy now:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://www.idera.com/Content/Show.aspx?PageID=2&amp;amp;PurchaseType=DLNowAdd&amp;amp;AddProdID=9000"&gt;Download Here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For feedback, bug reports, suggestions and discussions regarding this beta release, please visit and use our Beta Place:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://powershell.com/cs/forums/93.aspx"&gt;http://powershell.com/cs/forums/93.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;p&gt;-Tobias&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1448" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/PSV2/default.aspx">PSV2</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell+plus/default.aspx">powershell plus</category></item><item><title>Debugging Realtime by Ear. Adding one more dimension</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/30/debugging_2D00_realtime_2D00_by_2D00_ear_2D00_adding_2D00_one_2D00_more_2D00_dimension.aspx</link><pubDate>Sat, 31 Jan 2009 05:30:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1447</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1447</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/30/debugging_2D00_realtime_2D00_by_2D00_ear_2D00_adding_2D00_one_2D00_more_2D00_dimension.aspx#comments</comments><description>&lt;p&gt;I am amazed by people who can pick out every single note and chord when listening to music, and others who can totally play by ear. However even the musically inept and tone-deaf of us can detect an odd note, especially if its in a tune we know, but often even in an unknown tune, we can detect an out of place note, that isn&amp;#39;t in the scale, whether we know what a scale is, or even what key the song is in.&lt;/p&gt;  &lt;p&gt;So what&amp;#39;s this got to do with debugging? We&amp;#39;ll mostly it’s the real time aspect. You are able to process a lot of information (notes), in context, and are able to discern real-time what is out of place and wrong.&lt;/p&gt;  &lt;p&gt;Compare that to typical debugging. You might use checkpoints, and tracing through code, slowing down the execution often a million-fold, tediously stepping through each line of code, looking here and there.    &lt;br /&gt;Alternatively you might be processing log output, whether a debug stream in your IDE, console output, or something else. However just getting those messages to somewhere you can display can be hard when threading, and you aren&amp;#39;t in the GUI thread etc.     &lt;br /&gt;Additionally you are having to interpret this, often after the fact, and you can often miss things when lots is going on. How often , especially when finding a rare threading bug, are you running something 10 or more times, and maybe logging 10 or so different events each time. Going through the log takes time, and sometimes you miss the cue.&lt;/p&gt;  &lt;p&gt;So, is debugging with sounds going to change and revolutionize everything? No its just another tool in a really great toolkit we have these days.&lt;/p&gt;  &lt;p&gt;I thank my friend Oisin Grehan (&lt;a href="http://nivot.org"&gt;http://nivot.org&lt;/a&gt; ) for inspiring this as I don&amp;#39;t think I&amp;#39;ve used sound in debugging since the my&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Demoscene"&gt;Demoscene&lt;/a&gt;&amp;#160; days when I was coding MOD players. &lt;a href="http://en.wikipedia.org/wiki/Tracker"&gt;Mod Players&lt;/a&gt; . So naturaller the tracker syntax has inspired me a bit.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://tutorials.renoise.com/uploads/Renoise/vvoois_fasttracker.s.gif" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;So how does this work. Well work out the steps you are listening to, and maybe things you particularly want to catch, play the notes over and over a few times so you know mentality what to expect, then just start running you code, and listen to what actually IS happening, and then maybe at certain times you might make a certain note MEAN something (like middle&amp;#160; C&amp;#160; for TRUE function result and middle A for FALSE), but I typically just use notices to indicate execution flow, and if I want to know some value, I ask windows Speech API to help me out. &lt;/strong&gt;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Play-Note&lt;/span&gt;&lt;span style="color:#000000;"&gt;([&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$note&lt;/span&gt;&lt;span style="color:#000000;"&gt;,[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$duration&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
{ 
  &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$note&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-match&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;(\d+)&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$note&lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;4&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; };[void](&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$note&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-match&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;([A-G#]{1,2})(\d+)&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
  [console]::Beep((&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;440&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; [math]::Pow([math]::pow(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;,(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;12&lt;/span&gt;&lt;span style="color:#000000;"&gt;)), 
    (([&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$matches&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;12&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$&lt;/span&gt;&lt;span style="color:#000000;"&gt;( &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$matches&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) 
  {  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;A&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;A#&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Bb&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;B&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;C&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;C#&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Db&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; } 
     &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;D&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;D#&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;6&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Eb&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;6&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;E&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;7&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;F&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;F#&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;9&lt;/span&gt;&lt;span style="color:#000000;"&gt; }  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Gb&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;9&lt;/span&gt;&lt;span style="color:#000000;"&gt; } 
     &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;G&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;  { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; } &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;G#&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;11&lt;/span&gt;&lt;span style="color:#000000;"&gt; } &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Ab&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;11&lt;/span&gt;&lt;span style="color:#000000;"&gt; } 
  }))),&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$duration&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;*&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt; ) 
} 
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;So two things. I’ve based the notes on common tracker syntax including the octave. so middle A is A4 , then you have things like F#3 etc. however if as with everything PowerShell we want pithy, so if you don’t put an octave number then it will be 4 by default.&lt;/p&gt;

&lt;p&gt;play-note C ; play-note Eb ; play-note &amp;quot;C#”&lt;/p&gt;

&lt;p&gt;also i included a duration, so if the want the note to be anything but the default half a second put that as a parameter&lt;/p&gt;

&lt;p&gt;play-note Eb4 20&lt;/p&gt;

&lt;p&gt;and you’ll get an E flat for 2 whole seconds. You may ask why I don’t use seconds or milliseconds, because those are our official measurements in this 1,000,000 3 grouped western world. Well the reason is pithiness (something i love in my scripts, but aren’t good about when it comes to blogging). Typically i want a note between say 300 milliseconds and 5 seconds. so if i used milliseconds i’d always have to have those 2 or 3 extra zeros, while if i used seconds I&amp;#39;d be doing things like 0.4 and 1.5. If Japanese and Chinese we often communicate number differently, and group them differently. so there is a word for 10,000 , so to say 15 thousand you may say 1 (character for 10,000) 5.&lt;/p&gt;

&lt;p&gt;So what about voice. You can use a very simple function using the SAPI COM objects such as:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Speak-words&lt;/span&gt;&lt;span style="color:#000000;"&gt; ([&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$words&lt;/span&gt;&lt;span style="color:#000000;"&gt;,[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$pause&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
{   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$flag&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$pause&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$flag&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;} 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$voice&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;new-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;com&lt;/span&gt;&lt;span style="color:#000000;"&gt; SAPI.spvoice 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$voice&lt;/span&gt;&lt;span style="color:#000000;"&gt;.speak(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$words&lt;/span&gt;&lt;span style="color:#000000;"&gt;, [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$flag&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; 2 means wait until speaking is finished to continue&lt;/span&gt;&lt;span style="color:#008000;"&gt; 
&lt;/span&gt;&lt;span style="color:#000000;"&gt;} 
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Typically though i don’t create a $voice everytime , but kept a reference somewhere , like in my V2 module. Others however have done more impressive things with the voice in powershell ( &lt;a title="http://poshcode.org/667" href="http://poshcode.org/667"&gt;http://poshcode.org/667&lt;/a&gt; | &lt;a title="http://huddledmasses.org/powershell-speaks/" href="http://huddledmasses.org/powershell-speaks/"&gt;http://huddledmasses.org/powershell-speaks/&lt;/a&gt; ).&lt;/p&gt;

&lt;p&gt;So now you may want a way to play more notes and speak more words together, in a pithy line. you can just use play-notes&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Play-Notes&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
{ 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$defaultduration&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-is&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) {&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$defaultduration&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;]} 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-lt&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;.length;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 {    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$duration&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$defaultduration&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-lt&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;.length&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-is&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) {&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$duration&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;] } } 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-is&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) { 
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;].startswith(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;!&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) { &lt;/span&gt;&lt;span style="color:#008080;"&gt;speak-words&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;].replace(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;!&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) } &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        { &lt;/span&gt;&lt;span style="color:#008080;"&gt;play-note&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$duration&lt;/span&gt;&lt;span style="color:#000000;"&gt; } 
        } 
 } 
} 
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And with this you can simply pass in a list of notes, which will be played with a default duration, unless you choose to specify a duration after the note.&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#008080;"&gt;play-notes&lt;/span&gt;&lt;span style="color:#000000;"&gt; A B C &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt; E &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; B &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;&lt;span style="color:#008080;"&gt;play-notes&lt;/span&gt;&lt;span style="color:#000000;"&gt; F5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; E5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; D5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; C5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; B5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; A5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; G &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; F5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; E5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; D5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; C5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; B5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; A5 &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; G &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;If you want to change the default duration to reduce the redundancy above, just put that number as the first parameter&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#008080;"&gt;play-notes&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; F5 E5 D5 C5 B5 A5 G &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; F5 E5 D5 C5 B5 A5 G &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;and finally if you want some speaking in there, just have your string start with an exclamation mark!&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#008080;"&gt;play-notes&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;!here we go now&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; Db5 Db Eb Gb Ab &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;C#&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;6&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;!YEAH&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;But of course most of the time you will have speaking, you’ll want it to say something you don’t know like a variable or the results of a formula.&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#008080;"&gt;play-notes&lt;/span&gt;&lt;span style="color:#000000;"&gt; A&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;!$([datetime]::now)&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; C&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#000000;"&gt;So you can get all these functions together at poshcode. ( &lt;a href="http://poshcode.org/835"&gt;Script&lt;/a&gt; | &lt;a href="http://poshcode.org/get/835"&gt;Download&lt;/a&gt; )&amp;#160; . We’ll time will tell if this will stay a habit of mine or be a fad. Additionally if you wanted to take this seriously you’d probably want to use something better than console.beep , maybe you’d use a full on MOD engine like &lt;a title="http://fmod.org/" href="http://fmod.org/"&gt;http://fmod.org/&lt;/a&gt; and having it running iringn a different process, and have a very cpu lightweight IPC going on, and different threads could play different channels, so between threads you could debug via Chords if you really have the ear for it.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;WARNING, NOT A CUBICLE FRIENDLY DEBUGGING TECHNIQUE WITHOUT HEADPHONES UNLESS YOU WANT YOUR COLLEGUES TO DEBUG YOU.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="color:#000000;"&gt;Enjoy,&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
&lt;span style="color:#000000;"&gt;Karl&lt;/span&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1447" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category></item><item><title>PowerSMUG – Syncronize folders on your machine with Smugmug.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/12/powersmug_2D00_syncronize_2D00_folders_2D00_on_2D00_your_2D00_machine_2D00_with_2D00_smugmug.aspx</link><pubDate>Tue, 13 Jan 2009 05:30:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1446</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1446</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/12/powersmug_2D00_syncronize_2D00_folders_2D00_on_2D00_your_2D00_machine_2D00_with_2D00_smugmug.aspx#comments</comments><description>&lt;p&gt;In ShellTools most of you were familiar with only Tobias Weltner and Myself, however behind the scenes was a critical cofounder – Eddie Hadjes. Below is a script Eddie wrote a few months back to synchronize data between your local folders and the excellent &lt;a href="http://smugmug.com/"&gt;SmugMug&lt;/a&gt; web album service. You can always get the latest version and info on our &lt;a href="http://shelltools.wik.is/Other_Projects/PowerSmug"&gt;wiki&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Script @ PoshCode: &lt;a href="http://poshcode.org/796"&gt;View Script&lt;/a&gt; | &lt;a href="http://poshcode.org/get/796"&gt;Download&lt;/a&gt;&lt;/p&gt; function fbs_click() {u=location.href;t=document.title;window.open(\&amp;#39;http://www.facebook.com/sharer.php?u=\&amp;#39;+encodeURIComponent(u)+\&amp;#39;&amp;amp;t=\&amp;#39;+encodeURIComponent(t),\&amp;#39;sharer\&amp;#39;,\&amp;#39;toolbar=0,status=0,width=626,height=436\&amp;#39;);return false;}  &lt;p&gt;&lt;a class="fb_share_link" href="http://www.facebook.com/share.php?u=&amp;lt;url&amp;gt;" target="_blank"&gt;&amp;quot; target=_blank&amp;gt;&amp;quot; target=_blank&amp;gt;Share on Facebook&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;----&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; PowerSmug photo sync script v1.0&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; This PowerShell script will syncronize a folder of images with a users SmugMug account&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Please set the appropriate variables in the User Defined Variables region&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; For more information visit &lt;/span&gt;&lt;span style="color:#008000;text-decoration:underline;"&gt;http://shelltools.wik.is/Other_Projects/PowerSmug&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Images are uploaded to a gallery with the same name as the folder they are contained in.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; All folders below the Photo Directory path and the images they contain will be uploaded to SmugMug&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Folders that end in _ are ignored, so if you don&amp;#39;t want to sync a folder with SmugMug, just add an underscore at the end&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Copyright 2008 Shell Tools, LLC&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#Region&lt;/span&gt;&lt;span style="color:#000000;"&gt; User Defined Variables&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ApiKey&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;uVUvCbXP3f6MgO9wIRJn21YCIgEidVly&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$EmailAddress&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;[SmugMug Email]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$Password&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;[SmugMug Password]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$PhotoDirectory&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;[Path To Photos]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filesToInclude&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;*.jpg&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;*.png&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;*.tif&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;*.cr2&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$worldSearchable&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smugSearchable&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Professional Accounts Only&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$watermark&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$watermarkId&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;Email Variables&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpServer&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;[SMTP Server]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpUser&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;[SMTP User]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpPassword&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;[SMTP Password]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpFrom&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;PowerSmug@shelltools.net&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#EndRegion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#Region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Global Variables&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$baseUrl&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;http://api.smugmug.com/hack/rest/1.2.0/&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$userAgent&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;PowerSmug v1.0&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$logFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;PowerSmug.log&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:startStringState&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:valueState&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:arrayState&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:saveArrayState&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFileDirty&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @()
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:albumList&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:imageList&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#EndRegion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Helper Functions&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendEmail([&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$to&lt;/span&gt;&lt;span style="color:#000000;"&gt;, [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$subject&lt;/span&gt;&lt;span style="color:#000000;"&gt;, [&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$msg&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpMail&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;new-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Net.Mail.SmtpClient &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpServer&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpMail&lt;/span&gt;&lt;span style="color:#000000;"&gt;.DeliveryMethod &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.Net.Mail.SmtpDeliveryMethod]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Network&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpMail&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Credentials &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;new-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Net.NetworkCredential &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpUser&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpPassword&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpMail&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Send(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smtpFrom&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$to&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$subject&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$msg&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Get-MD5&lt;/span&gt;&lt;span style="color:#000000;"&gt;([System.IO.FileInfo] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$&lt;/span&gt;&lt;span style="color:#000000;"&gt;(Throw &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Usage: Get-MD5 [System.IO.FileInfo]&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
{
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; This Get-MD5 function sourced from:&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#008000;text-decoration:underline;"&gt;http://blogs.msdn.com/powershell/archive/2006/04/25/583225.aspx&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$cryptoServiceProvider&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.Security.Cryptography.MD5CryptoServiceProvider];
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hashAlgorithm&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;new-object&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$cryptoServiceProvider&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.OpenRead();
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hashByteArray&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hashAlgorithm&lt;/span&gt;&lt;span style="color:#000000;"&gt;.ComputeHash(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Close();

    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;# We have to be sure that we close the file stream if any exceptions are thrown.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    trap
    {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Close(); }
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    }

    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Convert the MD5 hash to Hex&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hashByteArray&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$result&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.ToString(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X2&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$result&lt;/span&gt;&lt;span style="color:#000000;"&gt;
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendWebRequest([&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$method&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$queryParams&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ssl&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$baseUrl&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ssl&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Replace(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;http&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;https&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;?method=$method&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$key&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$queryParams&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Keys) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;amp;$key=&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$queryParams&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$key&lt;/span&gt;&lt;span style="color:#000000;"&gt;]
    }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;New-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Net.WebClient

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;user-agent&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$userAgent&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    [xml]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.DownloadString(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

    CheckResponseForError &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rsp
}

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; Adds image information to our data file&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; AddFile ([System.IO.FileInfo]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smugId&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { 

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Select-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name, SmugId, LastModifiedTime;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SmugId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smugId&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastModifiedTime &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastWriteTimeUtc.ToString()

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;    $script:datFileDirty = $true&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;we are now saving the file after each upload to prevent duplicates when there is a failure&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    AppendDataFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$datFilePath&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;
}

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; writes the data file to the local directory&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; each directory will have a data file with information for images contained in it&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; SaveDataFile(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$clearFile&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFileDirty&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @(); &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; }

    [System.IO.File]::Delete(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$sortedFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;sort-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;property&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$sortedFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Export-Csv&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt; 

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFileDirty&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; mark the file as hidden&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    ls &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Attributes &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Attributes &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-bor&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.IO.FileAttributes]::Hidden }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$clearFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; clear the variable&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @()
    }
}

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; appends a new row to the data file&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; AppendDataFile(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$record&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#008080;"&gt;test-Path&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$datFilePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$newLine&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::Format(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;{0},{1},&amp;quot;{2}&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SmugId, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastModifiedTime)
        &lt;/span&gt;&lt;span style="color:#008080;"&gt;Add-Content&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$newLine&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFileDirty&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        SaveDataFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filePath&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }
}

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; ensure our web request was successful&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; CheckResponseForError(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$xmlResponse&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$xmlResponse&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rsp.stat &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;fail&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)    {
        throw &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rsp.err.msg
    }
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Login/Logout&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; Login()
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @{APIKey&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ApiKey&lt;/span&gt;&lt;span style="color:#000000;"&gt;;EmailAddress&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$EmailAddress&lt;/span&gt;&lt;span style="color:#000000;"&gt;;Password&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$Password&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$loginResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendWebRequest &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;smugmug.login.withPassword&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$loginResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.stat &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ok&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$loginResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Login.Session.id
    }
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
        Throw &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Error on login: &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$loginResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Message
    }
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; Logout()
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @{SessionID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$logoutResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendWebRequest &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;smugmug.logout&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt;
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Images&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; this method is only needed if we cannot find the PowerSmug.dat file.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
#&lt;/span&gt;&lt;span style="color:#008000;"&gt; preventing us from uploading duplicate images&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetImage(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    Login 

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$image&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:imageList&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Images &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Where-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FileName &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt; }
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$image&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$image&lt;/span&gt;&lt;span style="color:#000000;"&gt; }

    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; we are using heavy because we need the file name&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @{SessionID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt;;AlbumID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt;.id;Heavy&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;AlbumKey&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Key}
    [xml]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:imageList&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendWebRequest &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;smugmug.images.get&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:imageList&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Images.Image &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Where-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FileName &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt; }
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; UploadFile(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$albumName&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetAlbum &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$albumName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; $image = GetImage $file.Name $album    &lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; if ($image -ne $null) { return $image.id }&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;http://upload.smugmug.com/&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;New-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Net.WebClient

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hash&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Get-MD5&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;user-agent&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$userAgent&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ContentMd5&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hash&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-FileName&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-AlbumID&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt;.id)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-SessionID&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-Version&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;1.2.0&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-ResponseType&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;REST&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.UploadFile(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;PUT&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName)
    [xml]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.Text.Encoding]::ASCII.GetString(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

    CheckResponseForError &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rsp.Image.id
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; UploadExistingFile(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$id&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    Login 

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;http://upload.smugmug.com/&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;New-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Net.WebClient

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hash&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Get-MD5&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;user-agent&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$userAgent&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ContentMd5&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$hash&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-FileName&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-ImageID&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$id&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-SessionID&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-Version&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;1.2.0&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Headers.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;X-Smug-ResponseType&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;REST&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$wc&lt;/span&gt;&lt;span style="color:#000000;"&gt;.UploadFile(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;PUT&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName)

    [xml]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.Text.Encoding]::ASCII.GetString(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;)

    CheckResponseForError &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$webResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rsp
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Album&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetAlbumList(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$forceRefresh&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
    Login

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$forceRefresh&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:albumList&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; }
    }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @{SessionID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:albumList&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendWebRequest &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;smugmug.albums.get&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt;
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetAlbum(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;before we create an album ensure it doesn&amp;#39;t already exist&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    GetAlbumList

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:albumList&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Albums.Album &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Where-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Title &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt; }
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$album&lt;/span&gt;&lt;span style="color:#000000;"&gt; } 

    &lt;/span&gt;&lt;span style="color:#008080;"&gt;Write-Host&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Creating album: $name&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; @{SessionID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:SessionId&lt;/span&gt;&lt;span style="color:#000000;"&gt;;Title&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;;CategoryID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;Public&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    X2Larges&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;X3Larges&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;Originals&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;Watermarking&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$watermark&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
    WatermarkID&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$watermarkId&lt;/span&gt;&lt;span style="color:#000000;"&gt;;WorldSearchable&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$worldSearchable&lt;/span&gt;&lt;span style="color:#000000;"&gt;;SmugSearchable&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$smugSearchable&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$result&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendWebRequest &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;smugmug.albums.create&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ht&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; be sure we refresh the album list after creation&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    GetAlbumList &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$result&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Album
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Process File&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessFile([System.IO.FileInfo]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$albumName&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$photoObject&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Where-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Name }

    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$photoObject&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$photoObject&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastModifiedTime &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-ne&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastWriteTimeUtc.ToString()) {
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; file has been modified, so re-upload the file&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008080;"&gt;write-Host&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Updating existing file: &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName
            UploadExistingFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$photoObject&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SmugId
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$photoObject&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastModifiedTime &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.LastWriteTimeUtc.ToString()

            &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; mark the dat file as dirty so it will be saved after processing this folder&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFileDirty&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }
    }
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
        &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;file doesn&amp;#39;t exist in local file, upload to SmugMug&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008080;"&gt;write-Host&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Uploading new file: &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$id&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; UploadFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$albumName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        AddFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$id&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }
}

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color:#000000;"&gt; Main Script&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; this section will look through all sub-directories of $PhotoDirectory and upload the images to SmugMug&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;recurse&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$PhotoDirectory&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Where-Object&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Attributes &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-band&lt;/span&gt;&lt;span style="color:#000000;"&gt; [System.IO.FileAttributes]::Directory } &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
    &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; don&amp;#39;t process folders that end in _&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName.EndsWith(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;_&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-eq&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$datFilePath&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;\PowerSmug.dat&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#008080;"&gt;test-Path&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$datFilePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; casting as array to ensure we have an array returned&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            [array]&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:datFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;import-Csv&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$datFilePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }

        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$albumName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName.Remove(&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$PhotoDirectory&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length).Trim(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;\&amp;#39;)&lt;/span&gt;&lt;span style="color:#000080;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$path&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FullName &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;\*&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;get-ChildItem&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$path&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;include&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$filesToInclude&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
            ProcessFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$file&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$albumName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }
        SaveDataFile &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$datFilePath&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$script:imageList&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }
}

Logout

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$date&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Get-Date&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;Write-Host&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Script Completed: $date&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

trap [Exception] {
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$date&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;Get-Date&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$Msg&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$date&lt;/span&gt;&lt;span style="color:#000000;"&gt;.ToString() &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt; ; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Exception.GetType().FullName &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt; ; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Exception.Message
        &lt;/span&gt;&lt;span style="color:#008080;"&gt;Add-Content&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$logFile&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$Msg&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        SendEmail &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$EmailAddress&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;PowerSmug Error&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$Msg&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }

&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;-----&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1446" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category></item><item><title>PowerShell Analyzer Refresh for PSV2 + CTP3 advanced function features.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/08/powershell_2D00_analyzer_2D00_refresh_2D00_for_2D00_psv2_2D00_ctp3_2D00_advanced_2D00_function_2D00_features.aspx</link><pubDate>Fri, 09 Jan 2009 05:28:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1445</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1445</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/08/powershell_2D00_analyzer_2D00_refresh_2D00_for_2D00_psv2_2D00_ctp3_2D00_advanced_2D00_function_2D00_features.aspx#comments</comments><description>&lt;p&gt;Though we don’t have intentions to carry developing PowerShell Analyzer much in the future, there are a number of improvements in my personal fork, and we want to make sure that it keeps its shelf life by updating it for PowerShell V2. Surprisingly we are still getting hundreds of downloads a day so we want to make sure that those who prefer PSA can still keep using it and also take advantage of the features I use day in and day out. We’ll probably release some new builds within the next couple of weeks, but will post some screenshots and maybe videos until then. We hope that will minimal effort keep PSA the best free PowerShell tool. However if want a tool that is definitely worth paying for check out PowerShell Plus at its new home at Idera - &lt;a title="http://www.idera.com/Products/PowerShell/" href="http://www.idera.com/Products/PowerShell/"&gt;http://www.idera.com/Products/PowerShell/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So here is a screenshot of PowerShell Analyzer running with PowerShell V2 CTP3. The new features are all related to the help features of advanced Functions.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Region support for multiline comments &amp;lt;# #&amp;gt; &lt;/li&gt;    &lt;li&gt;Syntax Coloring for help documenting keywords (i.e.&amp;#160; .DESCRIPTION ) &lt;/li&gt;    &lt;li&gt;Code Completion for help documenting keywords. &lt;/li&gt;    &lt;li&gt;Rich Rendering of advanced function help from get-help in HTML (any advanced function that is in the RunSpace) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/karl-prosser/1712842_5F00_6FAA1397.png"&gt;&lt;img title="1712842" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="784" alt="1712842" src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/karl-prosser/1712842_5F00_thumb_5F00_45EE4AB7.png" width="673" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So there. you go. However the help rendering is only in our really old 3 year old Help rendering engine. If you like it wait for our HelpFusion app which will be separate and be able to be used independently or from any PowerShell host. Some of you have seen it, but the rest of you will have to wait until we finish rewriting it for WPF.&lt;/p&gt;  &lt;p&gt;Karl&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1445" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/PowerShell+Analyzer/default.aspx">PowerShell Analyzer</category></item><item><title>This is your Admin life. You HAVE to script PowerShell</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/06/this_2D00_is_2D00_your_2D00_admin_2D00_life_2D00_you_2D00_have_2D00_to_2D00_script_2D00_powershell.aspx</link><pubDate>Wed, 07 Jan 2009 05:27:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1444</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1444</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/06/this_2D00_is_2D00_your_2D00_admin_2D00_life_2D00_you_2D00_have_2D00_to_2D00_script_2D00_powershell.aspx#comments</comments><description>&lt;p&gt;So i was listening to that Dust Brother’s Tyler Durden song from fight club, and PowerShell lyrics started jumping into my head. We’ll most were fleeting before i could capture them, but i did come up with something at least tacky, and fun to some. No offense to anybody. Anyway here is the original song. Listen to it once to get the picture, then a second time while reading my lyrics. Here is a link to the original &lt;a href="http://www.songmeanings.net/songs/view/65307/"&gt;lyrics&lt;/a&gt;.&lt;/p&gt;  &lt;p style="visibility:visible;margin-left:auto;width:450px;margin-right:auto;text-align:center;"&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.musicplaylist.us"&gt;&lt;img src="http://www.musicplaylist.us/mc/images/create_blue.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://www.musicplaylist.us/standalone/56640282" target="_blank"&gt;&lt;img src="http://www.musicplaylist.us/mc/images/launch_blue.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://www.musicplaylist.us/download/56640282"&gt;&lt;img src="http://www.musicplaylist.us/mc/images/get_blue.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;This is your Admin Life&lt;/h2&gt;  &lt;p&gt;And you open the door and you step inside    &lt;br /&gt;We&amp;#39;re inside our servers&lt;/p&gt;  &lt;p&gt;Now imagine that that Blue Screen is a white ball of healing light    &lt;br /&gt;That&amp;#39;s right, that exception itself is a white ball of healing light&lt;/p&gt;  &lt;p&gt;I don&amp;#39;t think so&lt;/p&gt;  &lt;p&gt;This is your job , Good to the last cpu cycle.    &lt;br /&gt;It doesn&amp;#39;t get any better than this.     &lt;br /&gt;This is your job and its ending one click at a time.&lt;/p&gt;  &lt;p&gt;This isn&amp;#39;t your favourite tech conference. This isn&amp;#39;t no geek class.    &lt;br /&gt;Where you are now, you can&amp;#39;t even imagine what the bottom will be like     &lt;br /&gt;Only after disaster, will your server need resurrected.     &lt;br /&gt;Its only after you&amp;#39;ve lost everything that you&amp;#39;ll learn to script anything.     &lt;br /&gt;Nothing is static, everything is Dynamic     &lt;br /&gt;Without no agile script, it&amp;#39;s all falling apart.&lt;/p&gt;  &lt;p&gt;This is your job.    &lt;br /&gt;&lt;em&gt;(Without PowerShell)&lt;/em&gt;     &lt;br /&gt;It doesn&amp;#39;t get any better than this.     &lt;br /&gt;This is your job     &lt;br /&gt;And its ending one click at a time.&lt;/p&gt;  &lt;p&gt;You are not a beautiful and unique engineer.    &lt;br /&gt;You are the same decaying GUI based admin&amp;#160; as everybody else.     &lt;br /&gt;We are all part of the same time consuming life draining Slavehood     &lt;br /&gt;We are the all cringing,ever working info-saviours of the world&lt;/p&gt;  &lt;p&gt;You are not your dollarstore tech certification.    &lt;br /&gt;You are not your Antivirus failure.     &lt;br /&gt;You are not your dumbed down GUI management tools.&lt;/p&gt;  &lt;p&gt;You are not your HR employee primary key    &lt;br /&gt;You are not your Active Directory login.     &lt;br /&gt;You are not your CIO&amp;#39;s latest tech fad.     &lt;br /&gt;You are not your hungover 70&amp;#39;s unix shell script.&lt;/p&gt;  &lt;p&gt;You have to Code PowerShell.    &lt;br /&gt;You have to Code PowerShell.&lt;/p&gt;  &lt;p&gt;You have to realize that someday GUI admins will be unemployed    &lt;br /&gt;Until you know that, you are useless.&lt;/p&gt;  &lt;p&gt;I say never let me be GUI dependant    &lt;br /&gt;I say may I never be content.     &lt;br /&gt;I say deliver me from MMC console ripoffs.     &lt;br /&gt;I say deliver me from VBscript.     &lt;br /&gt;I say deliver me from misunderestimating linux zealots.     &lt;br /&gt;I say you have to PowerShell     &lt;br /&gt;I saw grow, and let the scripts run where they may&lt;/p&gt;  &lt;p&gt;This is your job.    &lt;br /&gt;&lt;em&gt;(Without PowerShell)&lt;/em&gt;     &lt;br /&gt;It doesn&amp;#39;t get any better than this.     &lt;br /&gt;This is your job     &lt;br /&gt;And its ending one click at a time.&lt;/p&gt;  &lt;p&gt;You have to Code PowerShell    &lt;br /&gt;You have to Code PowerShell&lt;/p&gt;  &lt;p&gt;I want you to script me as hard as you can.    &lt;br /&gt;I want you to script me as hard as you can.&lt;/p&gt;  &lt;p&gt;Welcome to #powershell Club. If this is your first night, you have to code.&lt;/p&gt;  &lt;p&gt;Enjoy - Karl&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1444" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category></item><item><title>PowerShell Analyzer like execution hotkeys for PS CTP3 ISE.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/03/powershell_2D00_analayzer_2D00_like_2D00_execution_2D00_hotkeys_2D00_for_2D00_ps_2D00_ctp3_2D00_ise.aspx</link><pubDate>Sun, 04 Jan 2009 05:26:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1443</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1443</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2009/01/03/powershell_2D00_analayzer_2D00_like_2D00_execution_2D00_hotkeys_2D00_for_2D00_ps_2D00_ctp3_2D00_ise.aspx#comments</comments><description>&lt;p&gt;PowerShell CTP3 ISE - Integrated Scripting environment has inherited many ideas and features from PowerShell analyzer including multiple runspaces,editors, a smaller immediate input area and output pane, however it doesn’t have the output visualizers of PSA nor the super fast RTS like execution control of PSA.&lt;/p&gt;  &lt;p&gt;However Microsoft in their wisdom has made ISE rather extensible through the $PSISE variable, and many people already have added some very cool functionality to ISE through these.&lt;/p&gt;  &lt;p&gt;When I first demo’d what was then MSH analyzer to Microsoft back in the first few months of 2006, the feature that seemed to stand out the most to the team was the ability to select an area of code and just run that. Thankfully that level of execution control is now in ISE as F6, but I wanted more, so i’m going to share with you a script that build a few months ago to add a couple of features.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;F7 run the current physical line.&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;this basically will run the line where the caret current is at.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Real Time Strategy like control.. CTRL 1 , CTRL 2 etc&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This here allows you to use comments to create regions, then EXECUTE those regions with a simple hotkey. I use this extensively. Often i am working on building a function, so I edit the function, press Ctrl 1 to apply the function, then if that was successful, press Ctrl 2 , then maybe Ctrl 3 to run some tests to make sure my changes to the function are what i am expecting.&lt;/p&gt;  &lt;p&gt;This gives me a great AGILITY , putting what Jeffery Snover calls &lt;a href="http://www.microsoft.com/technet/scriptcenter/resources/interviews/snover.mspx"&gt;the Admin Development Model&lt;/a&gt; , but which is really &lt;a href="http://en.wikipedia.org/wiki/REPL"&gt;REPL(Repeat Evaluate, Print , Loop )&lt;/a&gt; rediscovered, on agile steroids.&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-caretline&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
{ 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-expression&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$&lt;/span&gt;&lt;span style="color:#000000;"&gt;([Regex]::Split(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CurrentOpenedFile.Editor.text,&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;`r`n&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; )[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CurrentOpenedFile.Editor.caretline&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;]) 
} 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CustomMenu.Submenus.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;Run single line&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, {&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-caretline&lt;/span&gt;&lt;span style="color:#000000;"&gt;} ,  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;f7&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-region&lt;/span&gt;&lt;span style="color:#000000;"&gt;([&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$num&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
{ 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ed&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CurrentOpenedFile.Editor 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [Regex]::Split(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$ed&lt;/span&gt;&lt;span style="color:#000000;"&gt;.text,&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;`r`n&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; ) 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundfirst&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundlast&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-le&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt;.length&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 { 
   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;].startswith(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;#region&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#008080;"&gt;and&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;].contains(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;@$num&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) 
   { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundfirst&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;} 
 } 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundfirst&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-gt&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 { 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundfirst&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-le&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt;.length&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
    { 
    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;].startswith(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;#endregion&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) ) 
   { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundlast&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$count&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;} 
    } 

 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundlast&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;-gt&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;-&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
   { 
     &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$torun&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
     &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$lines&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundfirst&lt;/span&gt;&lt;span style="color:#000000;"&gt;..&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$foundlast&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#000000;"&gt;|&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt; { &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$torun&lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;`r`n&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} 
     &lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-expression&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$torun&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
   } 
 } 

} 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CustomMenu.Submenus.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;run region 1&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, {&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-region&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; },  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ctrl+1&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CustomMenu.Submenus.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;run region 2&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, {&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-region&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt; },  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ctrl+2&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CustomMenu.Submenus.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;run region 3&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, {&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-region&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt; },  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ctrl+3&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CustomMenu.Submenus.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;run region 4&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, {&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-region&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt; },  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ctrl+4&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) 
 &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$psISE&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CustomMenu.Submenus.Add(&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000080;"&gt;run region 5&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, {&lt;/span&gt;&lt;span style="color:#008080;"&gt;invoke-region&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt; },  &lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000080;"&gt;ctrl+5&lt;/span&gt;&lt;span style="color:#000080;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Script @ PoshCode: &lt;a href="http://poshcode.org/776"&gt;View Script&lt;/a&gt; | &lt;a href="http://poshcode.org/get/776"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometime I&amp;#39;ll wrap all this up into a module, and add other PowerShell Analyzer-like functionality such as running the current PARAGRAPH. So often in an earlier PSA, and in SQL Query Analyzer, i’m highlighting again and again the SAME paragraph query and running it over and over again. Being able to just run the current paragraph saves that time.&lt;/p&gt;

&lt;p class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:51f724f8-080f-494c-9d52-aa7695a1af0f" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/powershell" rel="tag"&gt;powershell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/shelltools" rel="tag"&gt;shelltools&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ISE" rel="tag"&gt;ISE&lt;/a&gt;,&lt;a href="http://technorati.com/tags/powershell+analyzer" rel="tag"&gt;powershell analyzer&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1443" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/PSV2/default.aspx">PSV2</category></item><item><title>PowerShell Analyzer now 100% free.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2008/10/02/powershell_2D00_analyzer_2D00_now_2D00_100_2D00_free.aspx</link><pubDate>Fri, 03 Oct 2008 04:22:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1442</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1442</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2008/10/02/powershell_2D00_analyzer_2D00_now_2D00_100_2D00_free.aspx#comments</comments><description>&lt;p&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;With the phenomenal success of PowerShell Plus and subsequent transfer to Idera, PowerShell Analyzer is now 100% free. You can read more and get it from our recently updated website - &lt;a href="http://www.shelltools.net"&gt;http://www.shelltools.net &lt;/a&gt;. In coming weeks we are going to do some surveys to help decide where we want to go as a company with PowerShell IDEs.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Sincerely,&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Karl&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1442" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/ShellTools/default.aspx">ShellTools</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/PowerShell+Analyzer/default.aspx">PowerShell Analyzer</category></item><item><title>Portable Powershell - Part 2: Roll your own, plus a challenge</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2008/06/19/portable_2D00_powershell_2D00_part_2D00_2_2D00_roll_2D00_your_2D00_own_2D00_plus_2D00_a_2D00_challenge.aspx</link><pubDate>Fri, 20 Jun 2008 04:20:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1441</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1441</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2008/06/19/portable_2D00_powershell_2D00_part_2D00_2_2D00_roll_2D00_your_2D00_own_2D00_plus_2D00_a_2D00_challenge.aspx#comments</comments><description>&lt;p&gt;Todays Blog entry is going to cover the &lt;strong&gt;HOW &lt;/strong&gt;of how I put together my demos of Portable PowerShell. Tomorrow I&amp;#39;ll move back to clearly defining what I&amp;#39;d like to see from Microsoft. But before I get to the full details a little background:&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Background&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;So what&amp;#39;s stopping PowerShell or practically anything from being portable? dependence on a particular file structure and the registry. Basically the technique I&amp;#160; &amp;quot;HOOK&amp;quot; apis so that whenever the process tries to call certain APIs (the filesystem and registry ones) the code in memory is changed to jump to custom code instead of the address of the DLL function export where DLL has been loaded. From there custom checks are done to see if its a file or registry setting to do with PowerShell, and if so the code delivers it up, as if it were there, even though its not.&lt;/p&gt;  &lt;p&gt;This is a technique that as a programmer I have been doing for a long time. It involves a lot of assembler, historically being able to inject a DLL into a process and in memory rewrite the code, but it works great. The first time I worked out this technique as a programmer was back in the days of windows 95 which wasn&amp;#39;t unicode. I made an application that could enable Chinese and Japanese characters on english windows. Effectively I hooked the &lt;a href="http://msdn.microsoft.com/en-us/library/ms534019.aspx"&gt;TextOut&lt;/a&gt; API, and if it was a process that had been chosen to say display in Japanese, and the font chosen was one that was chosen for this purpose then I custom drew the Japanese or Chinese Glyph otherwise I just called the real &lt;a href="http://msdn.microsoft.com/en-us/library/ms534019.aspx"&gt;TextOut&lt;/a&gt; API call. Another technique when working on &lt;a href="http://www.visualjockey.com/"&gt;VisualJockey&lt;/a&gt; many years ago, I wanted to be able to pipe the output on a standalone graphics program into &lt;a href="http://www.visualjockey.com"&gt;VisualJockey&lt;/a&gt; so we could do some video processing on it. The problem is that app drew to fullscreen directX itself, so I had to &amp;quot;hook&amp;quot; the directX apis, so that when it created the surface it didn&amp;#39;t make it fullscreen, and when it rendered it rendered to Texture instead of screen, and then some extra code to retrieve what it had rendered. Another Situation was changing a DB backend of an application without the Applications source, *simply* by hooking the ODBC apis (where we also could discover the password used). Another thing I used this technique for was to add some functionality to abandoned freeware that had no source code.&lt;/p&gt;  &lt;p&gt;Fast forward to about 2002, &lt;a href="http://josua.hoengermedia.ch/index.htm"&gt;Josua Honger&lt;/a&gt; , the main architect of &lt;a href="http://www.visualjockey.com/"&gt;VisualJockey&lt;/a&gt;, and also the &lt;a href="http://www.green-hippo.com/"&gt;Hippotiser&lt;/a&gt; (I could talk a week just about these amazing programs, the Hippotiser has gone on to become a huge sensation powering realtime effects for live T.V, large concerts, events like the nobel peace prize, broadway shows, and the worlds largest audiovisual setup- Love by Cirque de Soliel in Las Vegas)&amp;#160; were wanting to use the engine of &lt;a href="http://www.visualjockey.com"&gt;VisualJockey&lt;/a&gt; to make a &lt;a href="http://en.wikipedia.org/wiki/Demoscene"&gt;demoscene demo&lt;/a&gt; , without the copy protection , and in a portable manner (Demoscene demos aren&amp;#39;t allowed to install anything), and on top of that not scare the Green Hippo (who recently purchased the VisualJockey engine and didn&amp;#39;t want to risk it getting out and reused). We didn&amp;#39;t have time to roll our own solution so we found a rather recent product called &lt;a href="http://www.thinstall.com"&gt;Thinstal&lt;/a&gt;l. &lt;a href="http://www.thinstall.com"&gt;Thinstall&lt;/a&gt; used the techniques mentioned about, but it stored all the files you choose in its own encrypted virtual file system inside one file - Just what we were needing. &lt;a href="http://www.thinstall.com"&gt;Thinstall&lt;/a&gt; in those days also was cheap enough for us, even though it was a hobby project, but as a young product it didn&amp;#39;t quite work fully with our VisualJockey because we used some interesting techniques anyhow, but I did gain a lot of respect for it, and for its author Jonathan Clark. Over the years I&amp;#39;ve played with it a few times for some hobby projects , but the cost went up and up and I couldn&amp;#39;t justify using it.&lt;/p&gt;  &lt;p&gt;Fast forward to 2008, the complexities and risks of deploying and configuring applications have become a real pain point for many corporations and an abundance of solutions have tried solving this. &lt;a href="http://www.thinstall.com"&gt;Thinstall&lt;/a&gt; evolved its PR to target this market - and named it Application Virtualization, and most recently got acquired by VMWARE. (and renamed ThinApp) So now that there was a great beta to try. the scary thing is HOW EASY THIS WAS. I expected that I would have to spend many hours manually tweaking what to include/exclude - setting up the behaviour of the registry virtualization, but I had something done in 20 minutes, pretty much just following a few instructions. and Click next / next /next&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;HOW HOW HOW HOW HOW HOW HOW HOW&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So I wanted to make 4 different versions of Portable Powershell&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Powershell V1 (just powershell, don&amp;#39;t include dotnet 2.0 - thus dotnet 2.0 is needed to be installed on a machine for it to work) &lt;/li&gt;    &lt;li&gt;Powershell V2 CTP2 (just powershell, don&amp;#39;t include dotnet 2.0 - thus dotnet 2.0 is needed to be installed on a machine for it to work) &lt;/li&gt;    &lt;li&gt;PowerShell V1 (include the who dotnet 2.0 so it can run even where dotnet isn&amp;#39;t) &lt;/li&gt;    &lt;li&gt;PowerShell V1 (include the who dotnet 2.0 so it can run even where dotnet isn&amp;#39;t) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The Key this is to have a Fresh OS to start from, so that you don&amp;#39;t miss any important files , and don&amp;#39;t get rubbish either, so the place to build this is most definately in a VM.&lt;/p&gt;  &lt;p&gt;So what did i do?&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Predownloaded what was needed      &lt;ol&gt;       &lt;li&gt;XP SP2 install CD &lt;/li&gt;        &lt;li&gt;VMWARE THINAPP BETA (plus free beta key) &lt;/li&gt;        &lt;li&gt;DOTNET 2.0 redistributable &lt;/li&gt;        &lt;li&gt;Powershell V1 for XP installer &lt;/li&gt;        &lt;li&gt;Powershell V2 CTP2 installer &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Setup the OS in a VM. &lt;/li&gt;    &lt;li&gt;Installed ThinAPP &lt;/li&gt;    &lt;li&gt;Made a snapshot of the VM &lt;/li&gt;    &lt;li&gt;started the thinapp process &lt;/li&gt;    &lt;li&gt;Installed dotnet 2.0 &lt;/li&gt;    &lt;li&gt;Installed PowerShell V2CTP2 &lt;/li&gt;    &lt;li&gt;Copied over PowerShell Analyzer &lt;/li&gt;    &lt;li&gt;Completed the thinapp process , and build the Portable EXE for my V2 with dotnet Portable Powershell &lt;/li&gt;    &lt;li&gt;Copied my portable powerShell off the VM &lt;/li&gt;    &lt;li&gt;Reverted the snapshot &lt;/li&gt;    &lt;li&gt;Repeated the process but for PowerShell V1 &lt;/li&gt;    &lt;li&gt;Reverted the snapshot &lt;/li&gt;    &lt;li&gt;Installed dotnet 2.0 &lt;/li&gt;    &lt;li&gt;Made a new snapshot &lt;/li&gt;    &lt;li&gt;repeated the process but just installing Powershell V1 (to make a smaller less heavy portable powershell that didn&amp;#39;t contain dotnet 2.0) &lt;/li&gt;    &lt;li&gt;reverted and repeated the process for Powershell V2 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;There there you have it, 4 different flavors on a Portable Powershell made in just a few hours. I can&amp;#39;t give them enough praise for how far Thinstall has come and how easy the process was.&lt;/p&gt;  &lt;p&gt;Are there any other options?&lt;/p&gt;  &lt;p&gt;Definately! Thinstall is not the sole player in this now &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Application_virtualization"&gt;application virtualization&lt;/a&gt;&amp;quot; arena. The management , configuration and deployment has been bundled into apps and called &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Application_streaming"&gt;Application Streaming&lt;/a&gt;&amp;quot;. Citrix added Application Streaming, Symantec has Altiris, and Microsoft bought out SoftGrid. The &amp;quot;streaming techniques aren&amp;#39;t typically really portable since they have some sort of agent or client/server architecture but the interesting one in this mix is software, Which i think is now renamed &lt;strong&gt;Microsoft Application Virtualization or APP-V for short. You can read their &lt;/strong&gt;&lt;a href="http://blogs.technet.com/softgrid/default.aspx"&gt;&lt;strong&gt;blog here&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;. Actually the release candidate was just released &lt;/strong&gt;&lt;a href="http://blogs.technet.com/softgrid/archive/2008/06/17/microsoft-application-virtualization-4-5-release-candidate-is-now-available.aspx"&gt;&lt;strong&gt;YESTERDAY&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;With thinstall, I&amp;#39;m interesting what the pricing is going to be under VMWARE. When its in beta its definitely financially feasible for me to have my own personal portable powershell for personal use, but that&amp;#39;s probably not the case post RTM.&lt;/p&gt;  &lt;p&gt;I didn&amp;#39;t have time to play with APP-V yet. &lt;strong&gt;SO MUCH CHALLENGE IS WILL SOMEBODY TRY TO VIRTUALIZE POWERSHELL WITH APP-V AND TELL US HOW IT GOES&lt;/strong&gt;. I presume Microsoft will be more likely to allow redistribution of PowerShell through one of their own technologies ;)&lt;/p&gt;  &lt;p&gt;Another cheap option I would challenge somebody is to try it in &lt;a href="http://sandboxie.com/"&gt;sandboxie&lt;/a&gt; , see if &lt;a href="http://sandboxie.com/"&gt;sandboxie&lt;/a&gt; is up to the job, as its very cheap, but i don&amp;#39;t know if it does full &amp;quot;portable&amp;quot;&lt;/p&gt;  &lt;p&gt;Finally there is another way, that I might implement, and that is roll my own. I wouldn&amp;#39;t include the dotnet framework in this one (just too much work), but I can whip up a DLL in C++ and Assembler in no time to take care of powershell&amp;#39;s filesystem and registry needs. Of course I couldn&amp;#39;t redistribute portable PowerShell but I could make it into a small PORTABLEPOWERSHELLBUILDER.EXE app, that has a button that will build a portable PowerShell for you on any computer that has PowerShell installed in a similar manner to how &lt;a href="http://www.nu2.nu/pebuilder/"&gt;BartPE&lt;/a&gt; or &lt;a href="http://reatogo.de/REATOGO.htm"&gt;ReatogoXPE&lt;/a&gt; can build a bootable XP CD based on the files on a particular OS install.&lt;/p&gt;  &lt;p&gt;Apart from the challenge of doing that, and doing some fun techniques that I&amp;#39;ve almost forgotten, and as a PowerShell tool vendor and partner of MS, I don&amp;#39;t want to do that. I want MS to allow PowerShell to be redistributed, in a portable manner, and if they can fit it into their schedule, do some minor reachitecture of PowerShell V2 to be naturally portable, but more on that in my next blog post.&lt;/p&gt;  &lt;p&gt;Over and Out,&lt;/p&gt;  &lt;p&gt;Karl Prosser / ShellTools&lt;/p&gt;  &lt;p class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2b245c1f-8d9a-4862-bb44-36213b32899a" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/portable%20PowerShell" rel="tag"&gt;portable PowerShell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/powershell" rel="tag"&gt;powershell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/shelltools" rel="tag"&gt;shelltools&lt;/a&gt;,&lt;a href="http://technorati.com/tags/thinapp" rel="tag"&gt;thinapp&lt;/a&gt;,&lt;a href="http://technorati.com/tags/app-v" rel="tag"&gt;app-v&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1441" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/bare+metal/default.aspx">bare metal</category></item><item><title>Portable PowerShell - v1 and v2 side by side - even on Server Core.</title><link>http://powershell.com/cs/blogs/karl-prosser/archive/2008/06/18/portable_2D00_powershell_2D00_v1_2D00_and_2D00_v2_2D00_side_2D00_by_2D00_side_2D00_even_2D00_on_2D00_server_2D00_core.aspx</link><pubDate>Thu, 19 Jun 2008 04:19:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1440</guid><dc:creator>Karl Prosser</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/karl-prosser/rsscomments.aspx?PostID=1440</wfw:commentRss><comments>http://powershell.com/cs/blogs/karl-prosser/archive/2008/06/18/portable_2D00_powershell_2D00_v1_2D00_and_2D00_v2_2D00_side_2D00_by_2D00_side_2D00_even_2D00_on_2D00_server_2D00_core.aspx#comments</comments><description>&lt;p&gt;18So I&amp;#39;ve loved portable apps from time memorial and have valued making my own apps as portable as possible - XCOPY friendly. I&amp;#39;ve valued this over some fancy installer. But what about PowerShell? Why can&amp;#39;t PowerShell be portable. Its the sort of tool that begs to be portable. Admins want a power tool, like powershell to be portable, to be able to be run on any computer without installing anything (changing ,even contaminating the state of the computer). Admins don&amp;#39;t want to have to worry about installing prerequisites such as dotnet 2.0 everywhere and neither do I. I want something that can be self contained , where I can run PowerShell v1 and v2 side by side if I choose, and as a builder of PowerShell hosts, I want to be able to embed, or distribute the PowerShell runtime along with my app, just like I can with a multitude of dotnet libraries and components.&lt;/p&gt;  &lt;p&gt;Well is this possible. Yes, I&amp;#39;ve done it. In this blog post I&amp;#39;ll show some screenshots and a video about it, and talk about the &lt;strong&gt;WHAT &lt;/strong&gt;and the &lt;strong&gt;WHY&lt;/strong&gt;, and try to whelm up some passion in the community to encourage Microsoft to allow the PowerShell engine to be redistributed freely, easily , and portably. I know that many people will ask me - Can I download this, and I have to say &lt;em&gt;NO&lt;/em&gt; - because we don&amp;#39;t have rights from MS to redistribute PowerShell, especially outside of its official packages, but the good news is that you can make this yourself, but I&amp;#39;m not going to tell you &lt;strong&gt;HOW&lt;/strong&gt; to until tomorrow, hoping that instead of running of to recreate your own personal PowerShell nirvana you might read the rest of my rant and join the movement for a Microsoft endorsed Portable PowerShell.&lt;/p&gt;  &lt;p&gt;But before we proceed here is a screenshot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://karlprosser.com/coder/wp-content/uploads/2008/06/servercore2.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="601" alt="servercore2" src="http://karlprosser.com/coder/wp-content/uploads/2008/06/servercore2-thumb.jpg" width="793" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This beauty shows Server Core Enterprise - you can verify this isn&amp;#39;t a trick &lt;a href="http://blogs.dirteam.com/blogs/sanderberkouwer/archive/2008/06/15/how-to-tell-whether-it-s-a-server-core-box.aspx"&gt;but is indeed server core&lt;/a&gt; by the operatingsystemSKU of 14 shown in the top window. (&lt;a href="http://msdn.microsoft.com/en-us/library/aa394239.aspx"&gt;MSDN reference.&lt;/a&gt; ) Server Core does not have dotnet 2.0 (a prerequisite of PowerShell) installed and &lt;a href="http://dmitrysotnikov.wordpress.com/2008/05/15/powershell-on-server-core/"&gt;we haven&amp;#39;t applied any cool hacks or Russian reverse engineering&lt;/a&gt;&amp;#160; to get it working therefore we haven&amp;#39;t compromised the secure state of our servercore by installing any untested potential lasting security hole on it. We purely XCOPY across our files, or we can even run it off a USB drive. Another great benefit you see here is on the same machine we are running PowerShell V1 and V2 side by side. How many of us have had to set up a whole new machine or VM just to play with V2 CTP!!!!! and how many cough*cough have installed v2 on a production machine when we should have for lack of patience in setting up a dedicated v2 test machine?&lt;/p&gt;  &lt;p&gt;So what are the features of this technique.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Fully Portable &lt;/li&gt;    &lt;li&gt;versions that presume dotnet 2.0s preexistence (about 3MB to 10MB) &lt;/li&gt;    &lt;li&gt;Versions that don&amp;#39;t need dotnet 2.0 at all (about 100MB) &lt;/li&gt;    &lt;li&gt;Can run V1 and V2 side by side. &lt;/li&gt;    &lt;li&gt;Can run on a machine with PowerShell already installed, and your portable version has its own execution-policy and other settings. &lt;/li&gt;    &lt;li&gt;Can be packaged with SnapIns (so the SnapIns are portable also, no need to install or register them). &lt;/li&gt;    &lt;li&gt;Can be used with a custom Host , so you can have a Portable &lt;a href="http://powershell.com"&gt;PowerShell Plus&lt;/a&gt; or &lt;a href="http://powershellanalyzer.com"&gt;PowerShell Analyzer.&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here is a 3 minute video showing Portable Powershell v1 and v2 and PowerShell Analyzer running side by side on a virgin XP SP2 box that doesn&amp;#39;t have dotnet 2.0 preinstalled.&lt;/p&gt;  &lt;p class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5e95055d-a592-48bb-9238-9d72349b123f" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;    &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.vimeo.com/1185791?pg=embed&amp;amp;sec=1185791"&gt;Portable PowerShell&lt;/a&gt; from &lt;a href="http://www.vimeo.com/klumsy?pg=embed&amp;amp;sec=1185791"&gt;karl prosser&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=1185791"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So now you are saying, GIVE THIS TO ME NOW. Sorry but I can&amp;#39;t but in my next blog entry within a couple of days I will tell you how you can roll your own Portable PowerShell.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Please leave a comment on this blog if you are in favor of Microsoft relaxing its redistributable rules when it comes to PowerShell.&lt;/strong&gt; Technically PowerShell doesn&amp;#39;t have much to stop it being Portable. Its fully dotnet, and although its installed in windows\system32 directory that is more a &amp;quot;political&amp;quot; feature , earlier betas would install elsewhere, and technically it wouldn&amp;#39;t be hard to make it a control in VS.NET that a custom host could merge into their project and be fully portable. There are many many possible use-cases for such portable uses&amp;#160; (both from the perspective of admins as well as developers creating PowerShell enabled and powered applications in the growing PowerShell ecosystem). If MS can&amp;#39;t make any changes technically to make it as easy as i suggest in V2, can they at least &lt;strong&gt;GIVE FULL REDISTRIBUTABLE RIGHTS FOR POWERSHELL&lt;/strong&gt; as they do things such as the SQL server client side report viewer control in VS.NET.&lt;/p&gt;  &lt;p&gt;All in favor say so in a comment!&lt;/p&gt;  &lt;p&gt;And come back for more in a day or two.&lt;/p&gt;  &lt;p&gt;Over and Out,&lt;/p&gt;  &lt;p&gt;Karl Prosser / ShellTools.&lt;/p&gt;  &lt;p class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c5c3050e-9890-49e5-8b16-4d80f46f55bb" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerShell" rel="tag"&gt;PowerShell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Portable%20PowerShell" rel="tag"&gt;Portable PowerShell&lt;/a&gt;,&lt;a href="http://technorati.com/tags/dotnet" rel="tag"&gt;dotnet&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Server%20core" rel="tag"&gt;Server core&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PowerShell%20Analyzer" rel="tag"&gt;PowerShell Analyzer&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1440" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/karl-prosser/archive/tags/powershell/default.aspx">powershell</category></item></channel></rss>