
- •1. Using Simple Arrays
- •2. Strongly-Typed Arrays
- •4. Check Arrays Using Wildcards
- •5. Creating Byte Arrays
- •6. Performance Optimization for Arrays
- •7. Reversing Array
- •8. Using Jagged Arrays
- •9. Creating Multi-Dimensional Arrays
- •10. Returning Array in One Chunk (and Preserving Type)
- •11. Creating Range of Letters
- •12. Converting Cmdlet Results into Arrays
- •13. Arrays of Strings
- •14. Using Hash Tables
- •15. Sorting Hash Tables
- •16. Using Ordered Hash Tables
- •17. Converting Hash Tables to Objects
- •18. Using Hash Tables to Translate Numeric Values to Clear Text
- •19. Using Hash Tables for Calculated Properties
- •20. Remove Keys from Hash Tables
- •21. Case-Sensitive Hash Tables

Optionally, you can use array syntax to access hash table elements:
$person[‘Age’]
You can even use other variables to access its keys:
$info = ‘Age’ $person.$info
15. Sorting Hash Tables
A hash table stores key-value pairs and you normally cannot sort its content. Let’s define a hash table first to examine this:
$hash = @{Name=’Tobias’; Age=66; Status=’Online’}
When you output its content, you get two columns, key and value, and when you pipe the result into Sort-Object, the result is not sorted:
PS> $hash | Sort-Object Name |
|
Name |
Value |
---- |
----- |
Status |
Online |
Name |
Tobias |
Age |
66 |
|
|
To sort a hash table, you need to transform its content, by using GetEnumerator() method, into individual objects that can be sorted:
PS> $hash.GetEnumerator() | Sort-Object Name
Name |
Value |
---- |
----- |
Age |
66 |
Name |
Tobias |
Status |
Online |
16. Using Ordered Hash Tables
In PowerShell 3.0, you can use a special type of a hash table that preserves key order. Keys in such hash table always keep the order in which they were defined.
This is how a regular hash table works:
PS> $hash = @{Name=’Tobias’; Age=66; Status=’Online’}
PS> $hash |
|
Name |
Value |
---- |
----- |
Status |
Online |
Name |
Tobias |
Age |
66 |
And this is how an ordered hash table works (requires PowerShell 3.0):
PS> $hash = [Ordered]@{Name=’Tobias’; Age=66; Status=’Online’}
PS> $hash |
|
Name |
Value |
---- |
----- |
Name |
Tobias |
Age |
66 |
Status |
Online |
As you see, the keys are not sorted, they are ordered. They appear exactly in the order they were initially defined. This can be very useful when you use hash table to define objects as shown elsewhere in this document.

17. Converting Hash Tables to Objects
The key-value pairs stored in a hash table can be used to create new objects. Each key is then turned into a NoteProperty, and each value becomes the property value.
PS> $hash = @{Name=’Tobias’; Age=66; Status=’Online’}
PS> $hash |
|
Name |
Value |
---- |
----- |
Status |
Online |
Name |
Tobias |
Age |
66 |
PS> $object = New-Object PSObject -Property $hash
PS> $object |
|
|
Status |
Name |
Age |
------ |
---- |
--- |
Online |
Tobias |
66 |
Note that you have no control over the order of properties. This is because hash table by default does not preserve key order.
To control the order of object properties, either add a Select-Object statement like this:
PS> $object |
|
|
Status |
Name |
Age |
------ |
---- |
--- |
Online |
Tobias |
66 |
PS> $object | Select-Object -Property Name, Status, Age |
|
|
Name |
Status |
Age |
---- |
------ |
--- |
Tobias |
Online |
66 |
|
|
|
Or, in PowerShell 3.0, use ordered hash tables:
PS> $hash = [Ordered]@{Name=’Tobias’; Status=’Online’; Age=66}
PS> $object = New-Object PSObject -Property $hash
PS> $object |
|
|
Name |
Status |
Age |
---- |
------ |
--- |
Tobias |
Online |
66 |

18. Using Hash Tables to Translate Numeric Values to Clear Text
There are situations in which you would like to convert a numeric return value to a meaningful text message. Hash tables can easily do that. First, define a hash table with the numeric values and their corresponding text messages:
$translate = @{ 1 = “One”
2 = “Two”
3 = “Three”
}
Next, you can easily turn numbers into associated meaningful text:
PS> $translate[1]
One
PS> $translate[3]
Three
PS> $id = 2
PS> $translate[$id]
Two
PS>
19. Using Hash Tables for Calculated Properties
Hash tables can generate “calculated” object properties. All you need to do is store two pieces of information: a “Name,” which serves as new property name, and an “Expression,” which is the code used to calculate the column.
Here is a hash table that defines a property called “Age” which calculates the age of files and folders in days. Note the use of $_ inside of the expression script block: this variable represents the object that gets the added property:
$age = @{ Name=’Age’
Expression={ (New-TimeSpan $_.LastWriteTime).Days }
}
Now check out what happens when you submit the hash table to Select-Object and apply it to files and folders:
PS> Get-ChildItem $env:windir | Select-Object Name, $age, Length -First 4
Name |
Age Length |
---- |
--- ------ |
addins |
504 |
AppCompat |
504 |
AppPatch |
11 |
assembly |
4 |

PS> Get-ChildItem $env:windir | Select-Object Name, $age, Length | Sort-Object -Property Age -Descending
Name |
Age |
Length |
---- |
--- |
------ |
twunk_16.exe |
1447 |
49680 |
system.ini |
1447 |
219 |
(…) |
|
|
regedit.exe |
1414 |
427008 |
notepad.exe |
1414 |
193536 |
L2Schemas |
1414 |
|
twain_32.dll |
919 |
51200 |
bfsvc.exe |
919 |
71168 |
explorer.exe |
823 |
2871808 |
(…) |
|
|
winsxs |
11 |
|
assembly |
4 |
|
SysWOW64 |
4 |
|
Microsoft.NET |
4 |
|
System32 |
2 |
|
inf |
2 |
|
setupact.log |
2 |
51585 |
Temp |
0 |
|
WindowsUpdate.log |
0 |
1558682 |
bootstat.dat |
0 |
67584 |
PS> Get-ChildItem $env:windir | Select-Object Name, $age, Length | Where-Object { $_.Age -lt 5 }
Name |
Age |
Length |
---- |
--- |
------ |
assembly |
4 |
|
inf |
2 |
|
Microsoft.NET |
4 |
|
System32 |
2 |
|
SysWOW64 |
4 |
|
Temp |
0 |
|
bootstat.dat |
0 |
67584 |
setupact.log |
2 |
51585 |
WindowsUpdate.log |
0 |
1558682 |
As you see, “Age” has become a true object property that you now can use for sorting or finding only the newest files within a time frame.
20. Remove Keys from Hash Tables
Once you create a hash table, it is easy to add new key-value pairs like this:
$myHash = @{} $myHash.Name = ‘Tobias’ $myHash.ID = 12
$myHash.Location = ‘Hannover’ $myHash
Use its Remove() method to remove a key from a hash table:
$myHash.Remove(‘Location’) $myHash