我有一个从包含多个元素的命令中收集的数据数组。每个项目的名称元素以三个或四个字符标识符开头,后跟连字符。我想得到数组中包含相同标识符的所有项目的计数。
使用以下PowerCLI(VMware)命令收集的数据:
$items = Get-Datastore <Datastore Name> | Get-VM
数据示例:
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-1235-XXXX PoweredOn Info Detail
CBA-1236-XXXX PoweredOn Info Detail
CBA-1237-XXXX PoweredOn Info Detail
我希望脚本能给我以下内容:
NAME COUNT
ABC 3
BCA 2
CBA 4
我真的没有代码示例,但我考虑过使用PowerShell&#34; group&#34;方法与count方法结合使用。我正在努力将如何将所有东西组合成可用的东西。
组:
$array = $items | Group Name
计数:
$array.count
编辑:添加了数据收集命令
答案 0 :(得分:7)
如果您的项目数组名为$items
且列为Name
,那么这应该有效。
$items | %{($_.Name -split "-")[0]} | group | select Name,Count
解构后,您将元素管道传输到ForEach-Object
,您将$_.Name
与字符-
分开,获取第一个元素并将其传递给{{1}然后选择Group-Object
和Name
属性。
答案 1 :(得分:7)
你很接近,但是你不想按照完整名称进行分组 - 你想要将name
拆分为 - 并且只采用第一个[0]元素。
这可以在{script block}中作为计算属性在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
使用群组对象编辑-NoElement只留下最后一步的重新排序