{"id":16181,"date":"2010-12-18T00:01:00","date_gmt":"2010-12-18T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2010\/12\/18\/weekend-scripter-use-powershell-to-create-holiday-wish-list\/"},"modified":"2010-12-18T00:01:00","modified_gmt":"2010-12-18T00:01:00","slug":"weekend-scripter-use-powershell-to-create-holiday-wish-list","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/weekend-scripter-use-powershell-to-create-holiday-wish-list\/","title":{"rendered":"Weekend Scripter: Use PowerShell to Create Holiday Wish List"},"content":{"rendered":"<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p><b><span style=\"font-size:10.0pt\">Summary:<\/span><\/b><span style=\"font-size:10.0pt\"> Learn how to use Windows PowerShell to create a holiday wish list<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">Microsoft Scripting Guy Ed Wilson here. It is almost the end of the year and we have decided to devote some posts to the holiday season. We even have guest bloggers from around the world to share some holiday spirit. Today we have Jeffery Hicks. <\/span><\/p>\n<p><span style=\"font-size:10.0pt\">Jeffery Hicks is a Microsoft MVP in Windows PowerShell and an IT veteran with almost 20 years of experience. Much of it has been spent as an IT consultant specializing in Microsoft server technologies. He works today as an independent author, trainer and consultant. His latest book, with Don Jones, is Windows PowerShell 2.0: TFM (SAPIEN Press 2010). You can keep up with Jeff at&nbsp; <a href=\"http:\/\/jdhitsolutions.com\/blog\">http:\/\/jdhitsolutions.com\/blog<\/a> &nbsp;and twitter.com\/jeffhicks. Or contact him at <a href=\"mailto:jhicks@jdhitsolutions.com\">jhicks@jdhitsolutions.com<\/a>.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\"><\/span><\/p>\n<h2>Really Simple Santa Wish List<\/h2>\n<p><span style=\"font-size:10.0pt\">A time honored holiday tradition, at least in the United States, is for every little boy and girl to make their wish list for Santa. In the pre-Internet age we scribbled our hopes and dreams on a piece of colored construction paper or drafted detailed missives to Jolly Old St. Nick. We also used to walk up hill to school through the snow, both ways. But that&rsquo;s another story.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">In the 21<sup>st<\/sup> century, we can derive our wish lists from new technologies such as RSS. For the scripting geek, what would be a better present than scanning an RSS feed for the latest gadget or toy using Windows PowerShell. For the sake of this post, I&rsquo;m going to use the RSS feeds from NewEgg.com, although the concepts and techniques should apply to just about any RSS feed. In particular, I want to see all the latest Xbox 360 products via <a href=\"http:\/\/www.newegg.com\/Product\/RSS.aspx?Submit=RSSCategorydeals&amp;Depa=0&amp;Category=323&amp;NAME=Xbox-360\">http:\/\/www.newegg.com\/Product\/RSS.aspx?Submit=RSSCategorydeals&amp;Depa=0&amp;Category=323&amp;NAME=Xbox-360<\/a> .<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">Out of the box, Windows PowerShell has no cmdlets for working with RSS feeds. Instead we will use the <b>System.Net.WebClient<\/b> class from the .NET Framework. We&rsquo;ll create such an object using the <b>New-Object<\/b> cmdlet.<\/span><\/p>\n<blockquote>\n<p style=\"font-family:Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $webclient = New-Object -typeName System.Net.WebClient&nbsp; <\/span><span style=\"font-size:10.0pt\"><\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">This object has several methods but we are most interested in <b>DownloadString()<\/b>. This method takes a url as a parameter. Now the fun part. The RSS page we will download is actually an XML document. Because we hope to parse information from the XML document, we should save it to a variable.<\/span><\/p>\n<blockquote>\n<p style=\"font-family:Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; [xml]$rss=$webclient.downloadString(<a href=\"http:\/\/www.newegg.com\/Product\/RSS.aspx?Submit=RSSCategorydeals&amp;Depa=0&amp;Category=323&amp;NAME=Xbox-360\">http:\/\/www.newegg.com\/Product\/RSS.aspx?Submit=RSSCategorydeals&amp;Depa=0&amp;Category=323&amp;NAME=Xbox-360<\/a>)<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\"><\/span><\/p>\n<p><span style=\"font-size:10.0pt\">I specified that <i>$rss<\/i> should be treated as an XML document. Otherwise <i>$rss<\/i> would be one very long string which would require lots of old-fashioned text parsing. Having an XML document is much easier. We can navigate this document by accessing its properties.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $rss<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rss<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&#8212;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rss<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">What we want to look at is the rss property.<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $rss.rss<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">version&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&#8212;&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;-<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">2.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channel<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">If you try to look at <i>$rss.rss.channel<\/i> which would seem like the logical next step, you&rsquo;ll receive an error. That&rsquo;s because of the way the RSS document is structured.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $rss.rss.channel | select item<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">item<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&#8212;-<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">{item, item, item, item&#8230;}<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">What we want to examine are the individual items. Because the item property will be treated as an array we can get the first item like this.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $rss.rss.channel.item[0]<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">If you try this on your own with the Xbox RSS url you&rsquo;ll get a screen full of data, some of which is not too useful in its current form. What would be helpful is to discover the properties of the item.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $rss.rss.channel.item[0] | get-member -MemberType property<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;&nbsp; TypeName: System.Xml.XmlElement<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemberType Definition<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">comments&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; System.String comments {get;set;}<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">description Property&nbsp;&nbsp; System.String description {get;set;}<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">guid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; System.String guid {get;set;}<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">link&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; System.String link {get;set;}<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">pubDate&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; System.String pubDate {get;set;}<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; System.String title {get;set;}<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">With this information I can get just the information I want from the RSS feed.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">PS C:\\&gt; $rss.rss.channel.item | format-table pubdate,title -autosize<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">pubDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">&#8212;&#8212;-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8212;&#8211;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $47.99 &#8211; NBA Jam Xbox 360 Game EA<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $49.99 &#8211; Assassin&#8217;s Creed: Brotherhood Xbox 360 Game UBISOFT<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $56.99 &#8211; Need for Speed Hot Pursuit Limited Edition Xbox 360 Game EA<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $119.99 &#8211; Rock Band 3 Keyboard Bundle Xbox 360 Game EA<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $199.99 &#8211; Microsoft Xbox 360 4 GB Black<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $299.99 &#8211; Microsoft Xbox 360 (New Design) 250 GB Hard Drive Black<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $299.99 &#8211; Microsoft Xbox 360 Kinect Bundle 4 GB Black<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size: 10.0pt\">Tue, 23 Nov 2010 13:24:01GMT $399.99 &#8211; Microsoft Halo Reach Xbox 360 Limited Edition Bundle 250 GB HD Silver<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">Wow. What a wish list. But that was a lot of work to get to this point. Because there are not any cmdlets, I&rsquo;ll write a function.<\/span><\/p>\n<blockquote>\n<p><strong>Get-RSSlist function<\/strong><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">Function Get-RSSList {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">[cmdletBinding()]<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">Param(<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [Parameter(Position=0,Mandatory=$False,ValueFromPipeline=$True,<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; ValueFromPipelineByPropertyName=$True)]<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [ValidateNotNullOrEmpty()]<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [ValidatePattern(&#8220;^http&#8221;)]<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [string[]]$Path=&#8221;http:\/\/www.newegg.com\/Product\/RSS.aspx?Submit=RSSCategorydeals&amp;Depa=0&amp;Category=323&amp;NAME=Xbox-360&#8243;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">)<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">Begin {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; Write-Verbose -Message &#8220;$(Get-Date) Starting $($myinvocation.mycommand)&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; Write-Verbose &#8220;$(Get-Date) Creating WebClient Object&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; $webclient = New-Object -typeName System.Net.WebClient&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;} #close Begin<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">Process {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; Foreach ($url in $Path) {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Verbose &#8220;$(Get-date) Connecting to $url&#8221; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #retrieve the url and save results to an XML document<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #download the rss feed and save as an XML document<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [xml]$data =$webclient.downloadstring($url)<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Warning &#8220;Failed to retrieve any information from the url.&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #only proceed if something was downloaded<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($data)<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #save all rss feed items to a variable<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items=$data.rss.channel.item<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #count the number of returned items<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $count=($items | measure-object).Count<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #get the rss feed title<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $channel=$data.rss.channel.title<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Verbose &#8220;$(Get-Date) found $count items in $channel&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define a regex pattern for price to pull it from the description<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [regex]$PricePattern=&#8221;\\$\\d*\\.\\d*&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #write data to the pipeline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items | Select-Object @{Name=&#8221;Channel&#8221;;Expression={$channel}},<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @{Name=&#8221;Published&#8221;;Expression={$_.PubDate}},<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title,@{Name=&#8221;Price&#8221;;Expression={<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $PricePattern.Match($_.Description).value }},Link<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } #if $data<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Output &#8220;No items found&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; } #close Foreach $url<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;} #close process<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">End {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; Write-Verbose -Message &#8220;$(Get-Date) Ending $($myinvocation.mycommand)&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;} #close End<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">} #close Function<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\"><\/span><\/p>\n<p><span style=\"font-size:10.0pt\">This function makes it easier to receive information from a given RSS feed. The function takes a url as a parameter. You can either enter it as a parameter value, or pipe an object to the function. The parameter accepts pipelined input by value and by property name. This means that you can pipe a list of urls or an object with a <b>Path<\/b> property to the function.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [Parameter(Position=0,Mandatory=$False,ValueFromPipeline=$True,<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; ValueFromPipelineByPropertyName=$True)]<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">The parameter also includes validation to make sure something is entered and that the path begins with http. The pattern I&rsquo;m using is a very simple regular expression.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [ValidateNotNullOrEmpty()]<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; [ValidatePattern(&#8220;^http&#8221;)]<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">I&rsquo;ve given the parameter a default value since this is the RSS feed I usually want to check. I&rsquo;m a big fan of default values because it means less typing at the prompt, yet you still have the option of changing the value if you have to.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">[string[]]$Path=&#8221;http:\/\/www.newegg.com\/Product\/RSS.aspx?Submit=RSSCategorydeals&amp;Depa=0&amp;Category=323&amp;NAME=Xbox-360&#8243;<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">The [] that you see in the object type indicates that the parameter can accept an array of values. In the <b>Process<\/b> script block you will see this code:<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">Process {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; Foreach ($url in $Path) {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Verbose &#8220;$(Get-date) Connecting to $url&#8221; <\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">I need this kind of enumeration when I want a function to process an array of values. My function will work regardless of how url strings are passed to it. Both examples would work.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">PS C:\\&gt; $url1,$url2,$url3 | get-rsslist<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">PS C:\\&gt; get-rsslist $url1,$url2,$url3<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">Most of the rest of the function should look familiar. The url is downloaded to an XML document in a <b>Try<\/b> script block so that if there is an exception, I can handle it with the <b>Catch<\/b> script block.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #download the rss feed and save as an XML document<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [xml]$data =$webclient.downloadstring($url)<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Write-Warning &#8220;Failed to retrieve any information from the url.&#8221;<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">Assuming all is well, all that is left is to extract the relevant information from each element. One additional touch is that I use a regular expression object to pull the price from the description property.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [regex]$PricePattern=&#8221;\\$\\d*\\.\\d*&#8221;<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">The pattern is used in a hash table with <b>Select-Object<\/b>, together with a few others to produce friendlier results.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #write data to the pipeline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items | Select-Object @{Name=&#8221;Channel&#8221;;Expression={$channel}},<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @{Name=&#8221;Published&#8221;;Expression={$_.PubDate}},<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title,@{Name=&#8221;Price&#8221;;Expression={<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $PricePattern.Match($_.Description).value }},Link<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">An alternative would be to use <b>New-Object<\/b> to write a custom object to the pipeline.<\/span><\/p>\n<blockquote>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">$items | ForEach {<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp; New-Object &ndash;typeName PSObject &ndash;Property @{<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp; Channel=$channel<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp; Published=$_.PubDate<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp; Title=$_.Title<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp; Price=$PricePattern.Match($_.Description).value<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp;&nbsp;&nbsp; Link=$_.link<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">&nbsp;&nbsp; }<\/span><\/p>\n<p style=\"font-family: Courier New\"><span style=\"font-size:10.0pt\">}<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-size:10.0pt\">The only other function features I want to point out are all the <b>Write-Verbose<\/b> expressions. Typically when you run the function, you won&rsquo;t see any verbose output. But because this function uses cmdlet binding, if I include <b>&ndash;Verbose<\/b> when running the function, then I&rsquo;ll get all that extra verbose output. I find this very useful for tracing and debugging and include it in my scripts and functions from the beginning.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">After I&rsquo;ve loaded the function in my Windows PowerShell session, all I have to do is run it. The following figure shows what I get with the default RSS path.<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/3480.WES-12-18-10-01.jpg\" border=\"0\" \/><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p><span style=\"font-size:10.0pt\"><\/span><\/p>\n<p><span style=\"font-size:10.0pt\">The output is a collection of custom objects that could be further sorted, grouped, filtered, exported or converted.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">The function even works with an RSS feed from ThinkGeek.com. I&rsquo;ve added one to a wishlist of RSS feeds saved to a text file which I then piped to <b>Get-RSSFeed<\/b>. The following figure shows the command I used to retrieve the information that is stored in the text file.<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/6560.WES-12-18-10-02.jpg\" border=\"0\" \/><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p><span style=\"font-size:10.0pt\"><\/span><\/p>\n<p><span style=\"font-size:10.0pt\">Depending on the structure of the RSS feed, you will most likely have to adjust the function to extract the relevant information. But you should at least understand now how to figure that out. And if I&rsquo;ve been a good boy this year, I hope Santa will remember the USB Fishquarium.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">I think Jeffery has been a good boy for sharing this wish list script. I wonder if it will work on the <a href=\"http:\/\/blogs.technet.com\/b\/heyscriptingguy\/archive\/tags\/scripting+wife\/\">Scripting Wife<\/a> for me like it might for Santa? Thank you Jeffery. <\/span><\/p>\n<p><span style=\"font-size:10.0pt\">Join us tomorrow as we continue our holiday guest blogger weekend with guest Sean Kearney.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">I invite you to follow me on <a target=\"_blank\" href=\"http:\/\/bit.ly\/scriptingguystwitter\">Twitter<\/a> or <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\">Facebook<\/a>. If you have any questions, send email to me at <a target=\"_blank\" href=\"mailto:scripter@microsoft.com\">scripter@microsoft.com<\/a> or post them on the <a target=\"_blank\" href=\"http:\/\/bit.ly\/scriptingforum\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.<\/span><\/p>\n<p><span style=\"font-size:10.0pt\">&nbsp;<\/span><\/p>\n<p><b><span style=\"font-size:10.0pt\">Ed Wilson, Microsoft Scripting Guy<\/span><\/b><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp;&nbsp; Summary: Learn how to use Windows PowerShell to create a holiday wish list &nbsp; Microsoft Scripting Guy Ed Wilson here. It is almost the end of the year and we have decided to devote some posts to the holiday season. We even have guest bloggers from around the world to share some holiday spirit. [&hellip;]<\/p>\n","protected":false},"author":595,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[56,65,207,3,4,167,61,100,165],"class_list":["post-16181","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-guest-blogger","tag-jeffery-hicks","tag-rss-feeds","tag-scripting-guy","tag-scripting-techniques","tag-using-the-internet","tag-weekend-scripter","tag-windows-powershell-ise","tag-xml"],"acf":[],"blog_post_summary":"<p>&nbsp;&nbsp; Summary: Learn how to use Windows PowerShell to create a holiday wish list &nbsp; Microsoft Scripting Guy Ed Wilson here. It is almost the end of the year and we have decided to devote some posts to the holiday season. We even have guest bloggers from around the world to share some holiday spirit. [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/16181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/595"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=16181"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/16181\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=16181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=16181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=16181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}