Простите за заголовок, я не совсем уверен, как объяснить, что я вижу.
Пример кода:
$SampleValues = 1..5
$Result = "" | Select ID
$Results = @()
$SampleValues | %{
$Result.ID = $_
$Results += $Result
}
$Results
Это довольно просто:
- Создание массива с 5 числами для использования в цикле
- Создание временной переменной с NoteProperty с именем ID
- Создание пустого массива для хранения результатов
- Выполните итерацию по каждому из 5 чисел, присваивая их временной переменной, затем добавляя ее к массиву.
Ожидаемый результат - 1,2,3,4,5, но при запуске возвращается 5,5, 5,5,5
Это простой пример, взятый из гораздо более сложного сценария, и я пытаюсь выяснить, почему результат такой, какой он есть.На каждой итерации все элементы, которые уже были добавлены в $ Results, обновляют свои значения до самого последнего значения.Я протестировал принудительное преобразование всего в $ Script: или $ Global: scope и получил те же результаты.
Единственное решение, которое я нашел, это следующее, которое перемещает объявление $ Result в цикл.
$SampleValues = 1..5
$Results = @()
$SampleValues | %{
$Result = "" | Select ID
$Result.ID = $_
$Results += $Result
}
Это работает (вы получаете 1,2,3,4,5 в качестве ваших результатов).Похоже, что $ Results просто содержит несколько ссылок на отдельный объект $ Result, но почему перемещение этого в цикл решает проблему?В этом примере $ Result является строкой, поэтому, возможно, он создает новый объект каждую итерацию, но даже когда я заставил $ Result быть целым числом (которое не должно воссоздавать новый объект, так как целое число не является неизменным, как строка), этоЯ все еще решил проблему, и я получил ожидаемый результат.
Если кто-нибудь знает, почему именно это решает проблему, мне будет очень любопытно.Есть много альтернатив для меня, но я не понимаю, почему это так, и это меня беспокоит.