Group-Object
is an awesomely helpful cmdlet to group objects based on common property values, but its implementation is full of bugs in Windows PowerShell.
These bugs have been fixed in PowerShell 7, but there won’t be a fix for Windows PowerShell. If you do use Group-Object
in your Windows PowerShell scripts, with two simple tricks you can work around the bugs.
Bug #1: Exponential Slowness
When you group a large number of objects, Group-Object
can slow down exponentially. We have analyzed this issue in depth before. The issue affects only Windows PowerShell, and it hits you only with a large number of objects.
If you are using Windows PowerShell and feel that your scripts are too slow, try using some of the alternatives in place of Group-Object
.
Bug #2: Keys and Calculated Groups
When you use a calculated property to group objects, in Windows PowerShell keys no longer work:
# use some files as sample data:
$files = Get-ChildItem -Path C:\windows
# objects are grouped, and groups can be accessed via key:
$group = $files | Group-Object -Property Extension -AsHashTable
$group['.exe']
# bug: group with a calculated property instead:
$group = $files | Group-Object -Property { $_.Extension } -AsHashTable
# keys can no longer select groups...
$group['.exe']
# ...even though keys are strings:
$group.Keys | ForEach-Object { $_.GetType().FullName }
# workaround: group with a calculated property and use -AsString:
$group = $files | Group-Object -Property { $_.Extension } -AsHashTable -AsString
# keys can access groups again:
$group['.exe']
To work around this issue, always use the parameter-AsString in combination with the parameter -AsHashtable.
The bug does not occur in PowerShell 7. It is unlikely that this bug will be fixed in Windows PowerShell.