<?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>Search results for 'app:weblogs' matching tags 'scripting techniques', 'arrays hashtables and dictionary objects', and 'Weekend Scripter'</title><link>http://powershell.com/cs/search/SearchResults.aspx?q=app:weblogs&amp;tag=scripting+techniques,arrays+hashtables+and+dictionary+objects,Weekend+Scripter&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tags 'scripting techniques', 'arrays hashtables and dictionary objects', and 'Weekend Scripter'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Weekend Scripter: Improve Performance When Combining PowerShell Arrays</title><link>http://powershell.com/cs/blogs/hey-scriptingguy/archive/2013/04/27/weekend-scripter-improve-performance-when-combining-powershell-arrays.aspx</link><pubDate>Sat, 27 Apr 2013 05:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:23109</guid><dc:creator>Anonymous</dc:creator><description>&lt;p&gt;&lt;span style="font-size:12px;"&gt;&lt;strong&gt;Summary&lt;/strong&gt;: Microsoft premier field engineer, Chris Wu, talks about combining Windows PowerShell arrays.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Scripting Guy, Ed Wilson, is here. Chris Wu, a Microsoft PFE, is back to share his knowledge. See &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/tags/chris+wu/http:/blogs.technet.com/b/heyscriptingguy/archive/tags/chris+wu/" target="_blank"&gt;previous Hey, Scripting Guy! Blog guest posts&lt;/a&gt; from Chris.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Here is contact information for Chris:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Twitter: &lt;a href="https://twitter.com/chwu_ms"&gt;https://twitter.com/chwu_ms&lt;/a&gt;&lt;br /&gt; Facebook: &lt;a href="https://www.facebook.com/mschwu"&gt;https://www.facebook.com/mschwu&lt;/a&gt;&lt;br /&gt; LinkedIn: &lt;a href="http://ca.linkedin.com/in/mschwu"&gt;http://ca.linkedin.com/in/mschwu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Take it away Chris&amp;hellip;&lt;/p&gt;
&lt;p&gt;While teaching a Windows PowerShell workshop, I was asked about how to combine two arrays of different objects (which share one key property) into one that contains objects with properties from both source objects. One real world scenario is to merge information retrieved from Active Directory (a list of Active Directory users and their properties) and Exchange Server (mailboxes).&lt;/p&gt;
&lt;p&gt;The current approach by the student is to use two-level loops, which has seen performance issues when source arrays become huge in size (the following code snippet uses dummy data for demonstration purposes).&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$ADList = @&amp;quot;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;chwu,chwu@microsoft.com,Chris Wu&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;tst1,,Test User1&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;tst2,tst2@contoso.com,Test User2&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;quot;@ | ConvertFrom-Csv -Header Name,mail,CN&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$EXList = @&amp;quot;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;chwu,ex1.contoso.com&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;tst2,ex2.contoso.com&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;quot;@ | ConvertFrom-Csv -Header Name,MailServer&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$Result = @()&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;foreach($ad in $ADList) {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; $Match = $false&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; foreach($ex in $EXList) {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($ad.Name -eq $ex.Name) {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Result += New-Object PSObject -Property @{Name=$ad.Name; mail=$ad.mail; CN=$ad.CN; MailServer=$ex.MailServer}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Match = $true&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; if(-not $Match) {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $Result += New-Object PSObject -Property @{Name=$ad.Name; mail=$ad.mail; CN=$ad.CN}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/3716.wes_2D00_4_2D00_27_2D00_13_2D00_1.png"&gt;&lt;img style="border:0px currentColor;" title="Image of command output" src="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/3716.wes_2D00_4_2D00_27_2D00_13_2D00_1.png" alt="Image of command output" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this post, I will explore several options to improve the performance and cleanness of this code snippet.&lt;/p&gt;
&lt;p&gt;The first thing we can do is remove the use of the &lt;strong&gt;$Result&lt;/strong&gt; array, which has two drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every assignment operation will create a new array in memory with data copied from the source, which is inefficient.&lt;/li&gt;
&lt;li&gt;It defeats the streaming benefit of the WindowsPowerShell pipeline because it returns all objects as a whole at the end of the processing. A best practice in Windows PowerShell is to emit an individual object whenever it&amp;rsquo;s ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another performance issue stems from the use of an inner loop to search for a matching record in the second array, which basically multiplies the total number of iterations. We can utilize a hash table for faster lookup. The &lt;strong&gt;Group-Object&lt;/strong&gt; cmdlet offers a convenient &lt;strong&gt;AsHashTable &lt;/strong&gt;parameter that can be used here.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/8512.wes_2D00_4_2D00_27_2D00_13_2D00_2.png"&gt;&lt;img style="border:0px currentColor;" title="Image of command output" src="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/8512.wes_2D00_4_2D00_27_2D00_13_2D00_2.png" alt="Image of command output" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please be warned that the value portion of each entry is an array of matching records. If we are grouping records by using a property with unique values (such as &lt;strong&gt;SamAccountName&lt;/strong&gt;), those arrays will apparently contains one single element each.&lt;/p&gt;
&lt;p&gt;So an enhanced version of the code snippet is like this (with the constructing source arrays removed):&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$h = $EXList | Group-Object -Property Name -AsHashTable&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$ADList | %{&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; if($h[$_.Name]) {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-Object PSObject -Property @{Name=$_.Name; mail=$_.mail; CN=$_.CN; MailServer=$h[$_.Name][0].MailServer}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; } else {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-Object PSObject -Property @{Name=$_.Name; mail=$_.mail; CN=$_.CN}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;}&lt;/p&gt;
&lt;p&gt;The last (but not the least) idea is to sort both arrays based on the key property (user name) beforehand, then we can pair records in a single iteration. Note that in this particular example, users found in Active Directory is a superset of users in Exchange, so we need a pointer variable to deal with this little quirk.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$ADList = @&amp;quot;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;chwu,chwu@microsoft.com,Chris Wu&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;tst1,,Test User1&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;tst2,tst2@contoso.com,Test User2&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;quot;@ | ConvertFrom-Csv -Header Name,mail,CN | Sort-Object -Property Name&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$EXList = @&amp;quot;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;chwu,ex1.contoso.com&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;tst2,ex2.contoso.com&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;quot;@ | ConvertFrom-Csv -Header Name,MailServer | Sort-Object -Property Name&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$ADList | % {$p = 0} {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; if($_.Name -eq $EXList[$p].Name) {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-Object PSObject -Property @{Name=$_.Name; mail=$_.mail; CN=$_.CN; MailServer=$EXList[$p].MailServer}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $p++&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; } else {&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; New-Object PSObject -Property @{Name=$_.Name; mail=$_.mail; CN=$_.CN}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;}&lt;/p&gt;
&lt;p&gt;The last two snippets perform much better than the original one, but which one is faster remains a question (I haven&amp;rsquo;t tested them against large arrays just yet). I would like to hear about your results, and I welcome your thoughts and ideas.&lt;/p&gt;
&lt;p&gt;~Chris&lt;/p&gt;
&lt;p&gt;Thanks Chris excellent blog post. Join me tomorrow for more cool Windows PowerShell stuff.&lt;/p&gt;
&lt;p&gt;I invite you to follow me on &lt;a href="http://bit.ly/scriptingguystwitter" target="_blank"&gt;Twitter&lt;/a&gt; and &lt;a href="http://bit.ly/scriptingguysfacebook" target="_blank"&gt;Facebook&lt;/a&gt;. If you have any questions, send email to me at &lt;a href="mailto:scripter@microsoft.com" target="_blank"&gt;scripter@microsoft.com&lt;/a&gt;, or post your questions on the &lt;a href="http://bit.ly/scriptingforum" target="_blank"&gt;Official Scripting Guys Forum&lt;/a&gt;. See you tomorrow. Until then, peace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ed Wilson, Microsoft Scripting Guy&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3566535" width="1" height="1" alt="" /&gt;</description></item><item><title>Combine Arrays and Hash Tables in PowerShell for Fun and Profit</title><link>http://powershell.com/cs/blogs/hey-scriptingguy/archive/2011/12/11/combine-arrays-and-hash-tables-in-powershell-for-fun-and-profit.aspx</link><pubDate>Sun, 11 Dec 2011 06:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:13586</guid><dc:creator>Anonymous</dc:creator><description>&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;: Take your Windows PowerShell scripting to the next level by combining hash tables and arrays.&lt;/p&gt;
&lt;p&gt;Microsoft Scripting Guy, Ed Wilson, is here. The Scripting Wife and I are anxiously counting down the days until the first ever &lt;a href="http://powershellgroup.org/Pittsburgh.PA" target="_blank"&gt;Pittsburgh PowerShell Users Group meeting&lt;/a&gt;. The event is quickly selling out; therefore, if you want to attend, you will need to sign up for the meeting. The reason for the reservation is that space at the Pittsburg Microsoft Office is limited. The meeting will be a lot of fun.&lt;/p&gt;
&lt;p&gt;This past week, I talked about working with arrays. Although Windows PowerShell makes working arrays very easy, there are still lots of little things that need special attention. The five articles in the series devoted to working with Arrays in Windows PowerShell are listed here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the first post, &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/05/learn-simple-ways-to-handle-windows-powershell-arrays.aspx" target="_blank"&gt;Learn Simple Ways to Handle Windows PowerShell Arrays&lt;/a&gt;&lt;i&gt;,&lt;/i&gt; I discussed creating arrays, indexing into arrays, and two techniques for walking through an array.&lt;/li&gt;
&lt;li&gt;In the second post, &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/06/add-modify-verify-and-sort-your-powershell-array.aspx" target="_blank"&gt;Add, Modify, Verify, and Sort Your PowerShell Array&lt;/a&gt;,&lt;i&gt; &lt;/i&gt;I discussed adding, modifying, or verifying values in a Windows PowerShell array, and two easy techniques for sorting the array.&lt;/li&gt;
&lt;li&gt;In the third post, &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/07/find-the-index-number-of-a-value-in-a-powershell-array.aspx" target="_blank"&gt;Find the Index Number of a Value in a PowerShell Array&lt;/a&gt;, I talked about working with arrays to determine the index number of a given value. In addition, I covered working with one half of the array at a time.&lt;/li&gt;
&lt;li&gt;In the fourth post, I answered a question that was sent to &lt;a href="mailto:scripter@microsoft.com" target="_blank"&gt;scripter@microsoft.com&lt;/a&gt; about reading a CSV file and building distinguished names on the fly by using array notation. The &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/08/read-a-csv-file-and-build-distinguished-names-on-the-fly-by-using-powershell.aspx" target="_blank"&gt;Read a CSV File and Build Distinguished Names on the Fly by Using PowerShell&lt;/a&gt; post was really cool, and it presented a practical way to use arrays.&lt;/li&gt;
&lt;li&gt;The last post was &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/09/easily-create-and-manipulate-an-array-of-arrays-in-powershell.aspx" target="_blank"&gt;Easily Create and Manipulate an Array of Arrays in PowerShell&lt;/a&gt;&lt;i&gt;, &lt;/i&gt;and I discussed working with an array of arrays.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today, I want to look at creating an array that contains hash tables. Suppose I create a couple of hash tables, such as the ones that are shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$a = @{&amp;quot;one&amp;quot;=1;&amp;quot;two&amp;quot;=2}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$b = @{&amp;quot;three&amp;quot;=3;&amp;quot;four&amp;quot;=4}&lt;/p&gt;
&lt;p&gt;If I want to create an array with these two hash tables, it is as simple as using the equality operator, and assigning them to a variable by using standard array techniques. This command is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$c = $a,$b&lt;/p&gt;
&lt;p&gt;The view of this array of hash tables appears to be a bit strange&amp;mdash;it looks like I am looking at a hash table. This is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;two&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;one&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;three&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;four&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/p&gt;
&lt;p&gt;The cool thing is that I can index into the elements of my array by using square brackets as shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c[0]&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;two&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;one&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&lt;/p&gt;
&lt;p&gt;Because each element of the array contains a hash table, I can index into the array, and then use &amp;ldquo;hash table kinds of commands&amp;rdquo; such as querying the &lt;b&gt;Keys&lt;/b&gt; or &lt;b&gt;Values&lt;/b&gt; properties or using the &lt;b&gt;Item&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method. These commands are shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c[0].values&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;2&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;1&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c[0].keys&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;two&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;one&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c[0].item(&amp;quot;one&amp;quot;)&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;1&lt;/p&gt;
&lt;p&gt;The commands that create two hash tables, add the hash tables to an array, and then index into the array to work with the hash tables are shown in the following image.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/1452.hsg_2D00_12_2D00_11_2D00_11_2D00_01.png"&gt;&lt;img src="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/1452.hsg_2D00_12_2D00_11_2D00_11_2D00_01.png" alt="Image of command output" title="Image of command output" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If I am only interested in the keys that the hash tables contain, I can pipe the array to the &lt;b&gt;Select-Object&lt;/b&gt; cmdlet. This technique is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c | select keys&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Keys&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;{two, one}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;{three, four}&lt;/p&gt;
&lt;p&gt;Although the output does contain the keys, it is not the best output. I can clean things up a bit by using the &lt;i&gt;ExpandProperty &lt;/i&gt;parameter. This command is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c | select -ExpandProperty keys&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;two&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;one&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;three&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;four&lt;/p&gt;
&lt;p&gt;That is about all there is to working with an array of hash tables. Join me tomorrow as I begin a new week with a special guest blog post by Karl Mitschke.&lt;/p&gt;
&lt;p&gt;I invite you to follow me on &lt;a href="http://bit.ly/scriptingguystwitter" target="_blank"&gt;Twitter&lt;/a&gt; and &lt;a href="http://bit.ly/scriptingguysfacebook" target="_blank"&gt;Facebook&lt;/a&gt;. If you have any questions, send email to me at &lt;a href="mailto:scripter@microsoft.com" target="_blank"&gt;scripter@microsoft.com&lt;/a&gt;, or post your questions on the &lt;a href="http://bit.ly/scriptingforum" target="_blank"&gt;Official Scripting Guys Forum&lt;/a&gt;. See you tomorrow. Until then, peace.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ed Wilson, Microsoft Scripting Guy&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3469582" width="1" height="1" alt="" /&gt;</description></item><item><title>Create a Hash Table in PowerShell that Contains Hash Tables</title><link>http://powershell.com/cs/blogs/hey-scriptingguy/archive/2011/12/10/create-a-hash-table-in-powershell-that-contains-hash-tables.aspx</link><pubDate>Sat, 10 Dec 2011 06:00:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:13576</guid><dc:creator>Anonymous</dc:creator><description>&lt;p&gt;&lt;b&gt;Summary&lt;/b&gt;: Learn how to work with hash tables that contain other hash tables in Windows PowerShell.&lt;/p&gt;
&lt;p&gt;Microsoft Scripting Guy, Ed Wilson, is here. Well, it is a typical winter day here in Charlotte, North Carolina in the United States. I am not talking about a nice, cool, sunny day with cobalt blue skies streaked by fluffy cotton candy clouds&amp;mdash;nope, that is the &amp;ldquo;chamber of commerce&amp;rdquo; picture. A typical winter day around here seems to be cool, damp, and drizzled with rain&amp;mdash;at least that is the way it has been for the past several days. That is OK; I figure we need all the rain we can get, as long as it does not come all at once.&lt;/p&gt;
&lt;p&gt;I thought I would get up early and work on my presentation for the &lt;a href="http://powershellgroup.org/Pittsburgh.PA" target="_blank"&gt;Pittsburgh PowerShell User Group meeting&lt;/a&gt;. The Scripting Wife and I will be there for the first meeting, and we are both really looking forward to it. Space is limited at the meeting; therefore, it is essential to sign up early to obtain a ticket (the tickets are free).&lt;/p&gt;
&lt;p&gt;This past week, I talked about working with arrays. Although Windows PowerShell makes working arrays very easy, there are still lots of little things that need special attention. The five articles in the series devoted to working with Arrays in Windows PowerShell are listed here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the first post, &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/05/learn-simple-ways-to-handle-windows-powershell-arrays.aspx" target="_blank"&gt;Learn Simple Ways to Handle Windows PowerShell Arrays&lt;/a&gt;&lt;i&gt;,&lt;/i&gt; I discussed creating arrays, indexing into arrays, and two techniques for walking through an array.&lt;/li&gt;
&lt;li&gt;In the second post, &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/06/add-modify-verify-and-sort-your-powershell-array.aspx" target="_blank"&gt;Add, Modify, Verify, and Sort Your PowerShell Array&lt;/a&gt;,&lt;i&gt; &lt;/i&gt;I discussed adding, modifying, or verifying values in a Windows PowerShell array, and two easy techniques for sorting the array.&lt;/li&gt;
&lt;li&gt;In the third post, &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/07/find-the-index-number-of-a-value-in-a-powershell-array.aspx" target="_blank"&gt;Find the Index Number of a Value in a PowerShell Array&lt;/a&gt;, I talked about working with arrays to determine the index number of a given value. In addition, I covered working with one half of the array at a time.&lt;/li&gt;
&lt;li&gt;In the fourth post, I answered a question that was sent to &lt;a href="mailto:scripter@microsoft.com" target="_blank"&gt;scripter@microsoft.com&lt;/a&gt; about reading a CSV file and building distinguished names on the fly by using array notation. The &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/08/read-a-csv-file-and-build-distinguished-names-on-the-fly-by-using-powershell.aspx" target="_blank"&gt;Read a CSV File and Build Distinguished Names on the Fly by Using PowerShell&lt;/a&gt; post was really cool, and it presented a practical way to use arrays.&lt;/li&gt;
&lt;li&gt;The last post was &lt;a href="http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/09/easily-create-and-manipulate-an-array-of-arrays-in-powershell.aspx" target="_blank"&gt;Easily Create and Manipulate an Array of Arrays in PowerShell&lt;/a&gt;&lt;i&gt;, &lt;/i&gt;and I discussed working with an array of arrays.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the cool things to do with Windows PowerShell is to create a hash table that contains other hash tables. Creating a hash table that contains other hash tables offers a decent amount of flexibility, but it can become a bit confusing. Today, I thought I would spend a little time to help alleviate some of that confusion.&lt;/p&gt;
&lt;p&gt;To create a hash table, I use the &amp;ldquo;hash table&amp;rdquo; operator that consists of an at sign (@), and a pair of curly brackets. Remember, that a hash table consists of one or more key/value pairings. For example, I create a hash table that consists of three items. This hash table is stored in the &lt;b&gt;hashtable&lt;/b&gt; variable as shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$hashtable = @{1=&amp;quot;one&amp;quot;;2=&amp;quot;two&amp;quot;;3=&amp;quot;three&amp;quot;}&lt;/p&gt;
&lt;p&gt;When I examine the hash table, I see that the numbers are the name (key) elements, and the words are the associated value. This is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $hashtable&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; three&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; two&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; one&lt;/p&gt;
&lt;p&gt;If&lt;i&gt; &lt;/i&gt;I create an additional hash table, and I attempt to add it to the hash table that is stored in the &lt;b&gt;hashtable&lt;/b&gt;&lt;i&gt; &lt;/i&gt;variable, an error occurs. The error is shown in the following image.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/8032.hsg_2D00_12_2D00_10_2D00_11_2D00_01.png"&gt;&lt;img src="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/8032.hsg_2D00_12_2D00_10_2D00_11_2D00_01.png" alt="Image of command output" title="Image of command output" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Receiving an error is certainly not my desired result. I then decide to use the += operator to add the two hash tables together. This technique is shown in the following image.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/6320.hsg_2D00_12_2D00_10_2D00_11_2D00_02.png"&gt;&lt;img src="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/6320.hsg_2D00_12_2D00_10_2D00_11_2D00_02.png" alt="Image of command output" title="Image of command output" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, merely adding the two hash tables together, does not allow me to have a hash table of hash tables. It creates a larger hash table and automatically incorporates the elements from the new hash table into the old hash table.&lt;/p&gt;
&lt;p&gt;To create a hash table that contains other hash tables requires remembering that a hash table is comprised of key/value combinations. Therefore, I use the &lt;b&gt;Add&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method, but I first add a key value, then I store the hash table in the value portion. The syntax is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$newhash.Add(&amp;quot;hashtable&amp;quot;,$hashtable)&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;In the following image, I create two hash tables. I then create an empty hash table and call the &lt;b&gt;Add&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method to add the two hash tables to the newly created one.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/3201.hsg_2D00_12_2D00_10_2D00_11_2D00_03.png"&gt;&lt;img src="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-76-18/3201.hsg_2D00_12_2D00_10_2D00_11_2D00_03.png" alt="Image of command output" title="Image of command output" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When I have a hash table that contains other hash tables, I can use the &lt;b&gt;Values&lt;/b&gt;&lt;i&gt; &lt;/i&gt;property to view all the properties that are contained in the hash table. This command is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $newhash.Values&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; five&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; four&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; three&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; two&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; one&lt;/p&gt;
&lt;p&gt;In addition to viewing the values&lt;i&gt;, &lt;/i&gt;I can view the keys in the hash table by using the &lt;b&gt;Keys&lt;/b&gt;&lt;i&gt; &lt;/i&gt;property. This command is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $newhash.Keys&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;h&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;hashtable&lt;/p&gt;
&lt;p&gt;I can also use the &lt;b&gt;Item&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method to retrieve a specific hash table. To do this, I use the &lt;b&gt;Key&lt;/b&gt;&lt;i&gt; &lt;/i&gt;property, which displays in the output as a &lt;strong&gt;Name&lt;/strong&gt; column as shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $newhash.Item(&amp;quot;h&amp;quot;)&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; five&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;4&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;four&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $newhash.Item(&amp;quot;hashtable&amp;quot;)&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; three&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; two&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; one&lt;/p&gt;
&lt;p&gt;In addition to retrieving the hash tables that are stored in the &lt;b&gt;newhash&lt;/b&gt;&lt;i&gt; &lt;/i&gt;hash table via the &lt;b&gt;Item&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method, I can also retrieve specific items from the stored hash tables. This technique is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $newhash.Item(&amp;quot;hashtable&amp;quot;).item(1)&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;one&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $newhash.Item(&amp;quot;h&amp;quot;).item(4)&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;four&lt;/p&gt;
&lt;p&gt;It is possible to work with the hash tables that are stored in the hash table in the same way that one works with other hash tables. For example, suppose I want to create two hash tables, and I store those two hash tables in a new hash table. The code to do this is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$a = @{&amp;quot;dog&amp;quot;=&amp;quot;dog food&amp;quot;;&amp;quot;cat&amp;quot;=&amp;quot;cat food&amp;quot;}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$b = @{&amp;quot;people&amp;quot;=&amp;quot;people food&amp;quot;}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;$c = @{&amp;quot;one&amp;quot;=$a;&amp;quot;Two&amp;quot;=$b}&lt;/p&gt;
&lt;p&gt;I can use the &lt;b&gt;Keys&lt;/b&gt;&lt;i&gt; &lt;/i&gt;property to retrieve the keys from one of the hash tables, and I can use the &lt;b&gt;Values&lt;/b&gt;&lt;i&gt; &lt;/i&gt;property to look at the values. This technique is shown here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c.Item(&amp;quot;two&amp;quot;).keys&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;people&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c.Item(&amp;quot;two&amp;quot;).values&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;people food&lt;/p&gt;
&lt;p&gt;In addition, I can use the &lt;b&gt;Add&lt;/b&gt;&lt;i&gt; &lt;/i&gt;method to add key/value pairs to one of the hash tables. This appears here.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c.Item(&amp;quot;two&amp;quot;).add(&amp;quot;more people&amp;quot;,&amp;quot;more people food&amp;quot;)&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;PS C:\&amp;gt; $c&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; Value&lt;/p&gt;
&lt;p style="padding-left:30px;"&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; -----&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Two&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {people, more people}&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;one&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {dog, cat}&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Well, that is about all there is to working with hash tables that contain other hash tables.&lt;/p&gt;
&lt;p&gt;I invite you to follow me on &lt;a href="http://bit.ly/scriptingguystwitter" target="_blank"&gt;Twitter&lt;/a&gt; and &lt;a href="http://bit.ly/scriptingguysfacebook" target="_blank"&gt;Facebook&lt;/a&gt;. If you have any questions, send email to me at &lt;a href="mailto:scripter@microsoft.com" target="_blank"&gt;scripter@microsoft.com&lt;/a&gt;, or post your questions on the &lt;a href="http://bit.ly/scriptingforum" target="_blank"&gt;Official Scripting Guys Forum&lt;/a&gt;. See you tomorrow. Until then, peace.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ed Wilson, Microsoft Scripting Guy&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3469560" width="1" height="1" alt="" /&gt;</description></item></channel></rss>