Powershell pscustomobject в функции

Задача: необходимо изъять из массива чисел одинаковые, посчитать их количество и вернуть в виде набора пар ('число','количество'). Реализовал в следующей функции:

    function Get-PCICount($numbers, $name)
    {
        $current = $numbers[0]
        $count = 0
        $new_numbers = @()
    
        foreach($number in $numbers)
        {
            if($current -eq $number)
            {
                $count = $count + 1
            }
            else
            {
                $new_numbers += $number
            }
        }
        $tmp += [pscustomobject]@{
            $name = $current
            Count = $count
        }
        if ($new_numbers.count -ne 0)
        {
            Get-PCICount $new_numbers $name
        }
        return $tmp
    }

Данную функцию необходимо вызывать несколько раз, в связи с чем и ввёл параметр $name, однако при проверке обнаружил, что создаваемый в функции объект $tmp не только не исчезает при выходе из тела функции, но ещё и сохраняется при последующих вызовах, из-за чего запись происходит не в новый объект, а в конец предыдущего. Так как поле $name меняется от вызова к вызову, то есть, каждый раз создаётся очередной столбец в $tmp, то на выходе получается совсем печальная картина:

$PCI_width = @( 2.5, 2.5, 5, 5, 8, 8, 8, 8, 2.5, 2.5, 2.5, 5)
$PCI = @( 8, 8, 2.5, 2.5, 2.5, 5)
$res1 = Get-PCICount $PCI_width "PCI_width"
$res2 = Get-PCICount $PCI "PCI"

$res1
$res2

PCI_width Count
--------- -----
        8     4
        5     3
      2,5     5
              1
              3
              2

Вопрос: существует ли метод очистки "временных" объектов, используемых только внутри функции? Существует ли возможность удалить или "освободить" PS_Object (пока что, я не нашёл такого)? Существует ли аналог [pscustomobject], исключающий подобную проблему?

По алгоритму: понимаю, что можно обойтись без рекурсий, но здесь это наиболее лёгкое решение. Если обойти текущую проблему не выйдет, придётся придумывать что-то новое.


Дополнение: Переделал алгоритм под работу с циклом, и после вывода результата удаляю на него одну из ссылок, в расчёте с последующим запуск будет создан новый объект. Результат ниже, вопрос остался тот же...

function Get-PCICount($numbers, $name)
{
    $count = 0
    $tmp_array = $numbers | Sort-Object
    $current = $tmp_array[0]
    $result = for($i = 0; $i -lt $tmp_array.count + 1; $i += 1)
    {
        if($current -eq $tmp_array[$i])
        {
            $count = $count + 1
        }
        else
        {
            [pscustomobject]@{
                $name = $current
                Count = $count
            }
            $current = $tmp_array[$i]
            $count = 1
        }
    }
    Write-Output $result
    Remove-Variable result
}

$PCI_width = @(2.5, 2.5, 5, 5, 8, 8, 8, 8, 2.5, 2.5, 2.5, 5)

$r1 = Get-PCICount $PCI_width "PCI"
$r1
$r2 = Get-PCICount $PCI_width "Ner"
$r2

PCI Count
--- -----
2,5     5
  5     3
  8     4
        5
        3
        4

Ответы (0 шт):