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