Я столкнулся со странной проблемой при попытке добавить в массив из цикла 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
По какой-то причине, хотя значение $ _. property различается на каждой итерации цикла; Значение, записываемое в $ 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
И подумайте, как это могло произойти.