Вы близки, но не хотите группировать по полному имени - вы хотите разделить name
at - и взять только первый элемент [0].
Это можно сделать on the fly
внутри {блока сценария} как вычисляемое свойство.Здесь группа является желаемым результатом, в других случаях (сортировка по несуществующему в противном случае свойству) она не оставляет следов в текущих данных.
Это показывает пошаговое преобразование ваших данных:
$items = Get-Datastore <Datastore Name> | Get-VM
$Items
NAME STATUS INFO DETAIL
---- ------ ---- ------
ABC-1234-XXXX PoweredOn Info Detail
ABC-1235-XXXX PoweredOn Info Detail
ABC-1236-XXXX PoweredOn Info Detail
BCA-1234-XXXX PoweredOn Info Detail
BCA-1235-XXXX PoweredOn Info Detail
CBA-1234-XXXX PoweredOn Info Detail
CBA-1234-XXXX PoweredOn Info Detail
CBA-1234-XXXX PoweredOn Info Detail
CBA-1234-XXXX PoweredOn Info Detail
$Items | Group-Object {$_.Name.Split('-')[0]}
Count Name Group
----- ---- -----
3 ABC {@{NAME=ABC-1234-XXXX; STATUS=PoweredOn; INFO=Info; DETAIL=Detail}, ...
2 BCA {@{NAME=BCA-1234-XXXX; STATUS=PoweredOn; INFO=Info; DETAIL=Detail}, ...
4 CBA {@{NAME=CBA-1234-XXXX; STATUS=PoweredOn; INFO=Info; DETAIL=Detail}, ...
$Items | Group-Object {$_.Name.Split('-')[0]} | Select-Object Name,Count
Name Count
---- -----
ABC 3
BCA 2
CBA 4
Редактирование с использованием Group-Object -NoElement оставило бы только переупорядочениеза последний шаг