То, что вы, вероятно, видите, - это поведение PowerShell, которое автоматически «разворачивает» объект, реализующий IEnumerable. OleDbDataReader реализует IEnumerable. Другими словами, когда вы возвращаете $ Reader, вы действительно делаете:
foreach ($record in $reader) {
write-output $record
}
Чтобы обойти это, вы можете попробовать сделать следующее. (Потеряйте актерский состав, так как он не нужен, я уверен, что вы все равно просто вставите его в качестве проверки здравомыслия.)
Return ,$Reader
Это эффективно создаст одноэлементный массив, который при распаковывании вернет ваш оригинальный OleDbDataReader. Иногда это может быть сложно, и, на мой взгляд, это не интуитивно понятно. Но как только вы понимаете, что происходит, вы начинаете более четко думать о том, возвращаете ли вы один элемент или коллекцию элементов.
Но, сказав, что такая функция, похоже, имеет больше смысла, чтобы она в любом случае возвращала фактические записи через конвейер, а не через считыватель, который вызывающий затем будет отвечать за перечисление и закрытие. Возможно, стоит переосмыслить дизайн функции и выполнить в ней функцию while (reader.read ()), чтобы она выписывала PSObject для каждой строки.