Powershell根据子字符串计算项目组

时间:2018-05-08 20:51:01

标签: arrays powershell

我有一个从包含多个元素的命令中收集的数据数组。每个项目的名称元素以三个或四个字符标识符开头,后跟连字符。我想得到数组中包含相同标识符的所有项目的计数。

使用以下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

编辑:添加了数据收集命令

2 个答案:

答案 0 :(得分:7)

如果您的项目数组名为$items且列为Name,那么这应该有效。

$items | %{($_.Name -split "-")[0]} | group | select Name,Count

解构后,您将元素管道传输到ForEach-Object,您将$_.Name与字符-分开,获取第一个元素并将其传递给{{1}然后选择Group-ObjectName属性。

答案 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只留下最后一步的重新排序