Полезный ответ Матиаса показывает лучший способ решить вашу конкретную проблему.
Что касается что произошло:
Вы - непреднамеренно - использовали функцию PowerShell перечисления доступа к участникам, когда использовали $rows.selectquery
; that is, even though $rows
is a collection that itself has no .selectquery
property, PowerShell accessed that property on every element of the collection and returned результирующие значения в виде массива .
The pitfall is that if the collection only has one element, the return value is not an array - it is just единственное значение свойства элемента само.
Хотя это аналогично тому, как работает конвейер (один объект вывода захватывается сам по себе, если он назначен переменной, в то время как два или более неявно собираются в массив), это несколько противоречит здравому смыслу в контекст перечисления доступа к членам:
- Другими словами,
$collection.SomeProperty
эквивалентно $collection | ForEach-Object { $_.SomeProperty }
и не, что было бы более разумно, поскольку всегда<4382529521515691> возвращает массив2 (23коллекция2)
-
GitHub issue #6802 обсуждает эту проблему.
Хотя такое поведение часто не вызывает проблем, поскольку PowerShell предлагает унифицированную обработку скаляров и коллекций (например, (42)[0]
совпадает с самим 42
; см. возникает, если возвращаемое единственное значение оказывается строкой, потому что индексирование в строку возвращает ее символы.
-
Временное решение: Приведение к
[array]
перед применением индекса:
([array] $rows.selectquery)[0]
Простой пример:
# Multi-element array.
[array] $rows1 = [pscustomobject] @{ selectquery = 'foo' },
[pscustomobject] @{ selectquery = 'bar' }
# Single-element array:
[array] $rows2 = [pscustomobject] @{ selectquery = 'baz' }
# Contrast member-access enumeration + index access between the two:
[pscustomobject] @{
MultiElement = $rows1.selectquery[0]
SingleElement = $rows2.selectquery[0]
SinglElementWithWorkaround = ([array] $rows2.selectquery)[0]
}
Вышеизложенное дает следующее:
MultiElement SingleElement SinglElementWithWorkaround
------------ ------------- --------------------------
foo b baz
Как видите, многоэлементный массив работал, как и ожидалось, потому что перечисление доступа к членам также возвращало массив, в то время как одноэлементный массив возвращал одну строку 'baz'
и 'baz'[0]
возвращает первый символ, 'b'
.
Приведение к [array]
сначала позволяет избежать этой проблемы (([array] $rows2.selectquery)[0]
).
Конечно!!! Пожалуйста, поместите это как ответ? Ты заслуживаешь очков, а я заслуживаю наказания.
Есть ли причина, по которой вы используете foreach с
$row
, но ссылаетесь на selectquery с [i]
, а не[$row]
?ОП, иначе он мне все записи даст?