
Welcome PowerShell User! This recipe is just one of the hundreds of useful resources contained in the PowerShell Cookbook.
If you own the book already, login here to get free, online, searchable access to the entire book's content.
If not, the Windows PowerShell Cookbook is available at Amazon, or any of your other favourite book retailers. If you want to see what the PowerShell Cookbook has to offer, enjoy this free 90 page e-book sample: "The Windows PowerShell Interactive Shell".
You have a hashtable of keys and values, and you want to get the list of values that result from sorting the keys in order.
To sort a hashtable, use the GetEnumerator() method on the hashtable to access its individual elements. Then use the Sort-Object cmdlet to sort by Name or Value:
foreach($itemin$myHashtable.GetEnumerator()|Sort-ObjectName){$item.Value}
If you control the definition of the hashtable, use the [Ordered] type cast while defining the hashtable to have it retain the order supplied in the definition.
$orderedHashtable=[Ordered]@{Item1="Hello";Item2="World"}
Since the primary focus of a hashtable is to simply map keys to values, it doesn’t usually retain any ordering whatsoever—such as the order you added the items, the sorted order of the keys, or the sorted order of the values. This becomes clear in Example 7-3.
PS > $myHashtable = @{}
PS > $myHashtable["Hello"] = 3
PS > $myHashtable["Ali"] = 2
PS > $myHashtable["Alien"] = 4
PS > $myHashtable["Duck"] = 1
PS > $myHashtable["Hectic"] = 11
PS > $myHashtable
Name Value
---- -----
Hectic 11
Duck 1
Alien 4
Hello 3
Ali 2However, the hashtable object supports a GetEnumerator() method that lets you deal with the individual hashtable entries—all of which have a Name and Value property. Once you have those, we can sort by them as easily as we can sort any other PowerShell data. Example 7-4 demonstrates this technique.
PS > $myHashtable.GetEnumerator() | Sort-Object Name Name Value ---- ----- Ali 2 Alien 4 Duck 1 Hectic 11 Hello 3 PS > $myHashtable.GetEnumerator() | Sort-Object Value Name Value ---- ----- Duck 1 Ali 2 Hello 3 Alien 4 Hectic 11
By using the [Ordered] type cast, you can create a hashtable that retains the order in which you define and add items:
PS > $myHashtable = [Ordered] @{
Duck = 1;
Ali = 2;
Hectic = 11;
Alien = 4;
}
PS > $myHashtable["Hello"] = 3
PS > $myHashtable
Name Value
---- -----
Duck 1
Ali 2
Hectic 11
Alien 4
Hello 3
For more information about working with hashtables, see “Hashtables (Associative Arrays)”.
“Hashtables (Associative Arrays)”