<?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>Dreaming in PowerShell</title><link>http://powershell.com/cs/blogs/tobias/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Downloading Images from Webpages</title><link>http://powershell.com/cs/blogs/tobias/archive/2010/03/17/downloading-images-from-webpages.aspx</link><pubDate>Wed, 17 Mar 2010 01:35:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:5037</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=5037</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2010/03/17/downloading-images-from-webpages.aspx#comments</comments><description>&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;In a training, recently a participant asked about an HTML parser to analyze and harvest data from web pages. Unfortunately, there is no .NET type for this so PowerShell can&amp;#39;t help. Or can it? Well, as it turns out, there is a HTML parser after all. Let&amp;#39;s create code that downloads all images from any web page you want!&lt;/span&gt;&lt;/p&gt;
&lt;h2 class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span style="mso-ansi-language:EN-US;"&gt;Accessing the IE Parser from PowerShell&lt;/span&gt;&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;A browser like Internet Explorer needs a way to analyze and display HTML code so it most certainly has a parser. To connect to the IE intrinsics, PowerShell can use a COM object named &amp;quot;&lt;strong&gt;InternetExplorer.Application&lt;/strong&gt;&amp;quot;. Here is how to load and display a web page:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-COMObject&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#8b4513;"&gt;&lt;span class="namespace"&gt;InternetExplorer.Application&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;visible&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$true&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Navigate&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;http://www.powershell.com&amp;#39;&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;While&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Busy&lt;/span&gt;&lt;/span&gt;) { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Start-Sleep&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Milliseconds&lt;/span&gt;&lt;/span&gt; 400 }&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Done!&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="pscode"&gt;&lt;span class="string"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;Note how I hold the script until the web page is completely loaded and displayed. That&amp;#39;s a good idea because when you want to access the document object model (DOM), you want to be sure the document has been fully loaded.&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;Next, you can use your IE-object to access the internal HTML document model through its &lt;strong&gt;Document&lt;/strong&gt; property. It provides access to all kinds of clever methods:&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Document&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Member&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;Finding Images (or Links)&lt;/h2&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 10pt;"&gt;One of the most useful methods is called &lt;strong&gt;getElementbyTagName()&lt;/strong&gt;. It returns all HTML elements with a given tag. To scrape all images from that web page, simply ask for all elements with a tag name of &lt;strong&gt;&amp;#39;img&amp;#39;&lt;/strong&gt; like this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;document.getElementsByTagName&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;/span&gt;)&lt;/div&gt;
&lt;p class="pscode"&gt;PowerShell will throw tons of &lt;strong&gt;img&lt;/strong&gt;-Objects at you. As it turns out, the image url is stored in its &lt;strong&gt;src&lt;/strong&gt; property, so to get all urls from all images, refine your line just a little bit:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;document.getElementsByTagName&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;/span&gt;) | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ExpandProperty&lt;/span&gt;&lt;/span&gt; src&lt;/div&gt;
&lt;p class="pscode"&gt;Likewise, to collect all links on that page, search for the tag &lt;strong&gt;&amp;quot;a&amp;quot;&lt;/strong&gt; and output its &lt;strong&gt;href&lt;/strong&gt; property:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;document.getElementsByTagName&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;/span&gt;) | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ExpandProperty&lt;/span&gt;&lt;/span&gt; href&lt;/div&gt;
&lt;h2 class="pscode"&gt;Downloading all Images on a Web Page&lt;/h2&gt;
&lt;p class="pscode"&gt;Our initial objective was to harvest all images from that web page. We already got the image urls. Next, I need a way to download them to my hard drive. &lt;/p&gt;
&lt;p class="pscode"&gt;While there are plenty of ways to download stuff using PowerShell, one of the more clever approaches uses the &lt;strong&gt;&amp;quot;Background Intelligent Transfer Service (BITS)&amp;quot;.&lt;/strong&gt; That&amp;#39;s smart because BITS knows how to download and is very robust. It is the same technology used by Windows Update.&amp;nbsp;Which raises the question how to get to BITS.&lt;/p&gt;
&lt;p class="pscode"&gt;If you are running Windows 7 or better, that&amp;#39;s easy because it comes with a &lt;strong&gt;module&lt;/strong&gt; called &amp;quot;&lt;strong&gt;BitsTransfer&lt;/strong&gt;&amp;quot;. It&amp;nbsp;also comes with PowerShell V2 updates I believe.&amp;nbsp;Simply import it and have a look at the arsenal of new cmdlets it provides:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Import-Module&lt;/span&gt;&lt;/span&gt; BitsTransfer&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Command&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Module&lt;/span&gt;&lt;/span&gt; BitsTransfer&lt;/div&gt;
&lt;div class="psoutput"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="psoutput"&gt;CommandType Name Definition&lt;br /&gt;----------- ---- ----------&lt;br /&gt;Cmdlet Add-BitsFile Add-BitsFile [-BitsJob] &amp;lt;BitsJ...&lt;br /&gt;Cmdlet Complete-BitsTransfer Complete-BitsTransfer [-BitsJo...&lt;br /&gt;Cmdlet Get-BitsTransfer Get-BitsTransfer [[-Name] &amp;lt;Str...&lt;br /&gt;Cmdlet Remove-BitsTransfer Remove-BitsTransfer [-BitsJob]...&lt;br /&gt;Cmdlet Resume-BitsTransfer Resume-BitsTransfer [-BitsJob]...&lt;br /&gt;Cmdlet Set-BitsTransfer Set-BitsTransfer [-BitsJob] &amp;lt;B...&lt;br /&gt;Cmdlet Start-BitsTransfer Start-BitsTransfer [-Source] &amp;lt;...&lt;br /&gt;Cmdlet Suspend-BitsTransfer Suspend-BitsTransfer [-BitsJob...&lt;/div&gt;
&lt;div class="psoutput"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;&amp;nbsp;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;
&lt;div class="pscode"&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;As it turns out, to download a file use &lt;strong&gt;Start-BitsTransfer&lt;/strong&gt; and provide the URL and a filename to store the downloaded file.&lt;/div&gt;
&lt;div class="pscode"&gt;&lt;/div&gt;
&lt;h2 class="pscode"&gt;The Solution: Get-WebPageImages &lt;/h2&gt;
&lt;p class="pscode"&gt;Here is a ready-to-use function called &lt;strong&gt;Get-WebPageImages. &lt;/strong&gt;It&amp;#39;s pretty small and efficient, like most PowerShell code:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-WebPageImages&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$url&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Import-Module&lt;/span&gt;&lt;/span&gt; BitsTransfer&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-not&lt;/span&gt;&lt;/span&gt; (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;/span&gt;)) { md &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-COMObject&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#8b4513;"&gt;&lt;span class="namespace"&gt;InternetExplorer.Application&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Navigate&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$url&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;while&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Busy&lt;/span&gt;&lt;/span&gt;) { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Start-Sleep&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Milliseconds&lt;/span&gt;&lt;/span&gt; 400 }&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$sources&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;document.getElementsByTagName&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;/span&gt;) | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ExpandProperty&lt;/span&gt;&lt;/span&gt; src &lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$destinations&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$sources&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;ForEach-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;$folder\$($_.Split(&amp;#39;/&amp;#39;)[-1])&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$displayname&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$url&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Split&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;/span&gt;)[&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-&lt;/span&gt;&lt;/span&gt;1]&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ie&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Quit&lt;/span&gt;&lt;/span&gt;()&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Start-BitsTransfer&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$sources&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$destinations&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Prio&lt;/span&gt;&lt;/span&gt; High &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Display&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$displayname&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;
&lt;p class="pscode"&gt;To start downloading the images, use it like this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-WebPageImages&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;http://www.powershell.com&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;c:\webimages&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p class="pscode"&gt;You will see a progressbar while the function downloads all images to your machine. Once done, all images are automatically moved into the folder you provided.&lt;/p&gt;
&lt;p class="pscode"&gt;To download images asynchronously, add the parameter &lt;strong&gt;-Async&lt;/strong&gt; to &lt;strong&gt;Start-BitsTransfer&lt;/strong&gt;. Downloading asynchronously occurs transparently in the background and is no longer bound to PowerShell. You can close PowerShell and even restart your machine. The download continues silently in the background. To check download progress, use this line:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-BitsTransfer&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; DisplayName, &lt;br /&gt;@{Name&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Progress&amp;#39;&lt;/span&gt;&lt;/span&gt;; Expression&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;{ &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;BytesTotal&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;*&lt;/span&gt;&lt;/span&gt; 100 &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;BytesTransferred&lt;/span&gt;&lt;/span&gt; }}, &lt;br /&gt;JobState&lt;/div&gt;
&lt;p class="pscode"&gt;Watch out, though: to &lt;em&gt;actually receive&lt;/em&gt; the files downloaded asynchronously, you need to manually complete the job once all files are transferred using&lt;strong&gt; Complete-BitsTransfer&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-BitsTransfer&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;JobState&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;transferred&amp;#39;&lt;/span&gt;&lt;/span&gt; } | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Complete-BitsTransfer&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2 class="pscode"&gt;Learning Points&lt;/h2&gt;
&lt;p class="pscode"&gt;Downloading images from a web page is fun, and so is PowerShell, but the &lt;em&gt;real&lt;/em&gt; learning&amp;nbsp;points here&amp;nbsp;are the&amp;nbsp;different ways how PowerShell techniques work like small building blocks and utilize all kinds of technology to solve the problem. &lt;/p&gt;
&lt;p class="pscode"&gt;I used an old COM object (IE automation interface) to&amp;nbsp;access and parse HTML and identify image&amp;nbsp;urls. I used the pipeline to get the information in shape. I used a PowerShell extension (BitsTransfer) to actually download the images to our machine.&lt;/p&gt;
&lt;p class="pscode"&gt;And guess what? That&amp;#39;s all&amp;nbsp;perfectly fine. PowerShell is pragmatic, and with PowerShell, anything can be used and tied together. That&amp;#39;s awesome. As a side effect, you used the BitsTransfer module quite a bit. It is a great solution for downloading (and uploading) files.&lt;/p&gt;
&lt;p class="pscode"&gt;Cheerio for today, and don&amp;#39;t forget to give &lt;a target="_blank" href="http://www.powershellplus.com"&gt;PowerShellPlus&lt;/a&gt; a try! It makes exploring and developing PowerShell code so much easier! &lt;br /&gt;Thanks for your support,&lt;/p&gt;
&lt;p class="pscode"&gt;Tobias&lt;br /&gt;&lt;em&gt;Microsoft MVP PowerShell&lt;br /&gt;PowerShellPlus Architect&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=5037" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/HTML/default.aspx">HTML</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/COMObject/default.aspx">COMObject</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/InternetExplorer.Application/default.aspx">InternetExplorer.Application</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/getElementsByTag/default.aspx">getElementsByTag</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Complete-BitsTransfer/default.aspx">Complete-BitsTransfer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Start-BitsTransfer/default.aspx">Start-BitsTransfer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/BitsTransfer/default.aspx">BitsTransfer</category></item><item><title>Are you using the correct PowerShell version?</title><link>http://powershell.com/cs/blogs/tobias/archive/2010/01/21/are-you-using-the-correct-powershell-version.aspx</link><pubDate>Wed, 20 Jan 2010 23:50:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:4590</guid><dc:creator>Tobias</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=4590</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2010/01/21/are-you-using-the-correct-powershell-version.aspx#comments</comments><description>&lt;p&gt;Recently, when I was training a group of enterprise admins, a question came up: Why is PowerShell remoting not working on Windows XP? Well, it does! As it turned out, they had downloaded the &amp;quot;wrong&amp;quot; PowerShell version. How come?&lt;/p&gt;
&lt;p&gt;When you search for &lt;strong&gt;PowerShell V2&lt;/strong&gt; downloads, you will find tons of articles and download links. Only some of them point to the correct final &amp;quot;&lt;strong&gt;RTM&lt;/strong&gt;&amp;quot; link. A lot of people are still blogging about &amp;quot;&lt;strong&gt;CTP&lt;/strong&gt;&amp;quot; versions which really were beta versions with limited functionality. Even worse, it turned out that these out-dated PowerShell versions are still up for download from the Microsoft Download center, so when you follow the &amp;quot;wrong&amp;quot; link, you could get the impression that these CTP versions really were official and up-to-date releases.&lt;/p&gt;
&lt;p&gt;This was brought up&amp;nbsp;in our PowerShell &lt;a target="_blank" href="https://mvp.support.microsoft.com/communities/mvp.aspx?product=1&amp;amp;competency=PowerShell"&gt;MVP&lt;/a&gt; chat, and as a consequence, we are trying to get the old out-dated downloads offline. At the same time, we were tossing together ideas that help you identify which version you already have and whether it is the correct one. The results of this joined &lt;a target="_blank" href="https://mvp.support.microsoft.com/communities/mvp.aspx?product=1&amp;amp;competency=PowerShell"&gt;MVP&lt;/a&gt; effort I would like to share with you today.&lt;/p&gt;
&lt;h2&gt;PowerShell Versions - Watch Out!&lt;/h2&gt;
&lt;p&gt;Basically, there are two kinds of PowerShell: &lt;strong&gt;PowerShell V1&lt;/strong&gt; which dates back to 2006, and &lt;strong&gt;PowerShell V2&lt;/strong&gt; which was released in Oct 09. &lt;strong&gt;PowerShell V2&lt;/strong&gt; is downwards compatible to V1 so all of your V1 stuff still runs, but in addition, V2 has tons of important new features such as &lt;strong&gt;Remoting&lt;/strong&gt; (executing code on other machines), &lt;strong&gt;Modules&lt;/strong&gt; (the &amp;quot;new&amp;quot; Snapins to load more commands), &lt;strong&gt;background jobs&lt;/strong&gt; (executing code in a separate thread asynchronously) and more. So it is an excellent idea to upgrade to V2. Both versions are supported on Windows XP and up. They do not run side-by-side, so you have to install V2 over V1.&lt;/p&gt;
&lt;p&gt;One very easy way of distinguishing both versions is to look for a PowerShell variable called &lt;strong&gt;$psversiontable&lt;/strong&gt;. If it is undefined, then you are running V1. If it is there, you have V2. From outside PowerShell, you can also look at a registry key to differentiate between V1 and V2: &lt;em&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Note that PowerShell often was installed as update package so you do not find it in the list of installed software. You have to look at the update packages. Fortunately, though, the final PowerShell V2 can be installed over V1 without having to uninstall V1 first. Only the outdated CTP versions make you find and manually uninstall V1 first. So if you are trying to install V2 on your machine, and it complains about an existing V1, you may well be using the wrong installation package.&lt;/p&gt;
&lt;p&gt;Beginning with Windows 7 / Server 2008 R2, you are on the safe side anyway because these OS are the first to ship with PowerShell included, and they always ship with the final version.&lt;/p&gt;
&lt;h2&gt;CTP PowerShell V2 is WRONG!&lt;/h2&gt;
&lt;p&gt;The PowerShell team has prereleased V2 a long time before the final version was done and called these preview versions &amp;quot;CTP&amp;quot; (Community Technology Preview). You can still find links to &lt;strong&gt;CTP1&lt;/strong&gt;, &lt;strong&gt;CTP2&lt;/strong&gt; and &lt;strong&gt;CTP3&lt;/strong&gt;. All of these versions are outdated and should no longer be used unless some other beta software on your machine really requires it. One reason why you &lt;strong&gt;should not use CTPs anymore&lt;/strong&gt; is because they are lacking some functionality such as Remoting on Windows XP. Other reasons are that CTP versions are unsupported, still had some bugs and also some naming changes were made, so scripts created on CTP1 might not run on the final version of PS V2 anymore.&lt;/p&gt;
&lt;p&gt;Unfortunately, it is not a trivial task to identify whether you have the final PowerShell V2 or some of the preview versions because - CTP&amp;nbsp;versions have a &lt;strong&gt;$psversiontable&lt;/strong&gt; variable, and the versions reported by it can differ from OS to OS and CTP to CTP. So if you do get back a result from &lt;strong&gt;$psversiontable&lt;/strong&gt;, make sure the BuildVersion is &lt;strong&gt;equals or greater than &lt;/strong&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:DE;mso-fareast-language:DE;mso-bidi-language:AR-SA;"&gt;&lt;strong&gt;6.0.6002.18111&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:DE;mso-fareast-language:DE;mso-bidi-language:AR-SA;"&gt;If you want to check your local PowerShell version, you could wrap that logic into a function like this:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:DE;mso-fareast-language:DE;mso-bidi-language:AR-SA;"&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-PowerShellVersion&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-Path&lt;/span&gt;&lt;/span&gt; variable:psversiontable) {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$psversiontable&lt;/span&gt;&lt;/span&gt;.&lt;span style="color:#8b4513;"&gt;&lt;span class="method"&gt;buildversion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;/div&gt;
&lt;div class="pscode"&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Major&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ge&lt;/span&gt;&lt;/span&gt; 6) &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-and&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;
&lt;div class="pscode"&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Build&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ge&lt;/span&gt;&lt;/span&gt; 6002) &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-and&lt;/span&gt;&lt;/span&gt; &lt;/div&gt;
&lt;div class="pscode"&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Revision&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ge&lt;/span&gt;&lt;/span&gt; 18111)&lt;/div&gt;
&lt;div class="pscode"&gt;) {&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;V2 RTM&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; { &lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;V2 CTP Prerelease - Update to V2 RTM!&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;V1 - Update to V2 RTM!&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It tells you exactly&amp;nbsp;whether&amp;nbsp;you have the final V2 or some&amp;nbsp;outdated prerelease installation. Thanks &lt;a target="_blank" href="https://mvp.support.microsoft.com/profile=007E4838-11E1-4077-9261-542921D8E5A1"&gt;Max&lt;/a&gt; for investigating the version numbers and &lt;a target="_blank" href="https://mvp.support.microsoft.com/profile=EEDF79D9-9D71-4AC0-A225-4E8C09FF03A1"&gt;Shay&lt;/a&gt; for tossing in version checking!&lt;/p&gt;
&lt;h2&gt;Wait a minute - How can I check my enterprise?&lt;/h2&gt;
&lt;p&gt;Of course, the quick solution I just presented will not help when you need to investigate your entire network. It also helps only when you examine PowerShell from within. What if you have no access to the &lt;strong&gt;$psversiontable&lt;/strong&gt; variale because you are not checking from within a PowerShell script?&lt;/p&gt;
&lt;p&gt;As it turns out, the BuildVersion reported by &lt;strong&gt;$psversiontable&lt;/strong&gt; really is the version found in the PowerShell assembly. You could get to it from other programming languages by instantiating a PS object and then looking at the version. This is the route to take for anyone wanting to create an inventory solution based on VB.NET or C#. Here is a PowerShell line that illustrates how to get to the version (thanks &lt;a target="_blank" href="https://mvp.support.microsoft.com/profile=970A6A95-C9F6-40C1-A2CC-03627CC06217"&gt;Oisin&lt;/a&gt;!):&lt;/p&gt;
&lt;div class="pscode"&gt;([&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;psobject&lt;/span&gt;&lt;/span&gt;].&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;assembly.getcustomattributes&lt;/span&gt;&lt;/span&gt;(&lt;/div&gt;
&lt;div class="pscode"&gt;[&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;reflection.assemblyfileversionattribute&lt;/span&gt;&lt;/span&gt;], &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$false&lt;/span&gt;&lt;/span&gt;)&lt;/div&gt;
&lt;div class="pscode"&gt;)[0].&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;version&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;If you just wanted to check computers in your network, you can use a PowerShell script. Since PowerShell V2 Remoting is not available on downlevel installations, in order to get the file version remotely, use WMI. The following script &lt;strong&gt;Test-PSVersion&lt;/strong&gt; represents all I thought was useful and consists of a lot of individual contributions made in our MVP list. So it is by no means my function or accomplishment alone but instead &lt;em&gt;the result of a joined team effort in our MVP group&lt;/em&gt;. Special thanks go to &lt;a target="_blank" href="https://mvp.support.microsoft.com/profile=E7D2009B-B8C3-40C9-8DED-5EE212275B71"&gt;Alexander&lt;/a&gt; for bringing up the WMI queries and &lt;a target="_blank" href="http://tinyurl.com/Poshoholic"&gt;Kirk&lt;/a&gt; for perfecting the parameter decoration and reading the OS info via WMI. There were many other MVPs involved. So forgive me if I do not credit everyone.&lt;/p&gt;
&lt;p&gt;Should you find errors in this script, they are &lt;em&gt;my fault alone&lt;/em&gt; (as I was putting together this &lt;em&gt;specific&lt;/em&gt; script ;-) ). In this case, I kindly ask you to leave a comment below. You can &lt;a target="_blank" href="http://powershell.com/cs/media/p/4591.aspx"&gt;download the function&lt;/a&gt; here: &lt;a href="http://powershell.com/cs/media/p/4591.aspx"&gt;http://powershell.com/cs/media/p/4591.aspx&lt;/a&gt;&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-PSVersion&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;[CmdletBinding()]&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;param&lt;/span&gt;&lt;/span&gt;(&lt;br /&gt;[parameter(Position&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;0,ValueFromPipeline&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;)]&lt;br /&gt;[ValidateNotNullOrEmpty()]&lt;br /&gt;[&lt;span class="datatype"&gt;&lt;span style="color:#0000ff;"&gt;String&lt;/span&gt;&lt;/span&gt;[]]&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ComputerName&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; @(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;/span&gt;),&lt;br /&gt;&lt;br /&gt;[Parameter()]&lt;br /&gt;[ValidateNotNull()]&lt;br /&gt;[&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;System.Management.Automation.Credential&lt;/span&gt;&lt;/span&gt;()]&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$Credential&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; [&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;System.Management.Automation.PSCredential&lt;/span&gt;&lt;/span&gt;]::&lt;span style="color:#8b4513;"&gt;&lt;span class="method"&gt;Empty&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;)&lt;br /&gt;process {&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-Connection&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ComputerName&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Count&lt;/span&gt;&lt;/span&gt; 1 &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ErrorAction&lt;/span&gt;&lt;/span&gt; SilentlyContinue) {&lt;br /&gt;try {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$OS&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-WmiObject&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Namespace&lt;/span&gt;&lt;/span&gt; root\CIMV2 &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Class&lt;/span&gt;&lt;/span&gt; Win32_OperatingSystem `&lt;br /&gt;&lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ComputerName&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Credential&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$credential&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ErrorAction&lt;/span&gt;&lt;/span&gt; SilentlyContinue&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$OS&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;$($OS.SystemDirectory -replace &amp;#39;\\&amp;#39;,&amp;#39;\\&amp;#39;)\\WindowsPowerShell\\v1.0\\powershell.exe&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$OSName&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$OS&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;Name.Split&lt;/span&gt;&lt;/span&gt;(&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;|&amp;#39;&lt;/span&gt;&lt;/span&gt;)[0]&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$query&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;SELECT Version FROM CIM_DataFile WHERE Name = &amp;#39;$path&amp;#39;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$PSEXE&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-WmiObject&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Query&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$query&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ComputerName&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Credential&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$credential&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$PSEXE&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Version&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$buildversion&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$PSEXE&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;Version.Split&lt;/span&gt;&lt;/span&gt;()[0]&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; [&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;version&lt;/span&gt;&lt;/span&gt;]&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$buildversion&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$versionRequired&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; [&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;version&lt;/span&gt;&lt;/span&gt;]&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;6.0.6002.18111&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ge&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionRequired&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$psversion&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;V2 RTM&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;elseif&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$versionPresent&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Major&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ge&lt;/span&gt;&lt;/span&gt; 6) {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$psversion&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;V2 CTP Prerelease - Update to V2 RTM!&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$psversion&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;V1&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; PSObject &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Property&lt;/span&gt;&lt;/span&gt; @{&lt;br /&gt;ComputerName&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$OS&lt;/span&gt;&lt;/span&gt;.__SERVER;&lt;br /&gt;BuildVersion&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;[&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;version&lt;/span&gt;&lt;/span&gt;]&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$buildversion&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Version&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$psversion&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Status&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;;Description&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;OK&amp;#39;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;OSName &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$OSName&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; PSObject &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Property&lt;/span&gt;&lt;/span&gt; @{&lt;br /&gt;ComputerName&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt;[0];&lt;br /&gt;BuildVersion&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;[&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;version&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$null&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Version&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Status&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$false&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Description&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Unable to access OS information via WMI.&amp;#39;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;OSName &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;catch {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; PSObject &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Property&lt;/span&gt;&lt;/span&gt; @{&lt;br /&gt;ComputerName&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt;[0];&lt;br /&gt;BuildVersion&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;[&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;version&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$null&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Version&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Status&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$false&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Description&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;Exception.Message&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt;OSName&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;span class="keyword"&gt;continue&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;} &lt;br /&gt;&lt;br /&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; PSObject &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Property&lt;/span&gt;&lt;/span&gt; @{&lt;br /&gt;ComputerName&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt;[0];&lt;br /&gt;BuildVersion&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;[&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;version&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$null&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Version&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Status&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$false&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;Description&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Computer did not respond to ping, skipped.&amp;#39;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;OSName&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;pc77&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;storage1&amp;quot;&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-PSVersion&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;You can call this script over the pipeline and pipe a list of computers into it, or you can call &lt;strong&gt;Get-Content&lt;/strong&gt; and read in the content of a list of computernames and pipe the result to &lt;strong&gt;Test-PSVersion&lt;/strong&gt;. What you should get in return should look similar to this:&lt;/p&gt;
&lt;div class="pscode"&gt;
&lt;div class="pscode"&gt;Version : V2 RTM&lt;br /&gt;OSName : Microsoft Windows 7 Ultimate&lt;br /&gt;Status : True&lt;br /&gt;ComputerName : DEMO5&lt;br /&gt;Description : OK&lt;br /&gt;BuildVersion : 6.1.7600.16385&lt;br /&gt;&lt;br /&gt;Version : n&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;/&lt;/span&gt;&lt;/span&gt;a&lt;br /&gt;OSName : n&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;/&lt;/span&gt;&lt;/span&gt;a&lt;br /&gt;Status : False&lt;br /&gt;ComputerName : pc77&lt;br /&gt;Description : Computer did not respond to ping, skipped.&lt;br /&gt;BuildVersion :&lt;br /&gt;&lt;br /&gt;Version : V2 RTM&lt;br /&gt;OSName : Microsoft Windows 7 Ultimate&lt;br /&gt;Status : True&lt;br /&gt;ComputerName : DEMO5&lt;br /&gt;Description : OK&lt;br /&gt;BuildVersion : 6.1.7600.16385&lt;br /&gt;&lt;br /&gt;Version : V2 RTM&lt;br /&gt;OSName : Microsoft Windows Server 2003 for Small Business Server&lt;br /&gt;Status : True&lt;br /&gt;ComputerName : STORAGE1&lt;br /&gt;Description : OK&lt;br /&gt;BuildVersion : 6.0.6002.18139&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It is time to check your PowerShell version! Make sure you are not using any prerelease software (unless you need to for obscure reasons). And if you find yourself using PS V1, consider an upgrade. It is free and worth it! &lt;/p&gt;
&lt;p&gt;I hope on behalf of all of us PowerShell MVPs, with the code and examples in this post, we provided you with the inventory tools you need to make this happen. To get your hands on PowerSjell V2 RTM, there are (too) many dowload pages. To &lt;a target="_blank" href="http://support.microsoft.com/kb/968929"&gt;download PowerShell V2&lt;/a&gt; and learn all about prerequisites etc. I found this link up-to-date and useful: &lt;a href="http://support.microsoft.com/kb/968929"&gt;http://support.microsoft.com/kb/968929&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Have fun! Hey, and watch out for &lt;a target="_blank" href="http://www.idera.com/Products/PowerShell/PowerShell-Plus/?s=PS.com-banner"&gt;PowerShellPlus 3.1! Did you try the beta yet&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;And one more thing: if you happen to be located in &lt;strong&gt;Germany&lt;/strong&gt;, &lt;strong&gt;Switzerland&lt;/strong&gt; or &lt;strong&gt;Austria&lt;/strong&gt;, rent me! &lt;/p&gt;
&lt;p&gt;I am doing inhouse trainings, tutorials and projects. Simply drop a mail to &lt;a href="mailto:tobias@powershell.com"&gt;tobias@powershell.com&lt;/a&gt;, and maybe we meet in&amp;nbsp;person some time soon...! I have tons of tricks for you and do trainings for midsize and large enterprises on a regular basis - it&amp;#39;s always a lot of fun!&lt;/p&gt;
&lt;p&gt;Cheers&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=4590" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/V2/default.aspx">V2</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/_2400_psversiontable/default.aspx">$psversiontable</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Version/default.aspx">Version</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Download/default.aspx">Download</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/CTP/default.aspx">CTP</category></item><item><title>1 equals "Running"? - Melting Integer and String Objects together</title><link>http://powershell.com/cs/blogs/tobias/archive/2010/01/07/1-equals-quot-running-quot-melting-integer-and-string-objects-together.aspx</link><pubDate>Thu, 07 Jan 2010 08:19:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:4404</guid><dc:creator>Tobias</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=4404</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2010/01/07/1-equals-quot-running-quot-melting-integer-and-string-objects-together.aspx#comments</comments><description>&lt;p&gt;By coincidence, I stumbled upon &lt;a target="_blank" href="http://blogs.msdn.com/powershell/archive/2007/01/09/two-plus-two-equals-monday.aspx"&gt;an article in the PS team blog&lt;/a&gt; which talks about comparing different object types. It definitely is worth looking at, but let&amp;#39;s take it a step further.&lt;/p&gt;
&lt;p&gt;Recently, while I was deserializing service objects, I found that &amp;quot;status&amp;quot; was&amp;nbsp;returned as friendly text such as &amp;quot;Running&amp;quot; or &amp;quot;Stopped&amp;quot; &lt;em&gt;BUT&lt;/em&gt; when I took a deeper look, it turned out this property returned &lt;strong&gt;Int32&lt;/strong&gt;, numeric values. &lt;/p&gt;
&lt;p&gt;So naturally, two questions arose: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first, how mad can it get when &lt;strong&gt;Int32&lt;/strong&gt; suddenly starts outputting text?&lt;/li&gt;
&lt;li&gt;and second, why did I take a deeper look at this in the first place? (aka, what is the real world relevance?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;WYSI&lt;span style="text-decoration:underline;"&gt;NA&lt;/span&gt;WYG - What you see is NOT ALWAYS what you get&lt;/h2&gt;
&lt;p&gt;Usually, when you output objects to the console, you can safely look at the columns, pick some values and use them for future filtering on those properties, just&amp;nbsp;like this:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Service&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;With deserialized service objects, this suddenly fails which was when I started to scratch my head:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Service&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Export-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$services&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Import-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;The last line simply does not&amp;nbsp;return anything although there definitely are running service objects. Crazy.&lt;/p&gt;
&lt;p&gt;Guess why? With deserialized service objects, &lt;strong&gt;Status&lt;/strong&gt; returns text &lt;em&gt;that really is numeric&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;$services&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Foreach-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;Status.GetType&lt;/span&gt;&lt;/span&gt;().&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;FullName&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span style="color:#8b4513;"&gt;&lt;span class="namespace"&gt;System.Int32&lt;/span&gt;&lt;br /&gt;&lt;span class="namespace"&gt;System.Int32&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;(...)&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So, you would have to compare against the &lt;em&gt;numeric&lt;/em&gt; value, not the &lt;em&gt;text&lt;/em&gt; that was displayed in the &lt;strong&gt;Status&lt;/strong&gt; column inside the console:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$services&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; 4 }&lt;/p&gt;
&lt;p&gt;Uh, that is strange... Do I have your attention now?&lt;/p&gt;
&lt;h2&gt;Override toString() to get Int32-Mutations...&lt;/h2&gt;
&lt;p&gt;To make an integer appear as something different, all you need to do is override its &lt;strong&gt;toString()&lt;/strong&gt; method. Replace it with whatever you would like to use to display the variable. Here is a sample:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; 1&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$b&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;1&lt;/p&gt;
&lt;p&gt;I stored a numeric value in a variable called &lt;strong&gt;$b&lt;/strong&gt;, and naturally, when I output it, it shows what it is: a numeric value. No surprises. But wait!&lt;/p&gt;
&lt;p&gt;Next, I override its &lt;strong&gt;toString()&lt;/strong&gt; method with my own ScriptMethod:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Add-Member&lt;/span&gt;&lt;/span&gt; scriptMethod &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-pass&lt;/span&gt;&lt;/span&gt; toString &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-force&lt;/span&gt;&lt;/span&gt; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Running&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$b&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Running&lt;/p&gt;
&lt;p&gt;Tada! Now, when I output &lt;strong&gt;$b&lt;/strong&gt;, it changes nature and returns whatever I specified in my &lt;strong&gt;toString()&lt;/strong&gt; method. So my &lt;strong&gt;Int32&lt;/strong&gt; now looks like a string.&lt;/p&gt;
&lt;p&gt;&amp;quot;Oh yeah&amp;quot;, you may mumble, &amp;quot;so smarty, why did you not use a string in the first place?&amp;quot; Well, because although &lt;strong&gt;$b&lt;/strong&gt; looks like a string, it is still an Integer:&lt;/p&gt;
&lt;p&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; 1&lt;br /&gt;True&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-eq&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;False&lt;/p&gt;
&lt;p&gt;In fact, &lt;strong&gt;$b&lt;/strong&gt; now behaves exactly like the deserialized &lt;strong&gt;Status&lt;/strong&gt; property I received back from my initial service objects. With hybrid Integers, you output information as nice &amp;amp; friendly text so you don&amp;#39;t have to look up geeky values to understand what them numbers stand for. Still, you can efficiently compare them against numeric values if you need to.&lt;/p&gt;
&lt;h2&gt;-like to the Rescue&lt;/h2&gt;
&lt;p&gt;The only problem with this is that you run into problems like I did if you don&amp;#39;t know about this masquerade. You *think* it is text but once you compare it with text, the comparison mumbles &amp;quot;nope, it&amp;#39;s an integer, so I return $false&amp;quot; - well it does not even mumble&amp;nbsp;this but silently leaves you puzzling.&lt;/p&gt;
&lt;p&gt;A somewhat useful workaround for these cases is &lt;strong&gt;-like&lt;/strong&gt; which compares the value of a variable based on its toString() result as Jason pointed out (thanks for correcting me). Have a look:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-like&lt;/span&gt;&lt;/span&gt; 1&lt;br /&gt;False&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-like&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;True&lt;/div&gt;
&lt;p&gt;So this conclusion helped solve my initial problem. By replacing &lt;strong&gt;-eq&lt;/strong&gt; with &lt;strong&gt;-like&lt;/strong&gt;, all worked fine:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Service&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Export-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$services&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Import-CliXML&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$home&lt;/span&gt;&lt;/span&gt;\services.&lt;span style="color:#0000ff;"&gt;&lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$services&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Status&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-like&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Running&amp;#39;&lt;/span&gt;&lt;/span&gt; }&lt;/p&gt;
&lt;p&gt;Have a great 2010 and keep tuned, &lt;br /&gt;hey and go ahead and &lt;a target="_blank" href="http://www.idera.com/Products/PowerShell/PowerShell-Plus/"&gt;try our PowerShellPlus smart PS console&lt;/a&gt; if you are at it, Richard and I would appreciate it! &lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;P.S.&lt;/p&gt;
&lt;p&gt;Richard just commented on my post: &amp;quot;VERY geeky, but nice!&amp;quot; So let&amp;#39;s boil it down to one sentence: &amp;quot;If -&lt;strong&gt;eq&lt;/strong&gt; does not seem to work, try &lt;strong&gt;-lik&lt;/strong&gt;e instead.&amp;quot;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=4404" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Export-CliXML/default.aspx">Export-CliXML</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Import-CliXML/default.aspx">Import-CliXML</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Deserialized/default.aspx">Deserialized</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Get-Service/default.aspx">Get-Service</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Serialize/default.aspx">Serialize</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Override/default.aspx">Override</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/toString/default.aspx">toString</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/-eq/default.aspx">-eq</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Integer/default.aspx">Integer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/-like/default.aspx">-like</category></item><item><title>Cancelling a Pipeline</title><link>http://powershell.com/cs/blogs/tobias/archive/2010/01/01/cancelling-a-pipeline.aspx</link><pubDate>Fri, 01 Jan 2010 10:17:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:4470</guid><dc:creator>Tobias</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=4470</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2010/01/01/cancelling-a-pipeline.aspx#comments</comments><description>&lt;p&gt;Once a PowerShell pipeline runs, it runs. There is no way of cancelling it. This is bad news. Or is there a way?&lt;/p&gt;
&lt;h2&gt;Runaway Pipeline&lt;/h2&gt;
&lt;p&gt;Just imagine you are retrieving tons of data to find&amp;nbsp;a piece of information. Once you found it, you do not need to retrieve the rest. Since you cannot cancel the pipeline, you are stuck and have to wait until the initial pipeline command finishes.&lt;/p&gt;
&lt;p&gt;There is a cmdlet that seems to provide an answer: &lt;strong&gt;Select-Object&lt;/strong&gt;. This cmdlet has a parameter called &lt;strong&gt;-First&lt;/strong&gt;, so you could try and output only the first &lt;em&gt;n&lt;/em&gt; elements like this:&lt;/p&gt;
&lt;div class="pscode"&gt;PS&amp;gt; 1..10 | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-First&lt;/span&gt;&lt;/span&gt; 5&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;/div&gt;
&lt;p&gt;As it turns out, though, &lt;strong&gt;Select-Object&lt;/strong&gt; simply filters out the first 5 elements but does not stop the pipeline:&lt;/p&gt;
&lt;div class="pscode"&gt;PS&amp;gt; 1..10 | &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Write-Host&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;PROCESSING $_&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ForegroundColor&lt;/span&gt;&lt;/span&gt; red ; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-First&lt;/span&gt;&lt;/span&gt; 5 | &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Outputting $_&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;PROCESSING 1&lt;br /&gt;Outputting 1&lt;br /&gt;PROCESSING 2&lt;br /&gt;Outputting 2&lt;br /&gt;PROCESSING 3&lt;br /&gt;Outputting 3&lt;br /&gt;PROCESSING 4&lt;br /&gt;Outputting 4&lt;br /&gt;PROCESSING 5&lt;br /&gt;Outputting 5&lt;br /&gt;PROCESSING 6&lt;br /&gt;PROCESSING 7&lt;br /&gt;PROCESSING 8&lt;br /&gt;PROCESSING 9&lt;br /&gt;PROCESSING 10&lt;/div&gt;
&lt;p&gt;Or in a more practical example, the next line will continue to run even though you have received the information you were after, causing a delay and unnecessary system load:&lt;/p&gt;
&lt;div class="pscode"&gt;PS&amp;gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-EventLog&lt;/span&gt;&lt;/span&gt; Application | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-First&lt;/span&gt;&lt;/span&gt; 5&lt;br /&gt;&lt;br /&gt;Index Time EntryType Source InstanceID Message&lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-----&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;----&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;---------&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;------&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;----------&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&lt;span class="op"&gt;-------&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;53391 Jan 16 02:53 Error TracerX &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-&lt;/span&gt;&lt;/span&gt; PowerSh... 1001 ...&lt;br /&gt;53390 Jan 16 00:04 Information VSS 8224 ....&lt;br /&gt;53389 Jan 15 23:51 Information VSS 8224 ....&lt;br /&gt;53388 Jan 15 22:39 Information Outlook 1073741856 ..&lt;br /&gt;53387 Jan 15 22:38 Information Outlook 1073741856 ...&lt;/div&gt;
&lt;h2&gt;A Surprising Answer: Yes&amp;nbsp;you can!&lt;/h2&gt;
&lt;p&gt;With a little trick, you can cancel the pipeline and stop any cmdlet upstream immediately. You need to use &lt;strong&gt;continue.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;The next line &amp;quot;simulates&amp;quot; &lt;strong&gt;Select-Object -First&lt;/strong&gt; by using a &lt;strong&gt;Foreach-Object&lt;/strong&gt; (alias: &lt;strong&gt;%&lt;/strong&gt;) statement. It counts up and once it received more than 5 elements, it calls &lt;strong&gt;continue&lt;/strong&gt;. There is another &lt;strong&gt;Foreach-Object&lt;/strong&gt; clause right before it, showing you the objects traversing the pipeline. As you will see, this approach not just filters the output but also cancels the upstream cmdlets.&lt;/p&gt;
&lt;div class="pscode"&gt;PS&amp;gt; 1..10 | &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Write-Host&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;PROCESSING $_&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ForegroundColor&lt;/span&gt;&lt;/span&gt; red ; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; } | &lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;0 } {&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;++&lt;/span&gt;&lt;/span&gt;; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 5) { &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt; }; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Outputting $_&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;PROCESSING 1&lt;br /&gt;Outputting 1&lt;br /&gt;PROCESSING 2&lt;br /&gt;Outputting 2&lt;br /&gt;PROCESSING 3&lt;br /&gt;Outputting 3&lt;br /&gt;PROCESSING 4&lt;br /&gt;Outputting 4&lt;br /&gt;PROCESSING 5&lt;br /&gt;Outputting 5&lt;br /&gt;PROCESSING 6&lt;/div&gt;
&lt;p&gt;You may be wondering why you need to call &lt;strong&gt;continue&lt;/strong&gt; to &lt;em&gt;not&lt;/em&gt; continue - doesn&amp;#39;t exactly sound right. &lt;strong&gt;Continue&lt;/strong&gt; was originally designed to skip a loop or continue with the next statement after an exception was trapped, so&amp;nbsp;its name&amp;nbsp;does make sense. The only problem with this is that in the previous example,&amp;nbsp;&lt;strong&gt;continue&lt;/strong&gt; stops everything, so if you use it inside a script, the entire script gets cancelled. Not good.&lt;/p&gt;
&lt;p&gt;This is because we called &lt;strong&gt;continue&lt;/strong&gt; directly, not from within a loop or an error handler, so &lt;strong&gt;continue&lt;/strong&gt; really continues with the next statement outside the loop or trap, and since there is none, everything stops. The real problem is that PowerShell does not identify a pipeline as a loop which it really is. If it did, we would be done already. Instead, we need to work around it by wrapping the pipeline inside a dummy loop&amp;nbsp;like this:&lt;/p&gt;
&lt;div class="pscode"&gt;PS&amp;gt; for (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;1; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-lt&lt;/span&gt;&lt;/span&gt; 2; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;++&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;1..20 | &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Write-Host&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Processing $_&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ForegroundColor&lt;/span&gt;&lt;/span&gt; red ; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; } | &lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;0 } {&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;++&lt;/span&gt;&lt;/span&gt;; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 5) { &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt; }; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Outputting $_&amp;quot;&lt;/span&gt;&lt;/span&gt; } }&lt;br /&gt;Processing 1&lt;br /&gt;Outputting 1&lt;br /&gt;Processing 2&lt;br /&gt;Outputting 2&lt;br /&gt;Processing 3&lt;br /&gt;Outputting 3&lt;br /&gt;Processing 4&lt;br /&gt;Outputting 4&lt;br /&gt;Processing 5&lt;br /&gt;Outputting 5&lt;br /&gt;Processing 6&lt;/div&gt;
&lt;p&gt;Here again is a more practical example. It will output all events from your Application log until it hits one with an InstanceID of greater than 10000. Once hit, it cancels the entire pipeline upstream and continues with the next command:&lt;/p&gt;
&lt;div class="pscode"&gt;for (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; 1; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-lt&lt;/span&gt;&lt;/span&gt; 2; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;++&lt;/span&gt;&lt;/span&gt;) { &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Eventlog&lt;/span&gt;&lt;/span&gt; Application | &lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000) { &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;} &lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;Index Time EntryType Source InstanceID&lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-----&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;----&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;---------&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;------&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&lt;span class="op"&gt;----------&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;53391 Jan 16 02:53 Error TracerX &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-&lt;/span&gt;&lt;/span&gt; PowerSh... 1001&lt;br /&gt;53390 Jan 16 00:04 Information VSS 8224&lt;br /&gt;53389 Jan 15 23:51 Information VSS 8224&lt;br /&gt;53388 Jan 15 22:39 Information Outlook 1073741856&lt;/p&gt;
&lt;p&gt;Wrapping the pipeline inside a dummy loop looks ugly but is key to using &lt;strong&gt;continue&lt;/strong&gt; not just in regular loops but also to immediately cancel the pipeline.&lt;/p&gt;
&lt;h2&gt;Beware of the Spirits you called...&lt;/h2&gt;
&lt;p&gt;This is a hack. It works beautifully if done right, but it also poses some risk. Here is why.&lt;/p&gt;
&lt;p&gt;When you call &lt;strong&gt;continue&lt;/strong&gt;, somehow all upstream cmdlets (the ones before the &lt;strong&gt;continue&lt;/strong&gt;) need to notice that &lt;strong&gt;continue&lt;/strong&gt; has been called and respond to it. In other words, &lt;strong&gt;continue&lt;/strong&gt; needs to actively communicate to all previous cmdlets in the pipeline that they need to stop because the pipeline is shutted down. This is necessary in order to gracefully shut down all upstream cmdlets. You do not want to just pull the plug on them.&lt;/p&gt;
&lt;p&gt;Most cmdlets do that just fine. Sometimes, though, this red alert gets lost, so upstream cmdlets continue to run and are surprised when the pipeline is taken away under their feet. When cmdlets get surprised, they throw an exception (a red bulk of text with glibberishy technical stuff in it). This is the worst it can get, fortunately. No chance of blowing something up.&lt;/p&gt;
&lt;p&gt;The message is sent to upstream cmdlets by throwing a &lt;em&gt;PipelineStopped&lt;/em&gt; exception. Upstream cmdlets receive this exception. If they are done right, they will do two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;abort whatever they were doing&lt;/li&gt;
&lt;li&gt;passing on the exception so the next cmdlet gets a chance to see it and act accordingly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem can occur when a cmdlet fails to do either one. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it does not abort, it might throw an exception because the pipeline is gone with all the side effects arising from this&lt;/li&gt;
&lt;li&gt;If it does not pass on the exception, the cmdlet before this one might throw an exception for the very same reason: pipeline is gone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How come a cmdlet would not pass on the exception? Easy. If the author implemented a generic trap and catches all exceptions, and if the author chose &lt;strong&gt;continue&lt;/strong&gt; at the end of his trap, the exception then is &amp;quot;handled&amp;quot; and no longer bubbles up to the other cmdlets in the pipe. You can illustrate this quite easily:&lt;/p&gt;
&lt;div class="pscode"&gt;for (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; 1; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-lt&lt;/span&gt;&lt;/span&gt; 2; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$x&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;++&lt;/span&gt;&lt;/span&gt;) { &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Eventlog&lt;/span&gt;&lt;/span&gt; Application | &lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;&lt;/span&gt;&lt;/span&gt; { &lt;br /&gt;process {&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;trap&lt;/span&gt;&lt;/span&gt; { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Write-Host&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-fore&lt;/span&gt;&lt;/span&gt; Red &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;I ate the exception so the upstream cmdlet continues: $_&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt; }&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;} &lt;br /&gt;} | &lt;br /&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;%&lt;/span&gt;&lt;/span&gt; { &lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$_&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000) { &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt; } &lt;br /&gt;} &lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;When you run this, the scriptblock following &lt;strong&gt;Get-Eventlog&lt;/strong&gt; has its own trap. When you call &lt;strong&gt;continue&lt;/strong&gt; downstream, it catches the &lt;em&gt;PipelineStopped&lt;/em&gt; exception and handles it. This way, &lt;strong&gt;Get-EventLog&lt;/strong&gt; never gets to see it and happily continues to spit out results, causing additional exceptions for any piece of result that no longer can be handled.&lt;/p&gt;
&lt;p&gt;To correct this, the trap would have to call &lt;strong&gt;break&lt;/strong&gt; instead of &lt;strong&gt;continue&lt;/strong&gt; to signal back the exception it received.&lt;/p&gt;
&lt;h2&gt;Creating your own Stop-Pipeline command&lt;/h2&gt;
&lt;p&gt;Now, you may argue this concept creates spaghetti code and makes the pipeline look ugly, and you are right. When you use &lt;strong&gt;continue&lt;/strong&gt;, having to wrap the whole enchilada in a loop is not exactly esthetic. It also violates the modular philosophy of PowerShell&amp;nbsp;and&amp;nbsp;instead uses the old and ugly &amp;quot;onion&amp;quot; concept.&amp;nbsp;As it turns out, you do not need the wrapping loop. Think on.&lt;/p&gt;
&lt;p&gt;As you have seen, upstream cmdlets are cancelled by sending them a &lt;em&gt;PipelineStopped&lt;/em&gt;-Exception. In the previous examples, I did this indirectly using &lt;strong&gt;continue&lt;/strong&gt;, and since &lt;strong&gt;continue&lt;/strong&gt; can only live inside a loop, I had to place a loop around the pipeline. Why not throw a &lt;em&gt;PipelineStopped&lt;/em&gt;-Exception myself and not use &lt;strong&gt;continue&lt;/strong&gt; in the first place? As it turns out, this works just as well. So in order to retrieve only Application log events until I find one with InstanceID greater than 10000, I could do this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;filter&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt;([&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;scriptblock&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$condition&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;{&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;}) {&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$_&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$condition&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;Throw (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="namespace"&gt;&lt;span style="color:#8b4513;"&gt;System.Management.Automation.PipelineStoppedException&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-EventLog&lt;/span&gt;&lt;/span&gt; Application | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000}&lt;/div&gt;
&lt;p&gt;I use a filter called &lt;strong&gt;Stop-Pipeline&lt;/strong&gt; which takes a condition. When the condition is met, the filter raises the &lt;em&gt;PipelineStopped&lt;/em&gt;-Exception directly. It gets passed on to the upstream cmdlets and cancels them. No need for &lt;strong&gt;continue&lt;/strong&gt;, no need for&amp;nbsp;a wrapper loop, and a very straight-forward pipeline design.&lt;/p&gt;
&lt;p&gt;Since this kind of exception is a terminating error, the exception will cancel the entire script, so you should wrap the pipeline in a &lt;strong&gt;try/catch&lt;/strong&gt;-block like this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;#39;Start&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;try {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-EventLog&lt;/span&gt;&lt;/span&gt; Application | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000}&lt;br /&gt;} catch {}&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Done&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Unfortunately, when the pipeline is cancelled this way, it also cancels an important last task a pipeline usually does: should you want to store the result in a variable, this no longer happens. Take a look:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;No result&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;try {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-EventLog&lt;/span&gt;&lt;/span&gt; Application | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000}&lt;br /&gt;} catch {}&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;The answer is: &amp;quot;No result&amp;quot;. Bummer.&lt;/p&gt;
&lt;p&gt;Going back to the &lt;strong&gt;continue&lt;/strong&gt; approach, it turns out this cancels the pipeline more gracefully after all, so the final solution looks like this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;filter&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt;([&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;scriptblock&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$condition&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; {&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;}) {&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$_&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$condition&lt;/span&gt;&lt;/span&gt;) {&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;No result&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;do&lt;/span&gt;&lt;/span&gt; { &lt;/div&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;&lt;span style="color:#000000;"&gt;&amp;nbsp;&lt;/span&gt;Get-EventLog&lt;/span&gt;&lt;/span&gt; Application | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000} &lt;/div&gt;
&lt;div class="pscode"&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;while&lt;/span&gt;&lt;/span&gt; ($false)&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Don&amp;#39;t be overwhelmed by this. Being able to stop a pipeline can be a wonderful trick. Just make sure you &amp;quot;know&amp;quot; the cmdlets involved. &lt;/p&gt;
&lt;p&gt;As long as they honor and pass on the &lt;em&gt;PipelineStopped&lt;/em&gt; exception, you are fine. So in your cozy PS shop at your workbench, test the pipeline you designed and make sure no exceptions are raised by upstream parts of your pipeline so that you can safely assume they know how to pass on the exception correctly. Once you know that, you also know that your particular pipeline is safe for this kind of technique. &lt;em&gt;Thanks to Jaykul (fellow PS MVP) to pointing me to the PipelineStopped-side effects.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It really boils down to this simple filter:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;filter&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt;([&lt;span class="optional"&gt;&lt;span style="color:#0000ff;"&gt;scriptblock&lt;/span&gt;&lt;/span&gt;]&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$condition&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; {&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;}) {&lt;br /&gt;&lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$_&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;&amp;amp;&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$condition&lt;/span&gt;&lt;/span&gt;) {&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;Make sure you embed your pipeline in a &lt;strong&gt;do/while&lt;/strong&gt;-block if it runs as part of a script so that only the particular pipeline is cancelled:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$result&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;do&lt;/span&gt;&lt;/span&gt; { &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-EventLog&lt;/span&gt;&lt;/span&gt; Application | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;InstanceID&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 10000} &lt;br /&gt;} &lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;while&lt;/span&gt;&lt;/span&gt; (&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$false&lt;/span&gt;&lt;/span&gt;)&lt;/div&gt;
&lt;p&gt;Notice that &lt;strong&gt;Stop-Pipeline&lt;/strong&gt; assigns a default script block to &lt;strong&gt;$condition&lt;/strong&gt; so if you call &lt;strong&gt;Stop-Pipeline&lt;/strong&gt; without argument, it will pass the first object through the pipeline and then cancels it:&lt;/p&gt;
&lt;p&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Process&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Stop-Pipeline&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Maybe we will see this functionality as a built-in cmdlet in a future release of PowerShell. Meanwhile, simply copy &amp;amp; paste it into your scripts whenever you need it. &lt;/p&gt;
&lt;p&gt;Have fun! Hey, and watch out for &lt;a target="_blank" href="http://www.idera.com/Products/PowerShell/PowerShell-Plus/?s=PS.com-banner"&gt;PowerShellPlus 3.1! Did you try the beta yet&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;And one more thing: if you happen to be located in &lt;strong&gt;Germany&lt;/strong&gt;, &lt;strong&gt;Switzerland&lt;/strong&gt; or &lt;strong&gt;Austria&lt;/strong&gt;, rent me! &lt;/p&gt;
&lt;p&gt;I am doing inhouse trainings, tutorials and projects. Simply drop a mail to &lt;a href="mailto:tobias@powershell.com"&gt;tobias@powershell.com&lt;/a&gt;, and maybe we meet in&amp;nbsp;person some time soon...! I have tons of tricks for you and do trainings for midsize and large enterprises on a regular basis - it&amp;#39;s always a lot of fun!&lt;/p&gt;
&lt;p&gt;Cheerio&lt;/p&gt;
&lt;p&gt;Tobias&lt;br /&gt;&lt;em&gt;PowerShellPlus-Editor Architect&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=4470" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Pipeline/default.aspx">Pipeline</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Continue/default.aspx">Continue</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Break/default.aspx">Break</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Stop-Pipeline/default.aspx">Stop-Pipeline</category></item><item><title>Part 1 - What's New In PowerShell V2: Computer Cmdlets</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/09/28/part-1-what-s-new-in-powershell-v2-computer-cmdlets.aspx</link><pubDate>Mon, 28 Sep 2009 01:03:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:3485</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=3485</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/09/28/part-1-what-s-new-in-powershell-v2-computer-cmdlets.aspx#comments</comments><description>
&lt;p&gt;


&lt;/p&gt;
&lt;p&gt;PowerShell V2 contains a lot of new cmdlets and has added many more useful parameters to existing cmdlets. In this series, we look at all the new things you can now do with PowerShell V2.&lt;/p&gt;
&lt;h2&gt;How do I know which PS Version I run?&lt;/h2&gt;
&lt;p&gt;It&amp;#39;s pretty easy to find out whether PowerShell is installed or not: simply press &lt;strong&gt;WIN+R&lt;/strong&gt; and try to run &lt;strong&gt;powershell.exe&lt;/strong&gt;. If PowerShell is installed, the next thing you probably want to know is which version you are running. The best thing is to check the automatic variable&lt;strong&gt; $psversiontable&lt;/strong&gt; which is present only in V2 and tells you the exact version. &lt;/p&gt;
&lt;p&gt;Alexander has created a function called &lt;strong&gt;Get-PSVersion&lt;/strong&gt; for that (&lt;a href="http://powershell.com/cs/media/p/2617.aspx"&gt;http://powershell.com/cs/media/p/2617.aspx&lt;/a&gt;&lt;a href="http://powershell.com/cs/blogs/tips/archive/2009/09/11/which-powershell-version-am-i-running.aspx"&gt;&lt;/a&gt;), and we also have a Power Tip for this (&lt;a href="http://powershell.com/cs/blogs/tips/archive/2009/09/11/which-powershell-version-am-i-running.aspx"&gt;http://powershell.com/cs/blogs/tips/archive/2009/09/11/which-powershell-version-am-i-running.aspx&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;Should you find that you are still using PowerShell V1, you may want to upgrade to V2. V2 is the default version on Windows 7 and Windows Server 2008 R2 but is also available down to Windows XP. Currently, Microsoft has made available PowerShell Version 2 RC for these older platforms (avoid PowerShell V2 CTP3 as this version is outdated by now and still had some limitations with remoting).&lt;/p&gt;
&lt;h2&gt;Eleven New Computer Cmdlets&lt;/h2&gt;
&lt;p&gt;PowerShell V2 contains eleven new cmdlets with the noun &lt;em&gt;Computer&lt;/em&gt; (or related to it):&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;PS&amp;gt; Get-Command -Noun *computer* | Format-Table Name, PSSnapin&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSSnapIn&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&lt;br /&gt;Add-Computer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Checkpoint-Computer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Disable-ComputerRestore&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Enable-ComputerRestore&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Get-ComputerRestorePoint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Remove-Computer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Reset-ComputerMachinePassword&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Restart-Computer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Restore-Computer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Stop-Computer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&lt;br /&gt;Test-ComputerSecureChannel&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Microsoft.PowerShell.Management&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;With these cmdlets, you can basically do three things: manage domain join, restart and shutting down machines and&amp;nbsp;manage system restore points.&lt;/p&gt;
&lt;h2&gt;Domain And Workgroup Join And Unjoin&lt;/h2&gt;
&lt;p&gt;If you ever wanted to automatically join computers to a new domain or a peer-to-peer-workgroup, you can now do so using &lt;strong&gt;Add-Computer&lt;/strong&gt;. To make the change happen, append &lt;strong&gt;Restart-Computer&lt;/strong&gt; which is generally a great way of restarting machines:&lt;/p&gt;
&lt;p style="font-family:Courier New;"&gt;add-computer -domainname Domain01; restart-computer&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;add-computer -workgroupname WORKGROUP-A&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add-Computer always works on the local computer. You cannot use it to join a remote computer. To get more examples, use this:&lt;/p&gt;
&lt;p style="font-family:Courier New;"&gt;Get-Help Add-Computer -examples&lt;/p&gt;
&lt;p&gt;To remove a computer from a domain or workgroup, use &lt;strong&gt;Remove-Computer&lt;/strong&gt;. And if you&amp;#39;d like to reset the computer password, use &lt;strong&gt;Reset-ComputerMachinePassword&lt;/strong&gt;. You can even diagnose and repair the secure channel used by a domain-joined client and his domain. &lt;strong&gt;Test-ComputerSecureChannel&lt;/strong&gt; will tell you if everything is fine, and when you add the switch parameter -repair, the channel is automatically repaired.&lt;/p&gt;
&lt;h2&gt;Restarting And Shutting Down Machines&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Restart-Computer&lt;/strong&gt; allows you to restart one or more machines, locally and remote. To simply restart your local machine, use this:&lt;/p&gt;
&lt;p style="font-family:Courier New;"&gt;restart-computer&lt;/p&gt;
&lt;p&gt;To restart a bunch of computers remotely and also your own machine, use the &lt;strong&gt;-computerName&lt;/strong&gt; parameter and a comma-delimited list:&lt;/p&gt;
&lt;p style="font-family:Courier New;"&gt;restart-computer -computername Server01, Server02, localhost&lt;/p&gt;
&lt;p&gt;To shut down a machine (turn it off), use &lt;strong&gt;Stop-Computer&lt;/strong&gt; instead of &lt;strong&gt;Restart-Computer&lt;/strong&gt;. It works the same way.&lt;/p&gt;
&lt;p&gt;If you want to log off users (rather than restarting or stopping machines), use &lt;strong&gt;Get-WMIObject Win32_OperatingSystem&lt;/strong&gt; and take advantage of its &lt;strong&gt;Win32Shutdown()&lt;/strong&gt; method which also works locally and remotely.&lt;/p&gt;
&lt;h2&gt;Managing Restore Points&lt;/h2&gt;
&lt;p&gt;Restore points are system snapshots designed to conserve some system state so in case something bad happens, you can easily recover. PowerShell now allows you to manage restore points through cmdlets. Note that managing restore points requires Admin privileges.&lt;/p&gt;
&lt;p&gt;To list all available restore points created earlier, use &lt;strong&gt;Get-ComputerRestorePoint&lt;/strong&gt;:&lt;/p&gt;
&lt;p style="font-family:Courier New;"&gt;PS&amp;gt; Get-ComputerRestorePoint&lt;/p&gt;
&lt;p style="font-family:Courier New;"&gt;CreationTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SequenceNumber&amp;nbsp;&amp;nbsp;&amp;nbsp; EventType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RestorePointType&lt;br /&gt;------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------------&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ----------------&lt;br /&gt;03.07.2009 05:21:46&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... 18&lt;br /&gt;09.07.2009 20:51:12&amp;nbsp;&amp;nbsp;&amp;nbsp; Installiert TIPCI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 21&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;br /&gt;10.07.2009 08:51:09&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... 18&lt;br /&gt;10.07.2009 12:16:03&amp;nbsp;&amp;nbsp;&amp;nbsp; Snagit 9.1.2 wird installiert&amp;nbsp; 23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;br /&gt;14.07.2009 09:34:59&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... 18&lt;br /&gt;16.07.2009 17:51:09&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 25&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... 18&lt;br /&gt;17.07.2009 01:11:21&amp;nbsp;&amp;nbsp;&amp;nbsp; Installed Microsoft Office ... 26&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;br /&gt;17.07.2009 10:27:10&amp;nbsp;&amp;nbsp;&amp;nbsp; Installed Idera PowerShellP... 28&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;br /&gt;18.07.2009 11:40:42&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 29&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... 18&lt;br /&gt;19.07.2009 00:42:36&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Update&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... 18&lt;br /&gt;19.07.2009 00:48:06&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Modules Installer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 31&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;br /&gt;22.09.2009 13:48:14&amp;nbsp;&amp;nbsp;&amp;nbsp; Installed PowerShell Commun... 60&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;br /&gt;27.09.2009 22:47:32&amp;nbsp;&amp;nbsp;&amp;nbsp; Installed SystemScripter&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 64&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN_SYSTEM_C... APPLICATION_I...&lt;/p&gt;
&lt;p&gt;The list will show all available restore points. &lt;strong&gt;SequenceNumber&lt;/strong&gt; is the unique identifier for any given restore point, and you can use this id to selectively access an individual restore point. &lt;strong&gt;RestorePointType&lt;/strong&gt; tells you who has created the restore point, and the switch parameter &lt;strong&gt;-lastStatus &lt;/strong&gt;tells you the result of the last restore point operation.&lt;/p&gt;
&lt;p&gt;To manually create a new restore point, for example at the beginning of a critical system change, use &lt;strong&gt;Checkpoint-Computer&lt;/strong&gt;. If you&amp;#39;d like to restore the system to a previous restore point, use Restore-Computer and specify the restore point you want to use. To change the scope of your restore points, use &lt;strong&gt;Enable-ComputerRestore&lt;/strong&gt; and &lt;strong&gt;Disable-ComputerRestore&lt;/strong&gt;. These cmdlets manage which drives should be included or excluded in your snapshots. And if you&amp;#39;d like to quickly check results with the GUI, call &lt;strong&gt;rstrui.exe&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;What&amp;#39;s Next?&lt;/h2&gt;
&lt;p&gt;All of the new cmdlets covered here live in the &lt;strong&gt;Microsoft.PowerShell.Management&lt;/strong&gt; Snapin. This snapin isn&amp;#39;t new, it was already part of PowerShell V1. While in PowerShell V1 it contained 47 cmdlets, it now delivers a solid 92 cmdlets - 45 new cmdlets! We looked at 11 new cmdlets, leaving 34 new cmdlets to check out in the next parts. Hang in!&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
&lt;p&gt;Tobias &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=3485" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Stop-Computer/default.aspx">Stop-Computer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Restore-Computer/default.aspx">Restore-Computer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Reset-ComputerMachinePassword/default.aspx">Reset-ComputerMachinePassword</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Checkpoint-Computer/default.aspx">Checkpoint-Computer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Get-ComputerRestorePoint/default.aspx">Get-ComputerRestorePoint</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Enable-ComputerRestore/default.aspx">Enable-ComputerRestore</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Restore/default.aspx">Restore</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Remove-Computer/default.aspx">Remove-Computer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Test-ComputerSecureChannel/default.aspx">Test-ComputerSecureChannel</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Restart-Computer/default.aspx">Restart-Computer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Add-Computer/default.aspx">Add-Computer</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Disable-ComputerRestore/default.aspx">Disable-ComputerRestore</category></item><item><title>Removing Private Key From Certificate</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/09/08/removing-private-key-from-certificate.aspx</link><pubDate>Tue, 08 Sep 2009 14:58:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:3333</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=3333</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/09/08/removing-private-key-from-certificate.aspx#comments</comments><description>&lt;p&gt;Ok, this may be not be the typical every-day question but I just had a friend ask how to remove a private key from a digital certificate. As it turned out, this is tricky.&lt;/p&gt;
&lt;h2&gt;Accessing Certificates&lt;/h2&gt;
&lt;p&gt;PowerShell does provide easy access to all of your installed digital certificates through its &lt;strong&gt;cert: drive&lt;/strong&gt;. So you could easily go ahead and search for any certificate. Let&amp;#39;s say you have a certificate installed with &amp;#39;test&amp;#39; in its subject name. Then this would be a way to get your hands on it:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;dir cert:\ -recurse | ? { $_.Subject -like &amp;#39;*test*&amp;#39; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To pick the first certificate found, you could store the result as an array and pick the first element like this:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;$certs = @(dir cert:\ -recurse | ? { $_.Subject -like &amp;#39;*test*&amp;#39; })&lt;br /&gt;$cert = $certs[0]&lt;br /&gt;$cert&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\Root&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;Thumbprint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Subject&lt;br /&gt;----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -------&lt;br /&gt;BE20521E22EA2920478F0DC9E172B0F1A431E054&amp;nbsp; CN=test1&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now, you could access the &lt;strong&gt;private key&lt;/strong&gt; stored in it:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS&amp;gt; $cert.HasPrivateKey&lt;br /&gt;True&lt;br /&gt;PS&amp;gt; $cert.PrivateKey&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;PublicOnly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : False&lt;br /&gt;CspKeyContainerInfo&amp;nbsp; : System.Security.Cryptography.CspKeyContainerInfo&lt;br /&gt;KeySize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 1024&lt;br /&gt;KeyExchangeAlgorithm :&lt;br /&gt;SignatureAlgorithm&amp;nbsp;&amp;nbsp; : &lt;/em&gt;&lt;a href="http://www.w3.org/2000/09/xmldsig#rsa-sha1"&gt;&lt;em&gt;http://www.w3.org/2000/09/xmldsig#rsa-sha1&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;PersistKeyInCsp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : True&lt;br /&gt;LegalKeySizes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : {System.Security.Cryptography.KeySizes}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, there is no way of deleting the private key (at least none&amp;nbsp;I found). This is strange because the oldfashioned CAPICOM used with VBScript did have the ability to remove a private key from a certificate. &lt;/p&gt;
&lt;p&gt;After searching MSDN for a while I decided to head another route which coincidentally demonstrates some other useful tricks with certificates. In order to remove the private key, I decided to export the existing certificate without private key, then delete the installed certificate and re-import it from the exported data. Here is how you do that:&lt;/p&gt;
&lt;h2&gt;Step 1: Get The Certificate&lt;/h2&gt;
&lt;p&gt;First, make sure you retrieve the certificate you want to strip the private key from. You have seen already how to do that. For example:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;$cert = @(dir cert:\CurrentUser\My -recurse | ? { $_.Subject -like &amp;#39;*TEST*&amp;#39; })[0]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You may want to check whether the certificate &lt;strong&gt;has a private key at all&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS&amp;gt; $cert.HasPrivateKey&lt;br /&gt;True&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Step 2: Export Certificate Without Private Key&lt;/h2&gt;
&lt;p&gt;Next, you need to &lt;strong&gt;export the certificate&lt;/strong&gt; without the private key and store it as byte array. That is pretty easy because the certificate has an &lt;strong&gt;Export()&lt;/strong&gt; method you can use:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;# export certificate&lt;br /&gt;$bytes = $cert.Export(&amp;#39;Cert&amp;#39;)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Delete Installed Certificate&lt;/h2&gt;
&lt;p&gt;Now, to &lt;strong&gt;get rid of the private key&lt;/strong&gt;, &lt;strong&gt;delete the installed certificate&lt;/strong&gt;. Of course, before you do that you should be aware of the consequences. You are losing the private key this way (but, after all, that was the idea). You also &lt;strong&gt;need admin privileges&lt;/strong&gt; so be sure to launch PowerShell in elevated mode if you are using UAC.&lt;/p&gt;
&lt;p&gt;Deleting a certificate is not just as straight-forward because the &lt;strong&gt;cert:&lt;/strong&gt; provider implemented in PowerShell does not support deleting certificates. So you need to resort to the raw .NET framework methods. First, &lt;strong&gt;open the certificate store&lt;/strong&gt; the certificate resides in (read/write mode) and then &lt;strong&gt;remove the certificate&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;# delete certificate&lt;br /&gt;$store = new-object system.security.cryptography.x509certificates.x509Store &amp;#39;My&amp;#39;, &amp;#39;CurrentUser&amp;#39;&lt;br /&gt;$store.Open(&amp;#39;ReadWrite&amp;#39;)&lt;br /&gt;$store.Remove($cert)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Step 4: Re-Import Certificate w/o Private Key&lt;/h2&gt;
&lt;p&gt;Since you exported the certificate without private key, all you need to do is &lt;strong&gt;re-import the exported certificate&lt;/strong&gt;. It will be restored but has now no private key anymore. To re-import a certificate, simply create a .NET &lt;strong&gt;x509Certificate2Collection &lt;/strong&gt;object and use its &lt;strong&gt;Import()&lt;/strong&gt; method to read in the byte array you exported earlier. BTW you could also specify a path to a &lt;strong&gt;.cert file&lt;/strong&gt; to import regular filebased certificates this way. Then, add the first element of your certificate collection to the certificate store you deleted the certificate from:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;# re-import certificate&lt;br /&gt;$container = new-object &lt;/em&gt;&lt;em&gt;system.security.cryptography.x509certificates.x509certificate2collection&lt;br /&gt;$container.Import($bytes)&lt;br /&gt;$store.Add($container[0])&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Step 5: Clean Up&lt;/h2&gt;
&lt;p&gt;Done. Almost. For sanitary reasons, don&amp;#39;t forget to close the certificate store you opened earlier:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;$store.close()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#39;s it: you successfully removed the private key from the certificate you chose. You also learned a couple of new ways to deal with certificate stores using raw .NET objects. Specifically, you have seen how you can delete and export/import certificates. Hope that helped...&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=3333" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Cert_3A00_/default.aspx">Cert:</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Certificate/default.aspx">Certificate</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/CAPICOM/default.aspx">CAPICOM</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Private+Key/default.aspx">Private Key</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/hasPrivateKey/default.aspx">hasPrivateKey</category></item><item><title>Test-Driving Remoting In Windows 7</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/08/29/test-driving-remoting-in-windows-7.aspx</link><pubDate>Sat, 29 Aug 2009 08:32:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:3251</guid><dc:creator>Tobias</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=3251</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/08/29/test-driving-remoting-in-windows-7.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Remoting&lt;/strong&gt; is among one of the most popular and powerful new PowerShell V2 features. What this means is that starting with PowerShell V2 (and starting with Windows 7 only because downlevel OS will support V2 remoting only in a future update), you can connect to other PowerShell V2 machines and run commands, scripts and jobs remotely. Very cool. &lt;/p&gt;
&lt;p&gt;Unless you work in a configured AD-Environment, setting up and test-driving remoting isn&amp;#39;t that easy, though. By default, in a peer-to-peer environment,&amp;nbsp; remoting is dead. I&amp;#39;d like to show you today in three easy steps how to set up a test peer-to-peer environment that you can use to play, show off&amp;nbsp;and demo V2 remoting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This will show you how to set up the &amp;quot;new&amp;quot; V2 remoting using WinRM which requires PowerShell V2 on both ends. &lt;/li&gt;
&lt;li&gt;Yes, there are other remoting techniques such as the old DCOM which will continue to work and neither require WinRM nor PS V2 (for example, use Get-WMIObject -computerName 10.10.10.10 to connect to that machine using classic DCOM)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What you need to make it happen...&lt;/h2&gt;
&lt;p&gt;To play with V2 remoting in a peer-to-peer scenario, this is what you need:&lt;/p&gt;
&lt;p&gt;Ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2x Windows 7 (one of which can be running inside Windows Virtual PC if you like)&lt;/li&gt;
&lt;li&gt;both machines may not be joined to a domain(!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Things are turned off&amp;nbsp;out-of-the-box...&lt;/h2&gt;
&lt;p&gt;First of all, figure out the IP addresses assigned to both machines and make sure they can reach each other via network. In this example, I will be using machine A with 192.168.2.105 and machine B with 192.168.2.107, so make sure you replace the IP addresses with yours.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;d like to establish a remote connection from machine A to machine B, you would use &lt;strong&gt;Enter-PSSession&lt;/strong&gt;, but if you try like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enter-PSSession 192.168.2.107&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;the cmdlet will bark at you and come up with all kinds of reasons in red letters stating why what you are trying to do is absolutely ridiculous. &lt;/p&gt;
&lt;p&gt;The simple fact is: the mechanism behind remoting which is called &lt;strong&gt;WinRM&lt;/strong&gt; has not yet been set up to accept a remoting connection nor is it likely that the WinRM service is running at all yet. WinRM is &lt;strong&gt;secure by default&lt;/strong&gt;, so you need to start it and open doors manually. What it also means is that you and only you will be liable if things go wrong and you trash your corporate infrastructure. So to prevent this from becoming a career-limiting move, you should set up a separate test environment to play with.&lt;/p&gt;
&lt;h2&gt;Step 1: Enable WinRM on both machines&lt;/h2&gt;
&lt;p&gt;The first thing you want to do is call &lt;strong&gt;Set-WSManQuickConfig&lt;/strong&gt;. This is actually your door-opener, and to successfully launch this command, you will need to (a) have admin privs and (b) be sure you do want to open the doors. Specifically, the command does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It makes sure the &lt;strong&gt;WinRM service is running&lt;/strong&gt; and sets the startmode to &lt;em&gt;Automatic&lt;/em&gt; so WinRM will be started automatically in the future. This enabled the computer to be connected via WinRM&lt;/li&gt;
&lt;li&gt;It sets up a WinRM &amp;quot;&lt;strong&gt;listener&lt;/strong&gt;&amp;quot; which is listening to incoming WinRM requests via http: from any IP address&lt;/li&gt;
&lt;li&gt;It sets up a &lt;strong&gt;firewall exception&lt;/strong&gt; so incoming WinRM requests aren&amp;#39;t rejected by your firewall any longer and make it to the WinRM service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, these really are door-openers, and unless you are working with a test system&amp;nbsp; in your closet, you may want to find out more about the possible security implications. &lt;span style="text-decoration:underline;"&gt;Note also that &lt;strong&gt;Set-WSManQuickConfig&lt;/strong&gt; might return an &lt;strong&gt;Access Denied&lt;/strong&gt; if you try and run it on a machine that is domain-joined&lt;/span&gt;. Everything you read here applies to a simple peer-to-peer scenario only. Domain-joined machines are a different ballgame because they use Kerberos to securely authenticate requests and chances are in a domain-based environment you do not need all of this anyway because your IT department has decided for you.&lt;/p&gt;
&lt;p&gt;Once you ran &lt;strong&gt;Set-WSManQuickConfig&lt;/strong&gt; on both machines, your &lt;strong&gt;Enter-PSSession&lt;/strong&gt; command still fails because again, for security reasons, WinRM rejects requests unless they are guarded by Kerberos or an equally safe mechanism. However, if you did everything right, both machines can now at least use WinRM to talk to each other:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test-WSMan 192.168.2.107&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This should return some protocol information.&lt;/p&gt;
&lt;h2&gt;Step 2: Add Computers to TrustedHosts list&lt;/h2&gt;
&lt;p&gt;Next, since you are working in a basic peer-to-peer environment, you need to convince WinRM that it is actually safe to accept requests from the other machine. You do this by adding the machine IPs to the list of so called &amp;quot;&lt;strong&gt;trusted hosts&lt;/strong&gt;&amp;quot; - or, if you want to open the door even more, simply add a &amp;quot;*&amp;quot; to that list and allow any IP to talk to the machine. So on both machines, execute this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Set-Item WSMan:\localhost\client\trustedhosts * -force&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Enjoy!&lt;/h2&gt;
&lt;p&gt;Once you did this last step, you are up and running. When you now enter&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enter-PSSession 192.168.2.107&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;after a couple of seconds of finger crossing (while WinRM sets up the remote PS session), you see the PS prompt of the remote system and now can work remotely on&amp;nbsp; that machine. Everything is working fine now, and you can also explore all the other fine remoting features. Dunno which remoting features there are? Hang in, we&amp;#39;ll be back shortly with more examples! &lt;/p&gt;
&lt;p&gt;Oh, by the way, this will only work if you have created the &lt;strong&gt;same user account&lt;/strong&gt; with the same password on both machines (remember, we are in a peer-to-peer environment here). Of course, the user on machine A initiating the connection needs to have admin privs on the target machine. To authenticate as someone else, use &lt;strong&gt;-credential (Get-Credential)&lt;/strong&gt; as parameter.&lt;/p&gt;
&lt;p&gt;ff you are wondering how to leave the remoting session you just opened, simply type:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;exit-pssession&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Have a wonderful day (and fun with the awesome V2 remoting!)&lt;/p&gt;
&lt;p&gt;Yours, Tobias&lt;/p&gt;
&lt;p&gt;&lt;img src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.32.68/portraitSmall2.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=3251" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Remoting/default.aspx">Remoting</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Enter-PSSession/default.aspx">Enter-PSSession</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Test-WSMan/default.aspx">Test-WSMan</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Exit-PSSession/default.aspx">Exit-PSSession</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Set-WSManQuickConfig/default.aspx">Set-WSManQuickConfig</category></item><item><title>Using PowerShell in Windows 7 - Part 1</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/07/16/using-powershell-in-windows-7-part-1.aspx</link><pubDate>Thu, 16 Jul 2009 14:47:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:2890</guid><dc:creator>Tobias</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=2890</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/07/16/using-powershell-in-windows-7-part-1.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Windows 7&lt;/strong&gt; is going to be the first operating system that actually ships with Windows PowerShell (rather than having to install PowerShell separately) and&amp;nbsp;comes with the&amp;nbsp;new &lt;strong&gt;PowerShell V2&lt;/strong&gt;. Enough great reasons to take a closer look.&lt;/p&gt;
&lt;p&gt;&amp;Iacute;n this first part of what is going to be an ongoing series, we start small. You will only learn about one new V2 feature: &lt;strong&gt;Modules&lt;/strong&gt;. You will, however, get all the information you need to start playing with PowerShell on W7. As we continue, we dive deeper and eventually touch all of the new features - and believe me, there are a lot!&lt;/p&gt;
&lt;h2&gt;Pinning PowerShell&lt;/h2&gt;
&lt;p&gt;To launch PowerShell, you could&amp;nbsp;press &lt;strong&gt;WIN+R&lt;/strong&gt; and enter &lt;em&gt;powershell&lt;/em&gt;. That&amp;#39;s ok. That&amp;#39;s how we did it with the old console, too. However, in W7 there are smarter ways.&lt;/p&gt;
&lt;p&gt;One is to &lt;strong&gt;pin&lt;/strong&gt; PowerShell to the new taskbar. Simply right-click the PowerShell icon in the taskbar (which appears automatically once you launch PowerShell) and choose &amp;quot;Pin this program to the taskbar&amp;quot;. That&amp;#39;s it. Now, you&amp;nbsp;got a PowerShell icon in your taskbar, and it stays there even if&amp;nbsp;no PowerShell window is open anymore. And yes, pinning an application to the taskbar has a *lot* of additional advantages, it&amp;#39;s not just good for making applications more accessible. Hang in a second.&lt;/p&gt;
&lt;p&gt;You first may want to move the new PowerShell icon in your taskbar more to the left. It is more organized that way when all pinned applications are located on the left side. If you do move the PowerShell icon to the very first position in your taskbar, you&amp;nbsp;now can even launch PowerShell without&amp;nbsp;touching the mouse,&amp;nbsp;simply by pressing &lt;strong&gt;WIN+1&lt;/strong&gt; (and, uhm,&amp;nbsp;yes, you can press &lt;strong&gt;WIN+2&lt;/strong&gt; if it is the &lt;em&gt;second&lt;/em&gt; icon in your taskbar. Go figure.).&lt;/p&gt;
&lt;p&gt;Pinning PowerShell to the taskbar makes the console prettier, too. It will launch with the typical blueish background and in a larger console. Even more benefits are waiting for you in its new &lt;strong&gt;jump list&lt;/strong&gt;. Right click your PowerShell icon (or drag it towards the desktop) to open the jump list. It contains all the commands you may ever need to launch PowerShell: launch it with or without administrator privileges, launch the PowerShell ISE, launch it with all modules auto-imported, or simply open the electronic manual. Hey, that&amp;#39;s a convenient one-stop-shop.&lt;/p&gt;
&lt;h2&gt;Exploring Modules&lt;/h2&gt;
&lt;p&gt;Windows 7 includes not just PowerShell V2 but also comes with a number of &lt;strong&gt;modules&lt;/strong&gt;. Modules are new in PowerShell V2. They are actually extensions much similar to the V1 &lt;strong&gt;Snapins&lt;/strong&gt;. Unlike Snapins, Modules do not require installation. To see the modules Windows brings along, fire up this command:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get-Module -ListAvailable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows 7 comes with these modules preconfigured: &lt;strong&gt;AppLocker&lt;/strong&gt; (allows you to control which applications and installation packages a user can run, based on local or domain-wide policies), &lt;strong&gt;BitsTransfer&lt;/strong&gt; (opens up the intelligent background transfer service to you so you can silently upload and download large files in the background), &lt;strong&gt;PSDiagnostics&lt;/strong&gt; and &lt;strong&gt;TroubleshootingPack&lt;/strong&gt; (which both refer to the built-in PowerShell-based self-diagnosis we will cover later). You may also see a module named &lt;strong&gt;GroupPolicy&lt;/strong&gt; which comes with the R2 GPMC and enables you to view, analyze and even create group policy objects and links.&lt;/p&gt;
&lt;p&gt;There are even more modules available when you install &lt;strong&gt;RSAT for Windows&lt;/strong&gt; 7. RSAT (Remote Server Administration Tools) is like &lt;strong&gt;adminpak.msi&lt;/strong&gt; in earlier windows versions and installs all the administration tools you may be used to. In addition, it also installs a module called &lt;strong&gt;ActiveDirectory&lt;/strong&gt; with tons of Cmdlets to manage your Active Directory - finally!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Watch out: &lt;/em&gt;&lt;/strong&gt;Once you downloaded and installed RSAT, the Active Directory module still&amp;nbsp;isn&amp;#39;t there. It is not installed by default. You need to open control panel first, go to Software and then look at the available Windows features. In this list, you will eventually find the Remote Server Administration Tools, and when you dig deeper into its options, you stumble over the PowerShell ActiveDirectory module. Check it, and click OK. A minute later, PowerShell finds and lists the new ActiveDirectory module.&lt;/p&gt;
&lt;h2&gt;Using Modules&lt;/h2&gt;
&lt;p&gt;Before you can use a module, you need to import it using &lt;strong&gt;Import-Module&lt;/strong&gt;. So for example, to use the new Cmdlets contained in the AppLocker module, fire up this one:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Import-Module AppLocker&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Or, you open the jump list of your pinned powershell console as described earlier and open PowerShell with all available modules preloaded automatically. Note however that this console will also enable all Admin rights.&lt;/p&gt;
&lt;p&gt;To check out which new Cmdlets you got, use this line:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get-Command -Module AppLocker&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And to see a bunch of real-life scenarios and examples, simply extend the line and use the good old pipeline to pipe the Cmdlets to &lt;strong&gt;Get-Help&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get-Command -Module AppLocker | Get-Help -example&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What&amp;#39;s Next?&lt;/h2&gt;
&lt;p&gt;I guess this is a pretty quick start to begin playing. You now know how to pin PowerShell, open it with and without admin privileges and modules. You also know how to find out which modules exist, which commands exist in each module, and how to get help for them. Ain&amp;#39;t enough? In the next part, we&amp;#39;ll look at remoting and how to enable it in a simple peer-to-peer test environment: &lt;br /&gt;&lt;a target="_self" href="http://powershell.com/cs/blogs/tobias/archive/2009/08/30/test-driving-remoting-in-windows-7.aspx"&gt;Part 2: Make remoting work in Windows 7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Have a great weekend!&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=2890" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Module/default.aspx">Module</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Get-Command/default.aspx">Get-Command</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Get-Module/default.aspx">Get-Module</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Import-Module/default.aspx">Import-Module</category></item><item><title>Embedding native commands</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/05/25/embedding-native-commands.aspx</link><pubDate>Sun, 24 May 2009 21:13:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:2579</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=2579</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/05/25/embedding-native-commands.aspx#comments</comments><description>&lt;p&gt;One little known fact is that you can use the PowerShell pipeline to actually feed information into a native command. Why would that be breath taking?&lt;/p&gt;
&lt;h2&gt;Automating Native Commands&lt;/h2&gt;
&lt;p&gt;Because there are tools like &lt;strong&gt;DiskPart&lt;/strong&gt;. They are important but they only support an interactive mode or batch files. With the PowerShell pipeline, you can feed your commands into the native command as if you had typed them in interactively. Now, isn&amp;#39;t that awesome?&lt;/p&gt;
&lt;p&gt;Before you try for yourself, be aware that DiskPart requires admin privileges. So on a box with UAC, make sure you launch PowerShell with full admin rights in the first place. If you don&amp;#39;t, DiskPart will elevate itself automatically and break the pipeline.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s try and get the list of drives:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;list disk&amp;quot; | diskpart&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It works. The result is plain text, and of course you probably get a lot more information than you wanted. Fortunately, DiskPart indents the important information so you could add a little filter, letting through only lines that start with two blank spaces:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;list disk&amp;quot; | diskpart | ? { $_.StartsWith(&amp;#39;&amp;nbsp; &amp;#39;) }&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not bad. So the first learning point here is: whenever a command (any command, not just DiskPart)&amp;nbsp;requires interactive information, simply place it onto the pipeline and pass it on to the command. It is a bit like writing to StdIn in earlier days, just a lot easier.&lt;/p&gt;
&lt;h2&gt;Creating New Virtual Hard Drives (VHDs)&lt;/h2&gt;
&lt;p&gt;The really exciting part starts when you combine batches of commands to do more complex things. For example, I played a bit with Windows 7 virtual hard drives (VHD). The following code will generate a new VHD for you:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path = Read-Host &amp;quot;Enter Path to VHD&amp;quot;&lt;br /&gt;$label = Read-Host &amp;quot;Enter Drive Label&amp;quot;&lt;br /&gt;$maximum = Read-Host &amp;quot;Enter maximum Size in MB&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$type = &amp;quot;fixed&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$command&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; @&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;create vdisk file=&amp;quot;&lt;/span&gt;&lt;/span&gt;$path&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot; maximum=$maximum type=$type&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;select vdisk file=&amp;quot;&lt;/span&gt;&lt;/span&gt;$path&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;attach vdisk&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;create partition primary&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;assign letter=$letter&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;format quick label=&amp;quot;&lt;/span&gt;&lt;/span&gt;$label&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;@&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$command&lt;/span&gt;&lt;/span&gt;| &lt;br /&gt;DiskPart | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Length&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 0 } | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Foreach-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Write-Progress&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Activity&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Creating New VHD&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Status&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Id&lt;/span&gt;&lt;/span&gt; 1}&lt;/div&gt;
&lt;h2&gt;Adding &amp;quot;UI&amp;quot; to Native Commands&lt;/h2&gt;
&lt;p&gt;What you see here is a batch of six commands. DiskPart accepts them step by step and executes the appropriate action. &lt;/p&gt;
&lt;p&gt;Normally, DiskPart would output progress information directly to the console. Here, &lt;strong&gt;Write-Progress&lt;/strong&gt; takes the results from DiskPart in real time as they occur and displays them in a neat progress bar, preventing garbage information to appear in your console.&lt;/p&gt;
&lt;p&gt;The second learning point is: pipe the results from any native command to Write-Progress, and you will immediately get a nice output. Low hanging fruits to convert a nasty old command line tool into something more sophisticated.&lt;/p&gt;
&lt;h2&gt;New-VHD&amp;nbsp;- a home-made new PowerShell function for Windows 7&lt;/h2&gt;
&lt;p&gt;Taking all of this and combining it, here is a quick and dirty new PowerShell function called New-VHD. It takes care of the most common errors (target file already exists, drive letter already exists) and uses DiskPart (on Windows 7) to create new virtual hard disks.&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-VHD&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;param&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$maximum&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;200, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$letter&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$label&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;New Disk&amp;#39;&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$type&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;fixed&amp;#39;&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;test-path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;Throw &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;Target path &amp;#39;$path&amp;#39; exists and cannot be overwritten.&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;test-path&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;$($letter):\&amp;quot;&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;Throw &lt;span style="color:#800000;"&gt;&lt;span class="string"&gt;&amp;quot;Drive letter &amp;#39;$letter&amp;#39; is taken. Choose another one.&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$command&lt;/span&gt;&lt;/span&gt;&lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; @&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;create vdisk file=&amp;quot;&lt;/span&gt;&lt;/span&gt;$path&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot; maximum=$maximum type=$type&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;select vdisk file=&amp;quot;&lt;/span&gt;&lt;/span&gt;$path&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;attach vdisk&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;create partition primary&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;assign letter=$letter&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;format quick label=&amp;quot;&lt;/span&gt;&lt;/span&gt;$label&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;@&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$command&lt;/span&gt;&lt;/span&gt;| &lt;br /&gt;DiskPart | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Where-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Length&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-gt&lt;/span&gt;&lt;/span&gt; 0 } | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Foreach-Object&lt;/span&gt;&lt;/span&gt; { &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Write-Progress&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Activity&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;Creating New VHD&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Status&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Id&lt;/span&gt;&lt;/span&gt; 1}&lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;&lt;em&gt;One important thing to note: Whenever you batch-process more than one command, you run into the risk that something unexpected happens. For example, when you try and create a new VHD and this fails, all subsequent commands will still run and maybe cause undesired effects. So there is some risk attached to this. This is why you should take this into account and wrap appropriate error handling around it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have fun and don&amp;#39;t forget to enjoy the sun!&lt;/p&gt;
&lt;p&gt;-Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=2579" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Write-Progress/default.aspx">Write-Progress</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/DiskPart/default.aspx">DiskPart</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Pipeline/default.aspx">Pipeline</category></item><item><title>Test driving Windows 7 RC and PowerShellPlus 3.0 on Virtual PC</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/05/02/test-driving-windows-7-rc-and-powershellplus-3-0-on-virtual-pc.aspx</link><pubDate>Sat, 02 May 2009 12:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:2415</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=2415</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/05/02/test-driving-windows-7-rc-and-powershellplus-3-0-on-virtual-pc.aspx#comments</comments><description>&lt;p&gt;Windows 7 RC is out, and finally a bug has been fixed that prevented PowerShellPlus from running.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;d like to play with our brand new PowerShell Plus 3.0 on the brand new Windows 7 Release Candidate, here is what you need:&lt;/p&gt;
&lt;p&gt;First, get Windows 7 RC. MSDN and TechNet subscribers can download it via their subscriptions. Microsoft announced a publicly available version starting May 5.&lt;/p&gt;
&lt;p&gt;Next, if you want to install it in a virtual environment, be sure you have upgraded to VirtualPC 2007 SP1 (6.0.192.0). Older versions of VirtualPC 2007 will present a blue screen once you install the VM additions. You can get VirtualPC 2007 SP1 here:&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;span style="font-size:x-small;color:#0000ff;"&gt;&lt;span style="font-size:x-small;color:#0000ff;"&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28c97d22-6eb8-4a09-a7f7-f6c7a1f000b5&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=28c97d22-6eb8-4a09-a7f7-f6c7a1f000b5&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:x-small;color:#0000ff;"&gt;&lt;span style="font-size:x-small;color:#0000ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(thanks Alex for this link!)&lt;/p&gt;
&lt;p&gt;Finally, download a free trial copy of PowerShell Plus 3.0 here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.idera.com/Products/PowerShell/PowerShell-Plus/"&gt;http://www.idera.com/Products/PowerShell/PowerShell-Plus/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=2415" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/VirtualPC/default.aspx">VirtualPC</category></item><item><title>Using QuickClick Solutions in Beta2</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/03/09/using-quickclick-solutions-in-beta2.aspx</link><pubDate>Mon, 09 Mar 2009 08:16:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1779</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=1779</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/03/09/using-quickclick-solutions-in-beta2.aspx#comments</comments><description>&lt;p&gt;PowerShell Plus Beta2 has a significant new feature: &lt;strong&gt;QuickClick solutions&lt;/strong&gt;. Since it is new and pretty cool, I&amp;#39;d like to give you a quick walk-through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QuickClick Solutions&lt;/strong&gt; are trees that can store either simple one-liner commands or complex scripts. With a &lt;strong&gt;QuickClick Solutions&lt;/strong&gt; Tree, you can&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reminder:&lt;/strong&gt; quickly and conveniently save commands you often need&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organizer:&lt;/strong&gt; use the tree as your personal PowerShell script organizer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solutions Pack:&lt;/strong&gt; transfer knowledge from an experienced PS user to beginners&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demo:&lt;/strong&gt; create interactive demos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share:&lt;/strong&gt; share PowerShell expertise from a specific area with others&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.21.03/pspbeta2_2D00_2.png" alt="" /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Showing And Hiding QuickClick Solutions&lt;/h2&gt;
&lt;p&gt;To show or hide the &lt;strong&gt;QuickClick Solutions&lt;/strong&gt; panel, simply hit &lt;strong&gt;CTRL+I&lt;/strong&gt; or use &lt;em&gt;View-QuickClick Solutions&lt;/em&gt;. Note that this feature was introduced in version 2.1.0.45 (Beta2). You may want to upgrade to that version.&lt;/p&gt;
&lt;p&gt;The tree panel is a regular docking window so you can pin, dock and undock the panel. However, the best way is to keep the tree docked at the left side and use &lt;strong&gt;CTRL+I&lt;/strong&gt; to show and hide when necessary. Position your mouse cursor over the right border of the docked control to make it wider.&lt;/p&gt;
&lt;h2&gt;Using Existing QuickClick Solutions&lt;/h2&gt;
&lt;p&gt;From an end-users perspective, all you need to do is to expand a QuickClick solutions tree and select the command you would like to try. When you hover over a node, a tooltip appears and shows you a preview of the code stored in this node, along with a description (if the node has one).&lt;/p&gt;
&lt;p&gt;You can either double-click a selected tree node or select it and press ENTER. In both cases, the command stored inside the selected node is typed into your console. Press ENTER again to actually execute the code.&lt;/p&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;Note: The tree will never execute code right away because you and only you can decide whether code is beningn or not and whether you want to execute it. This is why the tree only inserts code into the console but leaves it to you to actually press &lt;strong&gt;ENTER&lt;/strong&gt; to execute it. If you must execute code in&amp;nbsp; one step, hold &lt;strong&gt;CTRL&lt;/strong&gt; while double-clicking a node.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There are a couple of tricks you can use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you insert a node code by pressing &lt;strong&gt;ENTER&lt;/strong&gt;, you typically press &lt;strong&gt;ENTER &lt;/strong&gt;again to try out the code. Then, you can press &lt;strong&gt;TAB&lt;/strong&gt; to return selection back to the tree. This way, you do not need to use the mouse to work your way through a tree.&lt;/li&gt;
&lt;li&gt;You can drag &amp;amp; drop a node into any text-based program that accepts text drag&amp;amp;drop such as the script editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reorganizing Your Tree&lt;/h2&gt;
&lt;p&gt;You can easily reorganize your tree in any way you want. Simply drag and drop tree folders or tree nodes to other locations in your tree. This way, you can change order, place items inside a container, etc.&lt;/p&gt;
&lt;p&gt;To delete folders or nodes you no longer need, select them and press &lt;strong&gt;DEL&lt;/strong&gt;.&lt;/p&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;Note: Currently, you cannot select more than one item in the tree which is a limitation of the underlying treeview control.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Adding New Items To Your Tree&lt;/h2&gt;
&lt;p&gt;Your &lt;strong&gt;QuickClick Solutions Tree&lt;/strong&gt; can grow. To add new folders or items, right click the folder or item you would like to use as a starting point, then choose &lt;strong&gt;New&lt;/strong&gt; in the context menu. Or, use these keyboard shortcuts:&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/pspbeta2_2D00_6.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;CTRL+SHIFT+F: New Folder&lt;br /&gt;CTRL+SHIFT+L: New One-Liner&lt;br /&gt;CTRL+SHIFT+N: New Script&lt;/p&gt;
&lt;p&gt;To rapidly add code to your tree, you can also create a new one-liner that automatically contains the text you entered into the console or a script that contains the script actively open in the script editor.&lt;/p&gt;
&lt;p&gt;Here is how you add a new one-liner:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Play with code in the interactive console until it really works the way you like.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;ARROWUP&lt;/strong&gt; to bring back the code you entered last into the console&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;CTRL+SHIFT+C&lt;/strong&gt; to create a new One-Liner node in your solutions tree. Its name is selected so you can immediately assign it a new name.&lt;/li&gt;
&lt;li&gt;Optionally, drag and drop the new node to a better position in your tree&lt;/li&gt;
&lt;li&gt;Whenever you select your new item and press &lt;strong&gt;ENTER&lt;/strong&gt;, the code you saved is typed into the console&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With this approach, you can rapidly create demos, too.&lt;/p&gt;
&lt;p&gt;And here is how you add a new script node:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the built-in editor, i.e. press &lt;strong&gt;CTRL+E&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Load a script, or create a script and make sure you save it&lt;/li&gt;
&lt;li&gt;Go back to the console, and press &lt;strong&gt;CTRL+SHIFT+S&lt;/strong&gt;. A new script item is inserted into the tree. Its name is selected so you can assign a better name.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;Note: When you insert a script into the tree, the node gets a blue PS icon. This is a script link. The node points to your actual script. Script nodes are a great way for you to organize your PowerShell scripts because once you have inserted a script file into the tree, you can safely drag&amp;amp;drop it inside the tree and categorize it into whatever folder you want without touching the original script the node points to.&lt;/span&gt;&lt;/p&gt;
&lt;p class="style1"&gt;To make organizing even easier, you can also drag and drop &lt;strong&gt;PS1&lt;/strong&gt; script files right into the tree.&lt;/p&gt;
&lt;p class="style1"&gt;&lt;img src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.21.03/pspbeta2_2D00_7.png" alt="" /&gt;&lt;/p&gt;
&lt;p class="style1"&gt;Alternatively, you can embed scripts into the tree, too. This way, the tree stores the script code, and the external script reference is no longer needed. Embedding scripts is cool when you plan to share your tree with others. To embed a script, right-click it and choose &lt;strong&gt;Embed&lt;/strong&gt;. It turns into a green icon.&lt;/p&gt;
&lt;h2&gt;Creating A New QuickClick Solutions Tree&lt;/h2&gt;
&lt;p&gt;You can create and use as many QuickClick Solutions trees as you want. To create a new tree, To create a new solutions tree, right-click the name of an existing tree and choose &lt;strong&gt;Add New&lt;/strong&gt;. A submenu opens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blank Panel: &lt;/strong&gt;opens a new blank panel. This is best when you plan to create a new panel from scratch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load Panel:&lt;/strong&gt; enables you to open a panel you saved before. Use this if you share trees and would like to load a new one you have received from a friend&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Factory Default:&lt;/strong&gt; Preloads the standard panel we ship with the product&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;Note: You can copy and paste items between trees. Simply select a node or container, then press &lt;strong&gt;CTRL+C&lt;/strong&gt; to copy. Select a different panel and different tree, and press &lt;strong&gt;CTRL+V&lt;/strong&gt; to insert the selected item.&lt;/span&gt;&lt;/p&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;&lt;img src="http://powershell.com/cs/cfs-file.ashx/__key/CommunityServer.Components.UserFiles/00.00.00.21.03/pspbeta2_2D00_8.png" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Exporting Trees To Share With Others&lt;/h2&gt;
&lt;p&gt;To export a tree, all you really need to do is to save it as XML to file. Right-click the tree to open a context menu with the &lt;strong&gt;Save As&lt;/strong&gt;-command. Once saved, you simply share the XML file with others (see below).&lt;/p&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;Note: When you export a tree, make sure you convert all script nodes to embedded scripts so you do not break links between your tree and external scripts. There is currently no way to do that automatically yet.&lt;/span&gt;&lt;/p&gt;
&lt;p class="style1"&gt;Do not use &lt;strong&gt;Save As&lt;/strong&gt; and save the tree to a USB stick directly because when you remove the stick and restart PowerShellPlus, it would no longer find the tree file and remove it automatically from your panels.&lt;/p&gt;
&lt;h2&gt;Loading And Merging Panels&lt;/h2&gt;
&lt;p&gt;The best way of loading new trees is by dragging and dropping one or more XML definition files into the &lt;strong&gt;QuickClick Solutions&lt;/strong&gt; panel. You then get options:&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/pspbeta2_2D00_9.png" alt="" /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Merge:&lt;/strong&gt; The content is merged into the existing tree. This way, you can add new items to an existing tree&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replace:&lt;/strong&gt; The current tree is closed and the new one loaded instead&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New Panel:&lt;/strong&gt; The new tree is opened inside a new panel&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="style1"&gt;&lt;span style="color:#008000;"&gt;Note: There is still a bug. When you choose &lt;strong&gt;Cancel&lt;/strong&gt;, the tree is still loaded. &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Call To Action&lt;/h2&gt;
&lt;p&gt;Please let us know what you think and share feedback: &lt;a href="http://powershell.com/cs/forums/93.aspx"&gt;Visit Beta Place&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To read more about PowerShell Plus Beta2 and where to get it, &lt;a href="http://powershell.com/cs/blogs/news/archive/2009/03/08/powershellplus-beta2-available.aspx"&gt;here are all details&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Have a lot of fun,&lt;/p&gt;
&lt;p&gt;may the PowerShell be with you,&lt;/p&gt;
&lt;p&gt;-Tobias&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=1779" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/PowerShellPlus/default.aspx">PowerShellPlus</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/QuickClick/default.aspx">QuickClick</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Solution/default.aspx">Solution</category></item><item><title>XML Part 2: Write, Add And Change XML Data</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/02/02/xml-part-2-write-add-and-change-xml-data.aspx</link><pubDate>Mon, 02 Feb 2009 02:11:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:1310</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=1310</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/02/02/xml-part-2-write-add-and-change-xml-data.aspx#comments</comments><description>&lt;p&gt;In the previous post, I demonstrated how PowerShell handles XML data and how easy it is to load XML from a file or the Internet and then analyze its content. Today, I&amp;#39;d like to share how you can change and append XML data.&lt;/p&gt;
&lt;h2&gt;Creating Sample XML&lt;/h2&gt;
&lt;p&gt;I&amp;#39;d like to start this by creating an XML template. I don&amp;#39;t bother using special XML functionality. Instead, I simply write the XML template using plain text like this:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$template&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;lt;employee&amp;nbsp;version=&amp;#39;1.0&amp;#39;&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;person&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;firstname&amp;gt;Tobias&amp;lt;/firstname&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;lastname&amp;gt;Weltner&amp;lt;/lastname&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;/person&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;/employee&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;quot;&lt;br /&gt;&amp;gt;&amp;gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$template&lt;br /&gt;&amp;lt;employee&amp;nbsp;version=&amp;#39;1.0&amp;#39;&amp;gt;&lt;br /&gt;&amp;lt;person&amp;gt;&lt;br /&gt;&amp;lt;firstname&amp;gt;Tobias&amp;lt;/firstname&amp;gt;&lt;br /&gt;&amp;lt;lastname&amp;gt;Weltner&amp;lt;/lastname&amp;gt;&lt;br /&gt;&amp;lt;/person&amp;gt;&lt;br /&gt;&amp;lt;/employee&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$template&amp;nbsp;|&amp;nbsp;Out-File&amp;nbsp;$home\template.xml&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Loading Sample XML&lt;/h2&gt;
&lt;p&gt;Next, I load my XML template into an XML object. This gives me the ability to browse and analyze the content of my XML file. If you have questions regarding browsing the XML content, please take a look at &lt;a href="http://powershell.com/cs/blogs/tobias/archive/2009/01/17/xml-part-1-playing-with-rss-feeds-and-xml-content.aspx"&gt;Part1&lt;/a&gt; of this blog.&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;XML&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.Load(&amp;quot;$home\template.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml&lt;br /&gt;&lt;br /&gt;employee&lt;br /&gt;--------&lt;br /&gt;employee&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.employee&lt;br /&gt;&lt;br /&gt;version&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person&lt;br /&gt;-------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&lt;br /&gt;1.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;person&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.employee.person&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Tobias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Weltner&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.employee.person.firstname&lt;br /&gt;Tobias&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Manipulating XML Content&lt;/h2&gt;
&lt;p&gt;Once you have loaded the XML into an XML object, it is amazingly simple to change and update its content. Let&amp;#39;s say I&amp;#39;d like to change my lastname to a different name. First, I select the data I want to change. Next, I change it. That is all:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml.employee.person&amp;nbsp;|&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.lastname&amp;nbsp;-eq&amp;nbsp;&amp;#39;Weltner&amp;#39;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Tobias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Weltner&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.employee.person&amp;nbsp;|&amp;nbsp;&lt;br /&gt;&amp;gt;&amp;gt; Where-Object&amp;nbsp;{&amp;nbsp;$_.lastname&amp;nbsp;-eq&amp;nbsp;&amp;#39;Weltner&amp;#39;&amp;nbsp;}&amp;nbsp;|&amp;nbsp;&lt;br /&gt;&amp;gt;&amp;gt; ForEach-Object&amp;nbsp;{&amp;nbsp;$_.lastname&amp;nbsp;=&amp;nbsp;&amp;#39;NewName&amp;#39;&amp;nbsp;}&lt;br /&gt;&amp;gt;&amp;gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.employee.person&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Tobias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NewName&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Saving Changes As New XML File&lt;/h2&gt;
&lt;p&gt;All changes occur in memory inside your loaded XML object. To persist your changes to an updated XML file, you use the &lt;strong&gt;Save()&lt;/strong&gt; method found as part of your XML object. Before I save my changes to a new file, I also update the version attribute I originally added to the &lt;strong&gt;&amp;lt;employee&amp;gt;&lt;/strong&gt; node:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml.employee.version&amp;nbsp;=&amp;nbsp;&amp;quot;2.0&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.Save(&amp;quot;$home\updated.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;Get-Content&amp;nbsp;$home\updated.xml&lt;br /&gt;&amp;lt;employee&amp;nbsp;version=&amp;quot;2.0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;person&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;firstname&amp;gt;Tobias&amp;lt;/firstname&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;lastname&amp;gt;NewName&amp;lt;/lastname&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/person&amp;gt;&lt;br /&gt;&amp;lt;/employee&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As you can see, all changes have been written to proper XML. I do not need to fiddle with XML object model methods to make all of this happen.&lt;/p&gt;
&lt;h2&gt;Adding New Data To XML&lt;/h2&gt;
&lt;p&gt;Changing existing data inside an XML file is easy. But how do I add new data? Let&amp;#39;s say I want to add a new person to my employee list. Here is how you do it:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$oldperson&amp;nbsp;=&amp;nbsp;@($xml.employee.person)[0]&lt;br /&gt;PS&amp;gt;&amp;nbsp;$oldperson&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Tobias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NewName&lt;br /&gt;PS&amp;gt;&amp;nbsp;$newperson&amp;nbsp;=&amp;nbsp;$oldperson.Clone()&lt;br /&gt;PS&amp;gt;&amp;nbsp;$newperson.firstname&amp;nbsp;=&amp;nbsp;&amp;quot;Cofi&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$newperson.lastname&amp;nbsp;=&amp;nbsp;&amp;quot;Weltner&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$newperson&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Cofi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Weltner&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;To add a new entry to my XML, I first grab an existing entry. Since my XML only contains one person at this time, I make sure I wrap the call in &lt;strong&gt;@()&lt;/strong&gt;. This way, I always receive an array even though there is only one entry. Without this statement, PowerShell would have returned the person item right away. Next, I read the first person from that array using index #0 and store it as &lt;strong&gt;$oldperson&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$oldperson&lt;/strong&gt; is still connected to my XML file and still represents the old person. So if I made changes to this object, I would actually manipulate the existing person. To add a new person, I call &lt;strong&gt;Clone()&lt;/strong&gt; to create an independent clone of that object and store it in &lt;strong&gt;$newperson&lt;/strong&gt;. This object now is a new data entry, and I can go ahead and change its properties to anything I want.&lt;/p&gt;
&lt;h2&gt;Inserting New Data Into XML&lt;/h2&gt;
&lt;p&gt;Right now,&lt;strong&gt; $newperson&lt;/strong&gt; is not connected to my XML. Instead, it just hangs around in memory. To make it part of my XML file, I need to insert it into my XML at the position I want. I want $newperson to be part of my employees so I add it like this:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml.employee.AppendChild($newperson)&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Cofi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Weltner&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.employee.person&lt;br /&gt;&lt;br /&gt;firstname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastname&lt;br /&gt;---------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------&lt;br /&gt;Tobias&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NewName&lt;br /&gt;Cofi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Weltner&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;It worked: The new person now is part of my XML, and all I needed to do now is to save the appended XML to file to persist my changes. It really is that easy!&lt;/p&gt;
&lt;h2&gt;Creating A List Of Local Users&lt;/h2&gt;
&lt;p&gt;To illustrate how all of this works, I&amp;#39;d like to show you a quick example. It queries WMI for all local user accounts and creates a nice XML file. &lt;/p&gt;
&lt;p&gt;First of all, I need to figure out how to get the user data I want to wrap as XML. As it turns out, &lt;strong&gt;Get-WMIObject&lt;/strong&gt; does the job for me. The information is contained in the &lt;strong&gt;Win32_UserAccount&lt;/strong&gt; class. Since I am only interested in local accounts, I make sure I query only for instances with &lt;strong&gt;LocalAccount&lt;/strong&gt; set to &lt;strong&gt;true&lt;/strong&gt;. I filter this on the server side because querying all accounts in a large enterprise could otherwise take a long time:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Get-WmiObject&amp;nbsp;win32_useraccount&amp;nbsp;-filter&amp;nbsp;&amp;#39;LocalAccount=true&amp;#39;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AccountType&amp;nbsp;:&amp;nbsp;512&lt;br /&gt;Caption&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;PCNEU01\Administrator&lt;br /&gt;Domain&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;PCNEU01&lt;br /&gt;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;S-1-5-21-2613171836-1965730769-3820153312-500&lt;br /&gt;FullName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Administrator&lt;br /&gt;&lt;br /&gt;AccountType&amp;nbsp;:&amp;nbsp;512&lt;br /&gt;Caption&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;PCNEU01\ASPNET&lt;br /&gt;Domain&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;PCNEU01&lt;br /&gt;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;S-1-5-21-2613171836-1965730769-3820153312-1001&lt;br /&gt;FullName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;ASP.NET&amp;nbsp;Machine&amp;nbsp;Account&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;ASPNET&lt;br /&gt;&lt;br /&gt;AccountType&amp;nbsp;:&amp;nbsp;512&lt;br /&gt;Caption&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;PCNEU01\Fred&lt;br /&gt;Domain&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;PCNEU01&lt;br /&gt;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;S-1-5-21-2613171836-1965730769-3820153312-1016&lt;br /&gt;FullName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Fred&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Fred&lt;br /&gt;&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Next, I create my XML template designed to hold the data I am after. I want to store these properties: &lt;strong&gt;Name&lt;/strong&gt;, &lt;strong&gt;Fullname&lt;/strong&gt;, &lt;strong&gt;Description&lt;/strong&gt;, &lt;strong&gt;SID&lt;/strong&gt;, &lt;strong&gt;PasswordRequired&lt;/strong&gt;, &lt;strong&gt;Disabled&lt;/strong&gt;. J&lt;/p&gt;
&lt;p&gt;ust in case you are wondering why only part of these properties appeared in the last screenshot, always remember: PowerShell only shows you the most important properties of an object. To see all properties, you need to add to your pipeline either &lt;span class="style1"&gt;&lt;span style="font-family:courier new,courier;"&gt;&lt;strong&gt;| Format-List *&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; or &lt;span class="style1"&gt;&lt;span style="font-family:courier new,courier;"&gt;&lt;strong&gt;| Get-Member&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Here is my XML template:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$template&amp;nbsp;=&amp;nbsp;&amp;quot;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;localusers&amp;nbsp;machine=&amp;#39;pc1&amp;#39;&amp;nbsp;version=&amp;#39;1.0&amp;#39;&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;users&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;Fullname&amp;gt;&amp;lt;/Fullname&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;SID&amp;gt;&amp;lt;/SID&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;PasswordRequired&amp;gt;&amp;lt;/PasswordRequired&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;Disabled&amp;gt;&amp;lt;/Disabled&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;/users&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;lt;/localusers&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;quot;&lt;br /&gt;&amp;gt;&amp;gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$template&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;localusers&amp;nbsp;machine=&amp;#39;pc1&amp;#39;&amp;nbsp;version=&amp;#39;1.0&amp;#39;&amp;gt;&lt;br /&gt;&amp;lt;users&amp;gt;&lt;br /&gt;&amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;lt;Fullname&amp;gt;&amp;lt;/Fullname&amp;gt;&lt;br /&gt;&amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;lt;SID&amp;gt;&amp;lt;/SID&amp;gt;&lt;br /&gt;&amp;lt;PasswordRequired&amp;gt;&amp;lt;/PasswordRequired&amp;gt;&lt;br /&gt;&amp;lt;Disabled&amp;gt;&amp;lt;/Disabled&amp;gt;&lt;br /&gt;&amp;lt;/users&amp;gt;&lt;br /&gt;&amp;lt;/localusers&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$template&amp;nbsp;|&amp;nbsp;Out-File&amp;nbsp;$home\users.xml&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Next, I load the template into my XML object:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;xml&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.Load(&amp;quot;$home\users.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml&lt;br /&gt;&lt;br /&gt;localusers&lt;br /&gt;----------&lt;br /&gt;localusers&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.localusers&lt;br /&gt;&lt;br /&gt;machine&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;users&lt;br /&gt;-------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----&lt;br /&gt;pc1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;users&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.localusers.users&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Fullname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;PasswordRequired&amp;nbsp;:&lt;br /&gt;Disabled&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Now, I grab an existing entry and use this as template for my new entries:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$newuser&amp;nbsp;=&amp;nbsp;(@($xml.localusers.users)[0]).Clone()&lt;br /&gt;PS&amp;gt;&amp;nbsp;$newuser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Fullname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;PasswordRequired&amp;nbsp;:&lt;br /&gt;Disabled&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Finally, I ask WMI for the actual user information and write it to my XML file. Just be aware that XML can only store string data. This is why I convert boolean values to string using &lt;strong&gt;toString()&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Get-WmiObject&amp;nbsp;Win32_UserAccount&amp;nbsp;-filter&amp;nbsp;&amp;#39;LocalAccount=true&amp;#39;&amp;nbsp;|&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;ForEach-Object&amp;nbsp;{&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser&amp;nbsp;=&amp;nbsp;$newuser.clone()&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser.Name&amp;nbsp;=&amp;nbsp;$_.Name&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser.Fullname&amp;nbsp;=&amp;nbsp;$_.FullName&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser.Description&amp;nbsp;=&amp;nbsp;$_.Description&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser.SID&amp;nbsp;=&amp;nbsp;$_.SID&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser.PasswordRequired&amp;nbsp;=&amp;nbsp;$_.PasswordRequired.toString()&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$newuser.Disabled&amp;nbsp;=&amp;nbsp;$_.Disabled.toString()&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;$xml.localusers.AppendChild($newuser)&amp;nbsp;&amp;gt;&amp;nbsp;$null&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;}&lt;br /&gt;&amp;gt;&amp;gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.localusers.users.Count&lt;br /&gt;17&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.localusers.users&amp;nbsp;|&amp;nbsp;Format-Table&amp;nbsp;Name,&amp;nbsp;SID,&amp;nbsp;Description&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Description&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Administrator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S-1-5-21-2613171836-1...&amp;nbsp;Predefined Account&amp;nbsp;...&lt;br /&gt;ASPNET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S-1-5-21-2613171836-1...&amp;nbsp;Account&amp;nbsp;used&amp;nbsp;for&amp;nbsp;runn...&lt;br /&gt;Fred&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;S-1-5-21-2613171836-1...&amp;nbsp;Pension&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It worked! One last clean up thing to do is to remove the empty template. To remove all entries with an empty &lt;strong&gt;Name&lt;/strong&gt; property, I do this:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml.localusers.users&amp;nbsp;|&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.Name&amp;nbsp;-eq&amp;nbsp;&amp;#39;&amp;#39;&amp;nbsp;}&amp;nbsp;|&lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;ForEach-Object&amp;nbsp;{&amp;nbsp;$xml.localusers.RemoveChild($_)&amp;nbsp;}&lt;br /&gt;&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Fullname&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;Description&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;SID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;PasswordRequired&amp;nbsp;:&lt;br /&gt;Disabled&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$xml.localusers.users.Count&lt;br /&gt;16&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Now I can save the XML to file and take a look at the XML I just created:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$xml.Save(&amp;quot;$home\userlist.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;Get-Content&amp;nbsp;$home\userlist.xml&lt;br /&gt;&amp;lt;localusers&amp;nbsp;machine=&amp;quot;pc1&amp;quot;&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;users&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Name&amp;gt;Administrator&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Fullname&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Fullname&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Description&amp;gt;Predefined Account&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SID&amp;gt;S-1-5-21-2613171836-1965730769-3820153312-500&amp;lt;/SID&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;PasswordRequired&amp;gt;True&amp;lt;/PasswordRequired&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Disabled&amp;gt;True&amp;lt;/Disabled&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/users&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;users&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Name&amp;gt;ASPNET&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Fullname&amp;gt;ASP.NET&amp;nbsp;Machine&amp;nbsp;Account&amp;lt;/Fullname&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Description&amp;gt;Account&amp;nbsp;used&amp;nbsp;for&amp;nbsp;running&amp;nbsp;the&amp;nbsp;ASP.NET&amp;nbsp;worker&amp;nbsp;process&amp;nbsp;(aspn&lt;br /&gt;et_wp.exe)&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SID&amp;gt;S-1-5-21-2613171836-1965730769-3820153312-1001&amp;lt;/SID&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;PasswordRequired&amp;gt;False&amp;lt;/PasswordRequired&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Disabled&amp;gt;False&amp;lt;/Disabled&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/users&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;users&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Name&amp;gt;Fred&amp;lt;/Name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Fullname&amp;gt;Fred&amp;lt;/Fullname&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Description&amp;gt;Pension&amp;lt;/Description&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SID&amp;gt;S-1-5-21-2613171836-1965730769-3820153312-1016&amp;lt;/SID&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;PasswordRequired&amp;gt;True&amp;lt;/PasswordRequired&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Disabled&amp;gt;False&amp;lt;/Disabled&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/users&amp;gt;&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Wrap Up&lt;/h2&gt;
&lt;p&gt;Here is a script that creates the XML local user list for you and demonstrates the individual steps in one file:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="comment"&gt;# create a template XML to hold data&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$template&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; @&lt;span class="string"&gt;&amp;#39;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;localusers machine=&amp;#39;&lt;/span&gt;pc1&lt;span class="string"&gt;&amp;#39; version=&amp;#39;&lt;/span&gt;1.0&lt;span class="string"&gt;&amp;#39;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;users&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;Fullname&amp;gt;&amp;lt;/Fullname&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;SID&amp;gt;&amp;lt;/SID&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;PasswordRequired&amp;gt;&amp;lt;/PasswordRequired&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;Disabled&amp;gt;&amp;lt;/Disabled&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;/users&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;lt;/localusers&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class="string"&gt;&amp;#39;&lt;/span&gt;@&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;$template&lt;/span&gt; | &lt;span class="verbnoun"&gt;Out-File&lt;/span&gt; &lt;span class="var"&gt;$home&lt;/span&gt;\users.&lt;span class="datatype"&gt;xml&lt;/span&gt; &lt;span class="modifier"&gt;-encoding&lt;/span&gt; UTF8&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# load template into XML object&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$xml&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="verbnoun"&gt;New-Object&lt;/span&gt; &lt;span class="datatype"&gt;xml&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="method"&gt;Load&lt;/span&gt;(&lt;span class="string"&gt;&amp;quot;$home\users.xml&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# grab template user&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$newuser&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; (@(&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="namespace"&gt;localusers.users&lt;/span&gt;)[0]).&lt;span class="method"&gt;Clone&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# use template to add local user accounts to xml &lt;/span&gt;&lt;br /&gt;&lt;span class="verbnoun"&gt;Get-WmiObject&lt;/span&gt; Win32_UserAccount &lt;span class="op"&gt;-&lt;/span&gt;&lt;span class="keyword"&gt;filter&lt;/span&gt; &lt;span class="string"&gt;&amp;#39;LocalAccount=true&amp;#39;&lt;/span&gt; |&lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt; {&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;clone&lt;/span&gt;()&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;Name&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;Name&lt;/span&gt;&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;Fullname&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;FullName&lt;/span&gt;&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;Description&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;Description&lt;/span&gt;&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;SID&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;SID&lt;/span&gt;&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;PasswordRequired&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;PasswordRequired.toString&lt;/span&gt;()&lt;br /&gt;	&lt;span class="var"&gt;$newuser&lt;/span&gt;.&lt;span class="method"&gt;Disabled&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="namespace"&gt;Disabled.toString&lt;/span&gt;()&lt;br /&gt;	&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="namespace"&gt;localusers.AppendChild&lt;/span&gt;(&lt;span class="var"&gt;$newuser&lt;/span&gt;) &amp;gt; &lt;span class="var"&gt;$null&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# remove users with undefined name (remove template)&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="namespace"&gt;localusers.users&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;Where-Object&lt;/span&gt; { &lt;span class="var"&gt;$_&lt;/span&gt;.&lt;span class="method"&gt;Name&lt;/span&gt; &lt;span class="op"&gt;-eq&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;&amp;quot;&lt;/span&gt; } | &lt;br /&gt;&lt;span class="verbnoun"&gt;ForEach-Object&lt;/span&gt;  { [&lt;span class="keyword"&gt;void&lt;/span&gt;]&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="namespace"&gt;localusers.RemoveChild&lt;/span&gt;(&lt;span class="var"&gt;$_&lt;/span&gt;) }&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# save xml to file&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="method"&gt;Save&lt;/span&gt;(&lt;span class="string"&gt;&amp;quot;$home\userlist.xml&amp;quot;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# play with results&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="var"&gt;$xml&lt;/span&gt;.&lt;span class="namespace"&gt;localusers.users&lt;/span&gt; | &lt;span class="verbnoun"&gt;Sort-Object&lt;/span&gt; Name | &lt;span class="verbnoun"&gt;Format-Table&lt;/span&gt; name, description, SID&lt;br /&gt;&lt;br /&gt;&lt;span class="op"&gt;&amp;amp;&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;$home\userlist.xml&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Cheerio&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=1310" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/XML/default.aspx">XML</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Win32_5F00_UserAccount/default.aspx">Win32_UserAccount</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/User+Account/default.aspx">User Account</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Clone/default.aspx">Clone</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Get-WMIObject/default.aspx">Get-WMIObject</category></item><item><title>XML Part 1: Playing with RSS Feeds and XML Content</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/01/17/xml-part-1-playing-with-rss-feeds-and-xml-content.aspx</link><pubDate>Sat, 17 Jan 2009 09:37:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:900</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=900</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/01/17/xml-part-1-playing-with-rss-feeds-and-xml-content.aspx#comments</comments><description>&lt;p&gt;A lot of data these days is wrapped as XML, and up until now, handling XML data wasn&amp;#39;t a piece of cake. PowerShell makes handling XML a lot easier. This is the first part of a little series about XML and PowerShell. We start with accessing XML documents and reading data.&lt;/p&gt;
&lt;h2&gt;Getting XML Data&lt;/h2&gt;
&lt;p&gt;Let&amp;#39;s first look how PowerShell can lay hands on XML data. One way is to create a new and empty XML document:&lt;/p&gt;
&lt;div class="listing"&gt;
&lt;pre&gt;&lt;span class="var"&gt;$xml&lt;/span&gt; &lt;span class="op"&gt;=&lt;/span&gt; &lt;span class="verbnoun"&gt;New-Object&lt;/span&gt; &lt;span class="datatype"&gt;XML&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Next, you can use your new XML document to load XML data, either from a local file or from the Internet. Use the &lt;strong&gt;Load()&lt;/strong&gt; method. Let&amp;#39;s for example load the &lt;a target="_blank" href="http://www.powershell.com"&gt;www.powershell.com&lt;/a&gt; RSS ticker:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;XML&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a.Load(&amp;quot;http://powershell.com/cs/blogs/MainFeed.aspx&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a&lt;br /&gt;&lt;br /&gt;xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xml-stylesheet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rss&lt;br /&gt;---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rss&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As long as you have access to the Internet, these lines will download the RSS news ticker into &lt;strong&gt;$a&lt;/strong&gt; as an XML document, and when you output &lt;strong&gt;$a&lt;/strong&gt;, you see a number of properties. &lt;/p&gt;
&lt;h2&gt;Browsing XML Data&lt;/h2&gt;
&lt;p&gt;What exactly is their meaning? To find out, let&amp;#39;s first save the downloaded RSS ticker to file using the built-in &lt;strong&gt;Save()&lt;/strong&gt; method. Next, we take a look at the first lines in that XML document by reading the xml file using &lt;strong&gt;Get-Content&lt;/strong&gt; and selecting only the first 3 lines using &lt;strong&gt;Select-Object -First&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.save(&amp;quot;$home\rssticker.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;Get-Content&amp;nbsp;$home\rssticker.xml&amp;nbsp;|&amp;nbsp;Select-Object&amp;nbsp;-first&amp;nbsp;3&lt;br /&gt;&amp;lt;?&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;&lt;strong&gt;&lt;span style="color:#00ff00;"&gt;xml&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;span style="color:#00ff00;"&gt;&amp;nbsp;&lt;/span&gt;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;?&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;&lt;strong&gt;&lt;span style="color:#00ff00;"&gt;xml-stylesheet&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&amp;nbsp;type=&amp;quot;text/xsl&amp;quot;&amp;nbsp;href=&amp;quot;http://powershell.com/cs/utility/FeedStylesheets/rss.xsl&amp;quot;&amp;nbsp;media=&amp;quot;screen&amp;quot;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;&lt;strong&gt;&lt;span style="color:#00ff00;"&gt;rss&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&amp;nbsp;version=&amp;quot;2.0&amp;quot;&amp;nbsp;xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&amp;nbsp;xmlns:slash=&amp;quot;http://purl.org/rss/1.0/modules/sla&lt;br /&gt;sh/&amp;quot;&amp;nbsp;xmlns:wfw=&amp;quot;http://wellformedweb.org/CommentAPI/&amp;quot;&amp;nbsp;xmlns:itunes=&amp;quot;http://www.itunes.com/dtds/podcast-1.0.dtd&amp;quot;&lt;br /&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As it turns out, the PowerShell xml document in $a returns the top XML nodes: &lt;strong&gt;xml&lt;/strong&gt;, &lt;strong&gt;xml-stylesheet&lt;/strong&gt; and &lt;strong&gt;rss&lt;/strong&gt;. Diving into nested information inside an XML document is very easy because it works in pretty much the same way as with objects. So if you&amp;#39;d like to see all the nodes below the root node &lt;strong&gt;rss&lt;/strong&gt;, you use the &lt;strong&gt;rss&lt;/strong&gt; property:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.rss&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;version&amp;nbsp;:&amp;nbsp;2.0&lt;br /&gt;dc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://purl.org/dc/elements/1.1/&lt;br /&gt;slash&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://purl.org/rss/1.0/modules/slash/&lt;br /&gt;wfw&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://wellformedweb.org/CommentAPI/&lt;br /&gt;itunes&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://www.itunes.com/dtds/podcast-1.0.dtd&lt;br /&gt;channel&amp;nbsp;:&amp;nbsp;channel&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Again, if you&amp;#39;d looked at the raw XML data, you would see that the RSS node has these children: &lt;strong&gt;version&lt;/strong&gt;, &lt;strong&gt;dc&lt;/strong&gt;, &lt;strong&gt;slash&lt;/strong&gt;, &lt;strong&gt;wfw&lt;/strong&gt;, &lt;strong&gt;itunes&lt;/strong&gt; and &lt;strong&gt;channel&lt;/strong&gt;. Most of these are attributes with pieces of information. &lt;strong&gt;Channel&lt;/strong&gt; however is another parent node and has a bunch of children. To look at the children, again use this property name:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#012456;"&gt;format-default&amp;nbsp;:&amp;nbsp;The&amp;nbsp;member&amp;nbsp;&amp;quot;Item&amp;quot;&amp;nbsp;is&amp;nbsp;already&amp;nbsp;present.&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Property Name Conflict - And A Simple Workaround&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Bang!&lt;/em&gt; You get a red error message. You cannot list the children inside the channel parent node. This is a bug, or rather, a conceptional weakness in design. &lt;/p&gt;
&lt;p&gt;If you look at the raw XML data, you will see that the &lt;strong&gt;channel&lt;/strong&gt; node contains a bunch of &lt;strong&gt;item&lt;/strong&gt; nodes, and these &lt;strong&gt;item&lt;/strong&gt; nodes are the ones with the interesting stuff: the feed messages. Unfortunately, the XML document object already has its own &lt;strong&gt;item&lt;/strong&gt; property. The moment PowerShell tries to add the &lt;strong&gt;item&lt;/strong&gt; property for the &lt;strong&gt;item&lt;/strong&gt; children, you get the error message. An object cannot have two properties with the same name. &lt;/p&gt;
&lt;p&gt;And here is the workaround: work in &amp;quot;blind&amp;quot; mode and just assume the children elements are named &amp;quot;item&amp;quot; (or whatever the error message indicates):&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel.item&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Group&amp;nbsp;Policy&amp;nbsp;Cmdlets&amp;nbsp;in&amp;nbsp;Windows&amp;nbsp;7&lt;br /&gt;link&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-team/archive/2009/01/16/group-policy-cmdlets-in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-windows-7.aspx&lt;br /&gt;pubDate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Sat,&amp;nbsp;17&amp;nbsp;Jan&amp;nbsp;2009&amp;nbsp;04:46:08&amp;nbsp;GMT&lt;br /&gt;guid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;guid&lt;br /&gt;creator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Windows&amp;nbsp;PowerShell&amp;nbsp;Blog&lt;br /&gt;comments&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;0&lt;br /&gt;description&amp;nbsp;:&amp;nbsp;Lilia&amp;nbsp;Gutnik&amp;nbsp;has&amp;nbsp;posted&amp;nbsp;a&amp;nbsp;blog&amp;nbsp;entry&amp;nbsp;HERE&amp;nbsp;showing&amp;nbsp;an&amp;nbsp;example&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;Group&amp;nbsp;Policy&amp;nbsp;cmdlet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s.&amp;amp;#160;&amp;nbsp;Check&amp;nbsp;it&amp;nbsp;out.&amp;nbsp;&amp;amp;#160;&amp;nbsp;Experiment!&amp;amp;#160;&amp;nbsp;Enjoy!&amp;amp;#160;&amp;nbsp;Engage!&amp;nbsp;Jeffrey&amp;nbsp;Snover&amp;nbsp;[MSFT]&amp;nbsp;Window&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;Management&amp;nbsp;Partner&amp;nbsp;Architect&amp;nbsp;Visit&amp;nbsp;the&amp;nbsp;Windows&amp;nbsp;PowerShell&amp;nbsp;Team&amp;nbsp;blog&amp;nbsp;at:&amp;amp;#160;&amp;amp;#160;&amp;amp;#160;&amp;nbsp;http:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//blogs.msdn.com/PowerShell&amp;nbsp;Visit&amp;nbsp;the&amp;nbsp;Windows&amp;nbsp;PowerShell&amp;nbsp;ScriptCenter&amp;nbsp;at:&amp;amp;#160;&amp;nbsp;http://www.micros&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oft.com/technet&amp;nbsp;Read&amp;nbsp;More......(&amp;lt;a&amp;nbsp;href=&amp;quot;http://powershell.com/cs/blogs/windows-powershell-team/a&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rchive/2009/01/16/group-policy-cmdlets-in-windows-7.aspx&amp;quot;&amp;gt;read&amp;nbsp;more&amp;lt;/a&amp;gt;)&amp;lt;img&amp;nbsp;src=&amp;quot;http://powershe&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ll.com/cs/aggbug.aspx?PostID=899&amp;quot;&amp;nbsp;width=&amp;quot;1&amp;quot;&amp;nbsp;height=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Jeffrey&amp;nbsp;Snover&amp;nbsp;and&amp;nbsp;Bruce&amp;nbsp;Payette&amp;nbsp;on&amp;nbsp;the&amp;nbsp;PowerScripting&amp;nbsp;Podcast&lt;br /&gt;link&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/archive/2009/01/16/jeffrey-snover-and-bruce-payet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;te-on-the-powerscripting-podcast.aspx&lt;br /&gt;pubDate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Fri,&amp;nbsp;16&amp;nbsp;Jan&amp;nbsp;2009&amp;nbsp;14:35:00&amp;nbsp;GMT&lt;br /&gt;guid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;guid&lt;br /&gt;creator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Under&amp;nbsp;The&amp;nbsp;Stairs&lt;br /&gt;comments&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;0&lt;br /&gt;description&amp;nbsp;:&amp;nbsp;I&amp;nbsp;love&amp;nbsp;downloading&amp;nbsp;podcasts&amp;nbsp;to&amp;nbsp;my&amp;nbsp;Zune&amp;nbsp;and&amp;nbsp;listening&amp;nbsp;to&amp;nbsp;them&amp;nbsp;as&amp;nbsp;I&amp;nbsp;travel.&amp;nbsp;I ve&amp;nbsp;got&amp;nbsp;a&amp;nbsp;bit&amp;nbsp;of&amp;nbsp;a&amp;nbsp;bac&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;klog,&amp;nbsp;but&amp;nbsp;one&amp;nbsp;I ve&amp;nbsp;just&amp;nbsp;downloaded&amp;nbsp;and&amp;nbsp;will&amp;nbsp;be&amp;nbsp;listening&amp;nbsp;to&amp;nbsp;shortly&amp;nbsp;(possibly&amp;nbsp;tomorrow&amp;nbsp;as&amp;nbsp;I&amp;nbsp;head&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;Milan&amp;nbsp;back&amp;nbsp;to&amp;nbsp;London)&amp;nbsp;is&amp;nbsp;the&amp;nbsp;PowerScripting&amp;nbsp;Podcast&amp;nbsp;Read&amp;nbsp;More......(&amp;lt;a&amp;nbsp;href=&amp;quot;http://powershe&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ll.com/cs/blogs/under-the-stairs/archive/2009/01/16/jeffrey-snover-and-bruce-payette-on-the-power&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scripting-podcast.aspx&amp;quot;&amp;gt;read&amp;nbsp;more&amp;lt;/a&amp;gt;)&amp;lt;img&amp;nbsp;src=&amp;quot;http://powershell.com/cs/aggbug.aspx?PostID=898&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width=&amp;quot;1&amp;quot;&amp;nbsp;height=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;category&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;{category,&amp;nbsp;category}&lt;br /&gt;&lt;br /&gt;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;How&amp;nbsp;To&amp;nbsp;Make&amp;nbsp;Your&amp;nbsp;Own&amp;nbsp;Module&amp;nbsp;Repository&lt;br /&gt;link&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-team/archive/2009/01/16/how-to-make-your-own-mo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dule-repository.aspx&lt;br /&gt;pubDate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Fri,&amp;nbsp;16&amp;nbsp;Jan&amp;nbsp;2009&amp;nbsp;08:52:13&amp;nbsp;GMT&lt;br /&gt;guid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;guid&lt;br /&gt;creator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Windows&amp;nbsp;PowerShell&amp;nbsp;Blog&lt;br /&gt;comments&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;0&lt;br /&gt;description&amp;nbsp;:&amp;nbsp;Andy&amp;nbsp;Schneider&amp;nbsp;(from&amp;nbsp;Get-PowerShell.com&amp;nbsp;)&amp;nbsp;recently&amp;nbsp;asked&amp;nbsp;me&amp;nbsp;how&amp;nbsp;he&amp;nbsp;could&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;that&amp;nbsp;everyone&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;Avanade&amp;nbsp;could&amp;nbsp;get&amp;nbsp;a&amp;nbsp;consistent&amp;nbsp;set&amp;nbsp;of&amp;nbsp;modules.&amp;nbsp;I&amp;nbsp;run&amp;nbsp;into&amp;nbsp;a&amp;nbsp;somewhat&amp;nbsp;similar&amp;nbsp;problem&amp;nbsp;here&amp;nbsp;at&amp;nbsp;M&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;icrosoft,&amp;nbsp;where&amp;nbsp;I&amp;nbsp;want&amp;nbsp;to&amp;nbsp;take&amp;nbsp;scripts&amp;nbsp;I&amp;amp;#39;ve&amp;nbsp;built&amp;nbsp;to&amp;nbsp;work&amp;nbsp;with&amp;nbsp;internal&amp;nbsp;applications&amp;nbsp;and&amp;nbsp;make&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;them&amp;nbsp;easy&amp;nbsp;for&amp;nbsp;people&amp;nbsp;to&amp;nbsp;use,&amp;nbsp;even&amp;nbsp;if&amp;nbsp;they&amp;amp;#39;re&amp;nbsp;not&amp;nbsp;already&amp;nbsp;using&amp;nbsp;PowerShell.&amp;nbsp;I&amp;nbsp;don&amp;amp;#39;t&amp;nbsp;want&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;the&amp;nbsp;scripts&amp;nbsp;to&amp;nbsp;Read&amp;nbsp;More......(&amp;lt;a&amp;nbsp;href=&amp;quot;http://powershell.com/cs/blogs/windows-powershell-team/ar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chive/2009/01/16/how-to-make-your-own-module-repository.aspx&amp;quot;&amp;gt;read&amp;nbsp;more&amp;lt;/a&amp;gt;)&amp;lt;img&amp;nbsp;src=&amp;quot;http://powe&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rshell.com/cs/aggbug.aspx?PostID=895&amp;quot;&amp;nbsp;width=&amp;quot;1&amp;quot;&amp;nbsp;height=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;category&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;{category,&amp;nbsp;category}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Now you get to the good stuff! These are the headlines you&amp;#39;re after. &lt;/p&gt;
&lt;h1&gt;Using The PowerShell Pipeline&lt;/h1&gt;
&lt;p&gt;You just learned that you can access any RSS feed in the world by loading it into a new and empty XML document. &lt;/p&gt;
&lt;p&gt;Since RSS feeds are XML documents and adhere to a defined format, you can always list all RSS messages by looking at the &lt;strong&gt;RSS.Channel.Item property&lt;/strong&gt;. This returns all raw data contained in the individual RSS items. From here, simply use PowerShell Pipeline tricks to filter what you are looking for.&lt;/p&gt;
&lt;p&gt;First, I&amp;#39;d like to filter the information. I only want to see the blog entry title and the link. Easy: use &lt;strong&gt;Format-Table&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;XML&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a.Load(&amp;quot;http://powershell.com/cs/blogs/MainFeed.aspx&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel.item&amp;nbsp;|&amp;nbsp;Format-Table&amp;nbsp;Title,&amp;nbsp;Link&lt;br /&gt;&lt;br /&gt;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;link&lt;br /&gt;-----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----&lt;br /&gt;Group&amp;nbsp;Policy&amp;nbsp;Cmdlets&amp;nbsp;in&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Jeffrey&amp;nbsp;Snover&amp;nbsp;and&amp;nbsp;Bruce&amp;nbsp;Payette&amp;nbsp;on&amp;nbsp;the&amp;nbsp;PowerScripti...&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/arch...&lt;br /&gt;How&amp;nbsp;To&amp;nbsp;Make&amp;nbsp;Your&amp;nbsp;Own&amp;nbsp;Module&amp;nbsp;Repository&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Please&amp;nbsp;Join&amp;nbsp;Me&amp;nbsp;for&amp;nbsp;a&amp;nbsp;Power&amp;nbsp;Scripting&amp;nbsp;Podcast&amp;nbsp;Tonight...&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Running&amp;nbsp;PowerShell&amp;nbsp;Scripts&amp;nbsp;via&amp;nbsp;Email&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/arch...&lt;br /&gt;Date&amp;nbsp;and&amp;nbsp;Time&amp;nbsp;in&amp;nbsp;PowerShell&amp;nbsp;(and&amp;nbsp;WMI)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/arch...&lt;br /&gt;Date&amp;nbsp;and&amp;nbsp;Time&amp;nbsp;in&amp;nbsp;PowerShell&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/powershell-scripts/ar...&lt;br /&gt;Windows&amp;nbsp;7&amp;nbsp;Troubleshooting&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Podcast&amp;nbsp;Discussing&amp;nbsp;WSMAN&amp;nbsp;1/14/2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Get-UpTime.ps1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/powershell-scripts/ar...&lt;br /&gt;Interactive&amp;nbsp;remoting&amp;nbsp;in&amp;nbsp;CTP3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;How&amp;nbsp;to&amp;nbsp;copy&amp;nbsp;colorized&amp;nbsp;script&amp;nbsp;from&amp;nbsp;PowerShell&amp;nbsp;ISE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Please&amp;nbsp;Give&amp;nbsp;Us&amp;nbsp;Feedback&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Blogging&amp;nbsp;in&amp;nbsp;2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/arch...&lt;br /&gt;V2&amp;nbsp;Blog&amp;nbsp;Entries&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Copy&amp;nbsp;console&amp;nbsp;screen&amp;nbsp;to&amp;nbsp;system&amp;nbsp;clipboard&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Get-Screensaver.ps1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/powershell-scripts/ar...&lt;br /&gt;Colorized&amp;nbsp;capture&amp;nbsp;of&amp;nbsp;console&amp;nbsp;screen&amp;nbsp;in&amp;nbsp;HTML&amp;nbsp;and&amp;nbsp;RTF.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Finding&amp;nbsp;a&amp;nbsp;URL&amp;nbsp;For&amp;nbsp;File&amp;nbsp;Transfer&amp;nbsp;Cmdlets&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Transferring&amp;nbsp;(Large)&amp;nbsp;Files&amp;nbsp;Using&amp;nbsp;BITs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Test-PSCmdlet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Capture&amp;nbsp;console&amp;nbsp;screen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Get-Hash2.ps1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/powershell-scripts/ar...&lt;br /&gt;PowerShell&amp;nbsp;as&amp;nbsp;Inventory&amp;nbsp;Tool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-te...&lt;br /&gt;Windows&amp;nbsp;7&amp;nbsp;Beta&amp;nbsp;Has&amp;nbsp;Arrived&amp;nbsp; &amp;nbsp;But&amp;nbsp;Not&amp;nbsp;For&amp;nbsp;Everyone&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/arch...&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Next, I only want the top 5 entries, and I do not want the link to be cut off. So I insert a &lt;strong&gt;Select-Object -First&lt;/strong&gt; (remember, the &lt;strong&gt;Format&lt;/strong&gt; cmdlets always have to be the last element in your pipeline), and I add a&lt;strong&gt; -wrap&lt;/strong&gt; parameter to &lt;strong&gt;Format-Table&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel.item&amp;nbsp;|&amp;nbsp;Select-Object&amp;nbsp;-first&amp;nbsp;5&amp;nbsp;|&amp;nbsp;Format-Table&amp;nbsp;Title,&amp;nbsp;Link&amp;nbsp;-wrap&lt;br /&gt;&lt;br /&gt;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;link&lt;br /&gt;-----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----&lt;br /&gt;Group&amp;nbsp;Policy&amp;nbsp;Cmdlets&amp;nbsp;in&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-team/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archive/2009/01/16/group-policy-cmdlets-in-windows-7.as&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;px&lt;br /&gt;Jeffrey&amp;nbsp;Snover&amp;nbsp;and&amp;nbsp;Bruce&amp;nbsp;Payette&amp;nbsp;on&amp;nbsp;the&amp;nbsp;PowerScripting&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/archive&lt;br /&gt;Podcast&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/2009/01/16/jeffrey-snover-and-bruce-payette-on-the-pow&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;erscripting-podcast.aspx&lt;br /&gt;How&amp;nbsp;To&amp;nbsp;Make&amp;nbsp;Your&amp;nbsp;Own&amp;nbsp;Module&amp;nbsp;Repository&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-team/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archive/2009/01/16/how-to-make-your-own-module-reposito&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ry.aspx&lt;br /&gt;Please&amp;nbsp;Join&amp;nbsp;Me&amp;nbsp;for&amp;nbsp;a&amp;nbsp;Power&amp;nbsp;Scripting&amp;nbsp;Podcast&amp;nbsp;Tonight&amp;nbsp;@&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/windows-powershell-team/&lt;br /&gt;9PM&amp;nbsp;EST&amp;nbsp;(6PM&amp;nbsp;PST)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archive/2009/01/15/please-join-me-for-a-power-scripting&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-podcast-tonight-9pm-est-6pm-pst.aspx&lt;br /&gt;Running&amp;nbsp;PowerShell&amp;nbsp;Scripts&amp;nbsp;via&amp;nbsp;Email&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://powershell.com/cs/blogs/under-the-stairs/archive&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/2009/01/15/running-powershell-scripts-via-email.aspx&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Can I filter based on topic, too? Sure thing. If you are interested in Windows 7, the upcoming new Windows client, and you&amp;#39;d like to see only blogs about Windows 7, then add a &lt;strong&gt;Where-Object&lt;/strong&gt; into your pipeline. &lt;/p&gt;
&lt;p&gt;Inside of it, the&lt;strong&gt; $_&lt;/strong&gt; placeholder represents the actual blog entry as it is running over the pipeline, and you then can check whether the title property contains one or more keywords. &lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel.item&amp;nbsp;|&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.Title&amp;nbsp;-like&amp;nbsp;&amp;#39;*Windows&amp;nbsp;7*&amp;#39;&amp;nbsp;}&amp;nbsp;|&amp;nbsp;Format-Table&amp;nbsp;Title,&amp;nbsp;Description&lt;br /&gt;&lt;br /&gt;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;description&lt;br /&gt;-----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----------&lt;br /&gt;Group&amp;nbsp;Policy&amp;nbsp;Cmdlets&amp;nbsp;in&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Lilia&amp;nbsp;Gutnik&amp;nbsp;has&amp;nbsp;posted&amp;nbsp;a&amp;nbsp;blog&amp;nbsp;entry&amp;nbsp;HERE&amp;nbsp;showing&amp;nbsp;an...&lt;br /&gt;Windows&amp;nbsp;7&amp;nbsp;Troubleshooting&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;has&amp;nbsp;a&amp;nbsp;cool&amp;nbsp;new&amp;nbsp;extensible&amp;nbsp;troubleshooting&amp;nbsp;...&lt;br /&gt;Windows&amp;nbsp;7&amp;nbsp;Beta&amp;nbsp;Has&amp;nbsp;Arrived&amp;nbsp; &amp;nbsp;But&amp;nbsp;Not&amp;nbsp;For&amp;nbsp;Everyone&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;and&amp;nbsp;Windows&amp;nbsp;Server&amp;nbsp;2008&amp;nbsp;R2&amp;nbsp;beta&amp;nbsp;versio...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Maybe you&amp;#39;d like to output this as a nice report. Here is the thing to remember: Never use &lt;strong&gt;Format-...&lt;/strong&gt; cmdlets when you plan to output results to sources other than the console. Use &lt;strong&gt;Select-Object&lt;/strong&gt; instead. To create a simple HTML report, this is what I&amp;#39;d do:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel.item&amp;nbsp;|&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.Title&amp;nbsp;-like&amp;nbsp;&amp;#39;*Windows&amp;nbsp;7*&amp;#39;&amp;nbsp;}&amp;nbsp;|&amp;nbsp;Select-Object&amp;nbsp;Title,&amp;nbsp;Description&amp;nbsp;|&amp;nbsp;&lt;br /&gt;ConvertTo-Html&amp;nbsp;|&amp;nbsp;Out-File&amp;nbsp;$home\report.htm;&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;$home\report.htm&amp;quot;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;This is what the resulting report looks like:&lt;/p&gt;
&lt;table&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;title&lt;/th&gt;&lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group Policy Cmdlets in Windows 7&lt;/td&gt;
&lt;td&gt;Lilia Gutnik has posted a blog entry HERE showing an example of the Windows 7 Group Policy cmdlets.&amp;amp;#160; Check it out. &amp;amp;#160; Experiment!&amp;amp;#160; Enjoy!&amp;amp;#160; Engage! Jeffrey Snover [MSFT] Windows Management Partner Architect Visit the Windows PowerShell Team blog at:&amp;amp;#160;&amp;amp;#160;&amp;amp;#160; http://blogs.msdn.com/PowerShell Visit the Windows PowerShell ScriptCenter at:&amp;amp;#160; http://www.microsoft.com/technet Read More......(&amp;lt;a href=&amp;quot;http://powershell.com/cs/blogs/windows-powershell-team/archive/2009/01/16/group-policy-cmdlets-in-windows-7.aspx&amp;quot;&amp;gt;read more&amp;lt;/a&amp;gt;)&amp;lt;img src=&amp;quot;http://powershell.com/cs/aggbug.aspx?PostID=899&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot;&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 7 Troubleshooting&lt;/td&gt;
&lt;td&gt;Windows 7 has a cool new extensible troubleshooting framework which is entirely based on PowerShell scripts.&amp;amp;#160; Rafael Rivera has written a very good step-by-step guide for how to author a Win7 Troubleshooting Pack HERE . Check it out. Experiment!&amp;amp;#160; Enjoy!&amp;amp;#160; Engage! Jeffrey Snover [MSFT] Windows Management Partner Architect Visit the Windows PowerShell Team blog at:&amp;amp;#160;&amp;amp;#160;&amp;amp;#160; http Read More......(&amp;lt;a href=&amp;quot;http://powershell.com/cs/blogs/windows-powershell-team/archive/2009/01/14/windows-7-troubleshooting.aspx&amp;quot;&amp;gt;read more&amp;lt;/a&amp;gt;)&amp;lt;img src=&amp;quot;http://powershell.com/cs/aggbug.aspx?PostID=880&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot;&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 7 Beta Has Arrived &amp;ndash; But Not For Everyone&lt;/td&gt;
&lt;td&gt;The Windows 7 and Windows Server 2008 R2 beta versions were released this week. I got the ISOs myself during the week, and finished off today loading R2, Win7 Ultimate and WIn7 Home Premium as VMware virtual machines. But it looks like Microsoft has totally Read More......(&amp;lt;a href=&amp;quot;http://powershell.com/cs/blogs/under-the-stairs/archive/2009/01/10/windows-7-beta-has-arrived-but-not-for-everyone.aspx&amp;quot;&amp;gt;read more&amp;lt;/a&amp;gt;)&amp;lt;img src=&amp;quot;http://powershell.com/cs/aggbug.aspx?PostID=848&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot;&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Admittedly, the HTML report does not really look very stylish, but you could change that as well:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$head&amp;nbsp;=&amp;nbsp;&amp;#39;&amp;lt;style&amp;gt;&amp;nbsp;BODY{font-family:Verdana;&amp;nbsp;background-color:lightblue;}&amp;nbsp;TABLE{border-width:&amp;nbsp;1px;border-style&lt;br /&gt;:&amp;nbsp;solid;border-color:&amp;nbsp;black;border-collapse:&amp;nbsp;collapse;}&amp;nbsp;TH{font-size:1.3em;&amp;nbsp;border-width:&amp;nbsp;1px;padding:&amp;nbsp;2px;borde&lt;br /&gt;r-style:&amp;nbsp;solid;border-color:&amp;nbsp;black;background-color:#FFCCCC}&amp;nbsp;TD{border-width:&amp;nbsp;1px;padding:&amp;nbsp;2px;border-style:&amp;nbsp;sol&lt;br /&gt;id;border-color:&amp;nbsp;black;background-color:yellow}&amp;lt;/style&amp;gt;&amp;#39;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$title&amp;nbsp;=&amp;nbsp;&amp;quot;My&amp;nbsp;Report&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$body&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;lt;H1&amp;gt;New&amp;nbsp;Windows&amp;nbsp;7&amp;nbsp;+&amp;nbsp;PowerShell&amp;nbsp;Blogs&amp;lt;/H1&amp;gt;&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a.rss.channel.item&amp;nbsp;|&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.Title&amp;nbsp;-like&amp;nbsp;&amp;#39;*Windows&amp;nbsp;7*&amp;#39;&amp;nbsp;}&amp;nbsp;|&amp;nbsp;Select-Object&amp;nbsp;Title,&amp;nbsp;Description&amp;nbsp;|&amp;nbsp;&lt;br /&gt;ConvertTo-Html&amp;nbsp;-title&amp;nbsp;$title&amp;nbsp;-head&amp;nbsp;$head&amp;nbsp;-body&amp;nbsp;$body&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;Out-File&amp;nbsp;$home\report.htm;&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;$home\report.htm&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Here is more brainfood on colorizing HTML reports: &lt;a target="_blank" href="http://powershell.com/cs/blogs/tips/archive/2009/01/05/outputting-html-reports.aspx"&gt;http://powershell.com/cs/blogs/tips/archive/2009/01/05/outputting-html-reports.aspx&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Convert Text to&amp;nbsp; XML&lt;/h2&gt;
&lt;p&gt;To wrap up this first part of our XML series, let&amp;#39;s finally look at two more ways to read XML data into PowerShell. At the beginning of this article, we loaded the XML via Internet into an empty XML object. From here, you can save the XML as file. Using the same &lt;strong&gt;Load() &lt;/strong&gt;method, you can also load XML data from an XML file:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$a&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;XML&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a.Load(&amp;quot;http://powershell.com/cs/blogs/MainFeed.aspx&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$a.Save(&amp;quot;$home\myxml.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$b&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;XML&lt;br /&gt;PS&amp;gt;&amp;nbsp;$b.Load(&amp;quot;$home\myxml.xml&amp;quot;)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$b&lt;br /&gt;&lt;br /&gt;xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xml-stylesheet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rss&lt;br /&gt;---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rss&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;So the second approach is to load a file-based XML into an empty XML object. The third approach uses type conversion. You read in XML data as plain text, then convert this into the XML data type. &lt;/p&gt;
&lt;p&gt;Remember two things here: Type conversion works by writing the type (in square brackets) in front of the data you want to convert, and second: use parenthesis around &lt;strong&gt;Get-Content&lt;/strong&gt; because you do not want to convert the &lt;strong&gt;Get-Content&lt;/strong&gt; cmdlet of course but rather its result.&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$c&amp;nbsp;=&amp;nbsp;[xml]&amp;nbsp;(Get-Content&amp;nbsp;$home\myxml.xml)&lt;br /&gt;PS&amp;gt;&amp;nbsp;$c&lt;br /&gt;&lt;br /&gt;xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xml-stylesheet&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rss&lt;br /&gt;---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;---&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rss&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;Next Steps...&lt;/h2&gt;
&lt;p&gt;Next time, we will create our own XML documents, look at some more advanced data analysis and update and change XML data in an XML file. Make sure to check back next week! Which you now by the way could automate, too.&amp;nbsp;Simply use the RSS ticker in the examples above&amp;nbsp;to check for new blog entries&amp;nbsp;on powershell.com! &lt;/p&gt;
&lt;p&gt;Cheers and a great and relaxing weekend to you,&lt;br /&gt;and don&amp;#39;t forget to check out &lt;a target="_blank" href="http://www.powershellplus.com"&gt;PowerShell Plus&lt;/a&gt;! It&amp;#39;s great and simply one of the best ways to learn PowerShell!&lt;/p&gt;
&lt;p&gt;-Tobias&lt;/p&gt;
&lt;p&gt;MVP Windows PowerShell&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=900" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/XML/default.aspx">XML</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/RSS/default.aspx">RSS</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/New-Object/default.aspx">New-Object</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Format-Table/default.aspx">Format-Table</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Where-Object/default.aspx">Where-Object</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Internet/default.aspx">Internet</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Select-Object/default.aspx">Select-Object</category></item><item><title>Tipps &amp; Tricks Using Compare-Object</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/01/09/tipps-amp-tricks-using-compare-object.aspx</link><pubDate>Fri, 09 Jan 2009 00:47:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:839</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=839</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/01/09/tipps-amp-tricks-using-compare-object.aspx#comments</comments><description>
&lt;p&gt;


&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compare-Object&lt;/strong&gt; is a very powerful Cmdlet that can compare different result sets. The funny thing is: when you try to use &lt;strong&gt;Compare-Object &lt;/strong&gt;in simple scenarios, all works fine. Once you put it to work in production environments, it often fails. Here is why. This article describes what to watch out for and how to correctly configure&lt;strong&gt; Compare-Object&lt;/strong&gt; to make it work for you.&lt;/p&gt;
&lt;h2&gt;Using Compare-Object To Find New Processes&lt;/h2&gt;
&lt;p&gt;PowerShell can easily compare result sets for you and filter out only those items that have changed. Let&amp;#39;s say you&amp;#39;d like to know which processes have been started after a given point in time. How can you do that?&lt;/p&gt;
&lt;p&gt;The workhorse doing the comparinson is called &lt;strong&gt;Compare-Object&lt;/strong&gt;. This Cmdlet takes two resultsets and automatically analyzes them. It then outputs only those items present in either one of the result sets. To find out the processes started after a given point in time, you first create a base resultset of all currently running processes like this:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;Get-Process&lt;br /&gt;PS&amp;gt;&amp;nbsp;notepad&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;Get-Process&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;&lt;br /&gt;InputObject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SideIndicator&lt;br /&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&lt;br /&gt;System.Diagnostics.Process&amp;nbsp;(notepad)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt;&lt;br /&gt;System.Diagnostics.Process&amp;nbsp;(WmiPrvSE)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;Now, whenever you want to see what has changed in your environment, create a second snapshot and compare both. Let&amp;#39;s start notepad.exe really quick, then create another snapshot and compare both:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compare-Object&lt;/strong&gt; returns only those processes that exist in either &lt;strong&gt;$shot1 &lt;/strong&gt;or &lt;strong&gt;$shot2&lt;/strong&gt;, and the &lt;strong&gt;SideIndicator&lt;/strong&gt; property tells you in which result set the object was present. A &lt;strong&gt;SideIndicator&lt;/strong&gt; &amp;quot;=&amp;gt;&amp;quot; indicates that processes existed in only the second result set so you know these must be new processes. Interestingly enough, when I launched notepad, Windows also launched a process called &lt;em&gt;WmiPrvSE&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Finding New Files And Folders&lt;/h2&gt;
&lt;p&gt;Wow, that&amp;#39;s easy! Why not use this to find new files and folders added to a folder you&amp;#39;d like to monitor? To do that, you&amp;#39;d first generate a snapshot of that folder, then wait for content to be changed, and finally create another snapshot and compare contents. Let&amp;#39;s take a look:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;Dir&amp;nbsp;$home&lt;br /&gt;PS&amp;gt;&amp;nbsp;Set-Content&amp;nbsp;$home\testfile1.txt&amp;nbsp;&amp;quot;A&amp;nbsp;new&amp;nbsp;file&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;Dir&amp;nbsp;$home&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;&lt;br /&gt;InputObject&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SideIndicator&lt;br /&gt;-----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&lt;br /&gt;testfile1.txt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;It worked. It will not always work like a charm, though. There is an important caveat you need to know about: &lt;strong&gt;SyncWindow&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Adjusting SyncWindow&lt;/h2&gt;
&lt;p&gt;Whenever &lt;strong&gt;Compare-Object &lt;/strong&gt;compares object sets, it uses a &lt;strong&gt;SyncWindow&lt;/strong&gt; to resync both lists when there is no match. The default &lt;strong&gt;SyncWindow&lt;/strong&gt; setting in PowerShell V1 is 5, so whenever the result sets has too many consecutive differences, the result will not be what you expected. Here is an example:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..10&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;10..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..15&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;15..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputObject&amp;nbsp;SideIndicator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----------&amp;nbsp;-------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;In the first part, &lt;strong&gt;Compare-Object&lt;/strong&gt; compares two lists of numbers. Both lists contain the same numbers but in reverse order. The result is nothing, and that is correct since both sets contain the same numbers.&lt;/p&gt;
&lt;p&gt;In the second part, there are 15 numbers in each set. This time, &lt;strong&gt;Compare-Object&lt;/strong&gt; returns a bunch of nonsense information, claiming for example that the number 15 is present only in &lt;strong&gt;$shot1 &lt;/strong&gt;and then only in&lt;strong&gt; $shot2&lt;/strong&gt;. Why?&lt;/p&gt;
&lt;p&gt;The default &lt;strong&gt;SyncWindow&lt;/strong&gt; is 5, so whenerver there is no match, &lt;strong&gt;Compare-Object&lt;/strong&gt; uses a delta of +/- 5 items to find the next matching item. When there are 10 elements in a set, a SyncWindow of 5 is sufficient to resync both lists (plus/minus 5 results in a maximum of 10 allowable consecutive differences). When there are 15 elements, &lt;strong&gt;SyncWindow&lt;/strong&gt; would need to be at least 7 (the first comparison would be number 1 of &lt;strong&gt;$shot1&lt;/strong&gt; against number 15 of &lt;strong&gt;$shot2&lt;/strong&gt;; with a SyncWindow of 7, &lt;strong&gt;Compare-Object&lt;/strong&gt; would move 14 elements in $shot2 to find a match and would indeed find the matching number 1).&lt;/p&gt;
&lt;p&gt;Fortunately, you can change the &lt;strong&gt;SyncWindow&lt;/strong&gt; property using the parameter &lt;strong&gt;-syncWindow&lt;/strong&gt;:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..15&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;15..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-syncWindow&amp;nbsp;7&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-syncWindow&amp;nbsp;6&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputObject&amp;nbsp;SideIndicator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----------&amp;nbsp;-------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;Now, what would the &lt;strong&gt;SyncWindow&lt;/strong&gt; need to be with an array of 16 or 25 elements? Easy: Take the array size, divide it by two and there you go. For an array of 16 elements, the minimum &lt;strong&gt;SyncWindow&lt;/strong&gt; needs to be 8, and for an array of 25 elements it needs to be 12.&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..5&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;5..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..10&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;10..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..15&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;15..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputObject&amp;nbsp;SideIndicator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----------&amp;nbsp;-------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;14&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;1..15&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;15..1&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-syncWindow&amp;nbsp;7&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-syncWindow&amp;nbsp;6&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputObject&amp;nbsp;SideIndicator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-----------&amp;nbsp;-------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;lt;=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;=&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Here are a couple of things to note regarding &lt;strong&gt;SyncWindow&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When SyncWindows is too low,&lt;strong&gt; Compare-Object&lt;/strong&gt; returns false information and reports objects twice, once for each result set&lt;/li&gt;
&lt;li&gt;The default &lt;strong&gt;SyncWindow&lt;/strong&gt; setting of 5 is sufficient only when you expect very small changes in your result sets&lt;/li&gt;
&lt;li&gt;To make sure you catch all matches, you would have to set &lt;strong&gt;SyncWindow&lt;/strong&gt; to half of the number of expected differences. You can also set &lt;strong&gt;SyncWindow&lt;/strong&gt; to a very large number like 1000 as catch-all. This however may cause long delays and a lot of memory consumption&lt;/li&gt;
&lt;li&gt;In PowerShell V2, the default &lt;strong&gt;syncWindow&lt;/strong&gt; setting has been raised as a consequence of this&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Picking Properties&lt;/h2&gt;
&lt;p&gt;Remember everything in PowerShell is represented as object, and objects have properties. If you don&amp;#39;t care about properties, &lt;strong&gt;Compare-Object &lt;/strong&gt;picks the information to use for comparison automatically. This may not be what you want. Have a look:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;Dir&amp;nbsp;$home&lt;br /&gt;PS&amp;gt;&amp;nbsp;Add-Content&amp;nbsp;$home\testfile1.txt&amp;nbsp;&amp;quot;Another&amp;nbsp;line&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;Dir&amp;nbsp;$home&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;Name,&amp;nbsp;Length&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;SideIndicator&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;-------------&lt;br /&gt;testfile1.txt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&amp;nbsp;=&amp;gt;&lt;br /&gt;testfile1.txt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;This is actually a little modification to the example script earlier. I create a folder snapshot, then I add a line to the file I created in the earlier example. Next, I create another snapshot and compare both. The result is: nothing. Why?&lt;/p&gt;
&lt;p&gt;Because I did not pick an object property. So &lt;strong&gt;Compare-Object &lt;/strong&gt;simply looked at the file name, and since I added a line to an existing file, no new file name was created. &lt;/p&gt;
&lt;p&gt;To monitor file changes, I need to explicitly tell &lt;strong&gt;Compare-Object&lt;/strong&gt; to compare both the name and the &lt;strong&gt;Length&lt;/strong&gt; property. Once I do that, I get back two results. The &lt;strong&gt;SideIndicator&lt;/strong&gt; tells me that the file testfile1.txt was 12 Bytes in the initial snapshot and now is 26 Bytes.&lt;/p&gt;
&lt;h2&gt;Working With Results&lt;/h2&gt;
&lt;p&gt;The results delivered by &lt;strong&gt;Compare-Object&lt;/strong&gt; are custom objects returning the properties you selected as well as the &lt;strong&gt;SideIndicator&lt;/strong&gt; property. You can filter and return only selected information. For example, if you&amp;#39;d like to filter the result to show only new elements (&lt;strong&gt;SideIndicator&lt;/strong&gt; equals &amp;quot;=&amp;gt;&amp;quot;), use &lt;strong&gt;Where-Object &lt;/strong&gt;like this:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;Name,&amp;nbsp;Length&amp;nbsp;|&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.SideIndicator&amp;nbsp;-eq&amp;nbsp;&amp;#39;=&amp;gt;&amp;#39;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;SideIndicator&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;-------------&lt;br /&gt;testfile1.txt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;26&amp;nbsp;=&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;You could also use the &lt;strong&gt;-passThru&lt;/strong&gt; parameter to actually return the original objects compared by &lt;strong&gt;Compare-Object&lt;/strong&gt;. When you do this, the SideIndicator property is appended to the original object and you can still use it for filtering:&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;name,&amp;nbsp;length&amp;nbsp;|&amp;nbsp;fl&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;testfile.txt&lt;br /&gt;length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;51&lt;br /&gt;SideIndicator&amp;nbsp;:&amp;nbsp;=&amp;gt;&lt;br /&gt;&lt;br /&gt;name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;testfile.txt&lt;br /&gt;length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;39&lt;br /&gt;SideIndicator&amp;nbsp;:&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;name,&amp;nbsp;length&amp;nbsp;&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;-passThru&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Users\Tobias&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;----&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1/9/2009&amp;nbsp;&amp;nbsp;11:38&amp;nbsp;AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&amp;nbsp;testfile.txt&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1/9/2009&amp;nbsp;&amp;nbsp;11:34&amp;nbsp;AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&amp;nbsp;testfile.txt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;name,&amp;nbsp;length&amp;nbsp;-passThru&amp;nbsp;|&amp;nbsp;fl&amp;nbsp;*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PSPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Users\Tobias\testfile.txt&lt;br /&gt;PSParentPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Users\Tobias&lt;br /&gt;PSChildName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;testfile.txt&lt;br /&gt;PSDrive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C&lt;br /&gt;PSProvider&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem&lt;br /&gt;PSIsContainer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;False&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;SideIndicator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;=&amp;gt;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;-a---&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;testfile.txt&lt;br /&gt;Length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;51&lt;br /&gt;DirectoryName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C:\Users\Tobias&lt;br /&gt;Directory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C:\Users\Tobias&lt;br /&gt;IsReadOnly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;False&lt;br /&gt;Exists&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;True&lt;br /&gt;FullName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C:\Users\Tobias\testfile.txt&lt;br /&gt;Extension&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;.txt&lt;br /&gt;CreationTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;11:31:05&amp;nbsp;AM&lt;br /&gt;CreationTimeUtc&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;10:31:05&amp;nbsp;AM&lt;br /&gt;LastAccessTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;11:31:05&amp;nbsp;AM&lt;br /&gt;LastAccessTimeUtc&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;10:31:05&amp;nbsp;AM&lt;br /&gt;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;11:38:17&amp;nbsp;AM&lt;br /&gt;LastWriteTimeUtc&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;10:38:17&amp;nbsp;AM&lt;br /&gt;Attributes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Archive&lt;br /&gt;&lt;br /&gt;PSPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Users\Tobias\testfile.txt&lt;br /&gt;PSParentPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Users\Tobias&lt;br /&gt;PSChildName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;testfile.txt&lt;br /&gt;PSDrive&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C&lt;br /&gt;PSProvider&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem&lt;br /&gt;PSIsContainer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;False&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;SideIndicator&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&amp;lt;=&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;-a---&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;testfile.txt&lt;br /&gt;Length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;39&lt;br /&gt;DirectoryName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C:\Users\Tobias&lt;br /&gt;Directory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C:\Users\Tobias&lt;br /&gt;IsReadOnly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;False&lt;br /&gt;Exists&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;True&lt;br /&gt;FullName&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;C:\Users\Tobias\testfile.txt&lt;br /&gt;Extension&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;.txt&lt;br /&gt;CreationTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;11:31:05&amp;nbsp;AM&lt;br /&gt;CreationTimeUtc&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;10:31:05&amp;nbsp;AM&lt;br /&gt;LastAccessTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;11:31:05&amp;nbsp;AM&lt;br /&gt;LastAccessTimeUtc&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;10:31:05&amp;nbsp;AM&lt;br /&gt;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;11:34:58&amp;nbsp;AM&lt;br /&gt;LastWriteTimeUtc&amp;nbsp;&amp;nbsp;:&amp;nbsp;1/9/2009&amp;nbsp;10:34:58&amp;nbsp;AM&lt;br /&gt;Attributes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Archive&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;name,&amp;nbsp;length&amp;nbsp;&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;-passThru&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&amp;nbsp;|&amp;nbsp;Where-Object&amp;nbsp;{&amp;nbsp;$_.&lt;/span&gt;&lt;span style="background-color:#012456;" class="style1"&gt;SideIndicator&amp;nbsp;-eq&amp;nbsp;&amp;#39;=&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Users\Tobias&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;----&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1/9/2009&amp;nbsp;&amp;nbsp;11:38&amp;nbsp;AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;51&amp;nbsp;testfile.txt&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Persisting Comparison Information&lt;/h2&gt;
&lt;p&gt;All comparisons so far have taken place in memory because we created the result sets on the fly. What if I&amp;#39;d like to compare folder content against a predefined base set?&lt;/p&gt;
&lt;p&gt;You can easily do that. Simply export the result sets to XML, then reload them and do the comparison. There are three important rules when you do that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Select-Object &lt;/strong&gt;to select only the object properties you really need for your comparison prior to exporting objects to XML or else the XML will be very large&lt;/li&gt;
&lt;li&gt;The result sets you compare both need to be written to XML and re-imported. Do not compare an imported XML result set against a live result set because object types are different&lt;/li&gt;
&lt;li&gt;Specify the properties you want to compare when you use &lt;strong&gt;Compare-Object&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example of persisting result sets. First, I create a snapshot of my &lt;strong&gt;$home&lt;/strong&gt; drive and export it as XML. Since I am interested in new files and changed files, I only export Name and Length.&lt;/p&gt;
&lt;p&gt;Next, whenever I am in need, I can import the base folder set and compare it against the current folder content. To do that, I export&amp;nbsp; the current folder content as XML, too, and reimport it so that&lt;/p&gt;
&lt;div style="font-family:&amp;#39;Courier New&amp;#39;;font-size:12;background:#012456;"&gt;&lt;span style="color:#eeedf0;background-color:#012456;"&gt;PS&amp;gt;&amp;nbsp;Dir&amp;nbsp;$home&amp;nbsp;|&amp;nbsp;Select-Object&amp;nbsp;Name,&amp;nbsp;Length&amp;nbsp;|&amp;nbsp;Export-Clixml&amp;nbsp;$home\baseline.xml&lt;br /&gt;PS&amp;gt;&amp;nbsp;Add-Content&amp;nbsp;$home\testfile.txt&amp;nbsp;&amp;quot;Hello&amp;nbsp;World&amp;quot;&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot1&amp;nbsp;=&amp;nbsp;Import-Clixml&amp;nbsp;$home\baseline.xml&lt;br /&gt;PS&amp;gt;&amp;nbsp;Dir&amp;nbsp;$home&amp;nbsp;|&amp;nbsp;Select-Object&amp;nbsp;Name,&amp;nbsp;Length&amp;nbsp;|&amp;nbsp;Export-Clixml&amp;nbsp;$home\temp.xml&lt;br /&gt;PS&amp;gt;&amp;nbsp;$shot2&amp;nbsp;=&amp;nbsp;Import-Clixml&amp;nbsp;$home\temp.xml&lt;br /&gt;PS&amp;gt;&amp;nbsp;Compare-Object&amp;nbsp;$shot1&amp;nbsp;$shot2&amp;nbsp;-property&amp;nbsp;Name,&amp;nbsp;Length&lt;br /&gt;&lt;br /&gt;Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;SideIndicator&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;-------------&lt;br /&gt;baseline.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;58150&amp;nbsp;=&amp;gt;&lt;br /&gt;temp.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;45056&amp;nbsp;=&amp;gt;&lt;br /&gt;testfile.txt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;39&amp;nbsp;=&amp;gt;&lt;br /&gt;baseline.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8192&amp;nbsp;&amp;lt;=&lt;br /&gt;temp.xml&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;58152&amp;nbsp;&amp;lt;=&lt;br /&gt;testfile.txt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;26&amp;nbsp;&amp;lt;=&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Note that in this example, since I stored the xml files in the same folder I monitored, they will also show up in the result set.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Compare-Object &lt;/strong&gt;is a great way of comparing result sets. You just need to be careful to make sure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you are comparing the same object types (do not mix imported xml data with live data)&lt;/li&gt;
&lt;li&gt;the syncWindow is large enough to cover the number of expected differences&lt;/li&gt;
&lt;li&gt;you specify the properties you really want to compare&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the &lt;strong&gt;SideIndicator&lt;/strong&gt; property to filter result so you only get the changes in one of the result sets. And use the &lt;strong&gt;-passThru&lt;/strong&gt; parameter to get the real objects.&lt;/p&gt;
&lt;p&gt;Cheerio&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=839" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Diff/default.aspx">Diff</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/syncWindow/default.aspx">syncWindow</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Monitor/default.aspx">Monitor</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Snapshot/default.aspx">Snapshot</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Export-CliXML/default.aspx">Export-CliXML</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Compare-Object/default.aspx">Compare-Object</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Import-CliXML/default.aspx">Import-CliXML</category></item><item><title>Using PowerShellPlus with PowerShell V2 (CTP3)</title><link>http://powershell.com/cs/blogs/tobias/archive/2009/01/04/using-powershellplus-with-powershell-v2-ctp3.aspx</link><pubDate>Sun, 04 Jan 2009 21:54:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:803</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=803</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2009/01/04/using-powershellplus-with-powershell-v2-ctp3.aspx#comments</comments><description>&lt;p&gt;The great news is: PowerShellPlus works as-is with PowerShell V1 and PowerShell V2, indicating the stable and solid approach of its engine. No updates needed. From the very beginning, we took care to use only approved and backwards-compatible PowerShell APIs.&lt;/p&gt;
&lt;p&gt;You don&amp;#39;t use &lt;a href="http://www.powershellplus.com"&gt;PowerShellPlus&lt;/a&gt; yet?&amp;nbsp; It is an awesome interactive console and PowerShell editor, and you should really try it! It is derived from famous &amp;quot;PowerShellIDE&amp;quot; which was the world&amp;#39;s first PowerShell GUI, editor and debugger (surfaced June 2006). Yet again, it pays off to have solid 4 years of experience in this product.&lt;/p&gt;
&lt;p&gt;There are a couple of things you should know when you just upgraded from V1 to V2 to get PSP to recognize the new V2 features.&lt;/p&gt;
&lt;h2&gt;Update the Cache&lt;/h2&gt;
&lt;p&gt;For speed purposes, PowerShellPlus caches information regarding available Snap-Ins and Cmdlets. So when you have been using PSP on PowerShell V1 for a while and upgrade to PowerShell V2 CTP3, things continue to work as expected except all new V2 specific Cmdlet parameters and help pages are still missing.&lt;/p&gt;
&lt;p&gt;Normally, PSP detects at startup all freshly added Snapins and adds them to its cache. Upgrading PowerShell is a whole new ballgame though because actually no new snapins is added. Instead, existing snapins are updated.&lt;/p&gt;
&lt;p&gt;To manually reset and update PSPs internal cache, do this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Launch PowerShell Plus&lt;/li&gt;
&lt;li&gt;Hold down SHIFT when the splash screen opens to open the startup management dialog&lt;/li&gt;
&lt;li&gt;Check the option &amp;quot;Clear cached Cmdlet info&amp;quot;, then click OK&lt;/li&gt;
&lt;li&gt;PSP starts and re-examines all available snapins. This may take a minute or two, and you will see a green bar with progress information. Once the green bar is gone, you are all set.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once you cleared and updated the cache, try this:&lt;/p&gt;
&lt;p&gt;Get-WMIObject -&lt;/p&gt;
&lt;p&gt;Code completion will show the complete list of V2 parameters.&lt;/p&gt;
&lt;h2&gt;Update the Learning Center&lt;/h2&gt;
&lt;p&gt;If you&amp;#39;d also like to update the learning center help pages, keep this in mind: the procedure you just executed automatically adds all new help topics to the learning center. It does not update existing topics though. So to update the learning center, simply delete its cache before you do the procedure above (&amp;quot;Yeah, thanks for telling me now! Just did it!&amp;quot; -&amp;nbsp;oh well, ok, just do it again)!&lt;/p&gt;
&lt;p&gt;How do I clear the learning center cache? For example like this:&lt;/p&gt;
&lt;p&gt;del $env:localappdata\PowerShellPlus\manpages\*.htm -whatif&lt;/p&gt;
&lt;p&gt;(Remove the -whatif if you are confident you typed in the correct line)&lt;/p&gt;
&lt;h2&gt;What&amp;#39;s Next?&lt;/h2&gt;
&lt;p&gt;Of course there are plenty of additional extras in PowerShell V2 like block comments and inline code. We will support them with one of our next maintenance releases but for now, isn&amp;#39;t it good to know that PowerShellPlus runs beautifully with PowerShell V2 CTP3? &lt;/p&gt;
&lt;p&gt;Cheers&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=803" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/PowerShellPlus/default.aspx">PowerShellPlus</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Cache/default.aspx">Cache</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/CTP3/default.aspx">CTP3</category></item></channel></rss>