Назад | Перейти на главную страницу

Добавление к массиву в цикле ForEach-Object

Я столкнулся со странной проблемой при попытке добавить к массиву из цикла ForEach-Object, который проходит через другой массив.

Я попытался воссоздать проблему как можно короче:

$InputObject1 = @{
    Property = '123456';
}

$InputObject2 = @{
    Property = '654321';
}

$InputArray = $InputObject1, $InputObject2


$OutputObject = @{
    TargetArray = '';
} 

$InputArray | ForEach-Object {
    Write-Output $_.property
    $OutputObject.TargetArray += $_.property
}

Write-Output "Testing Array Readback" 
Write-Output $OutputObject.TargetArray[0]
Write-Output $OutputObject.TargetArray[1]

Результат, который я получаю:

123456
654321
TESTING Array Readback
1
2

Однако на выходе я пытаясь для достижения это:

123456
654321
TESTING Array Readback
123456
654321

Почему-то, хотя значение $ _. свойство на каждой итерации цикла различается; Значение, записанное в $ OutputObject.TargetArray почти кажется, проходит через значение первой итерации каким-то странным рекурсивным образом.

Я все еще новичок в написании сценариев PowerShell, поэтому приношу свои извинения, если где-то сделал действительно очевидную ошибку или предположение. Этот полностью поставил меня в тупик. Заранее спасибо!


РЕДАКТИРОВАТЬ: Решение найдено.

Благодаря вкладу @LotPings я понял, в чем проблема. Мое определение TargetArray в пределах $ OutputObject было неверно.

Я неправильно написал:

$OutputObject = @{
    TargetArray = '';
}

Что означает строку:

$OutputObject.TargetArray += $_.property

... фактически объединяет два значения вместе, в результате чего получается '123456654321'. В отличие от добавления значения в массив, например {123456, 654321}.

В $ OutputObject Поэтому хеш-таблицу следует определять как:

$OutputObject = @{
    TargetArray = @();
}

Это приводит к желаемому результату.

$InputArray и $OutputObject обе хэш-таблицы,
посмотрите, что они содержат:

> $InputArray

Name                           Value
----                           -----
Property                       123456
Property                       654321

> $OutputObject

Name                           Value
----                           -----
TargetArray                    123456654321

И подумайте, как это могло произойти.