Я столкнулся с подобными проблемами некоторое время назад. Посмотрите на этот код:
Я создаю свой собственный перечислитель, который печатает некоторую информацию о том, когда он вызывается. Это то же самое, что ваш SqlDataReader
, который (я думаю) также реализует IEnumerator
.
PS> Add-Type -TypeDefinition @"
using System;
using System.Collections;
public class MyEnumerator2 : IEnumerator
{
private int _count = 10;
private Random r = new Random();
public MyEnumerator2(int count)
{
_count = count;
}
public bool MoveNext()
{
Console.WriteLine("Moving!");
_count--;
return _count >= 0;
}
public void Reset()
{
throw new NotImplementedException();
}
public object Current
{
get
{
Console.WriteLine("Current!");
return r.Next();
}
}
}
"@
Тогда давайте создадим объект типа и попробуем вывести его:
PS> $mye = New-Object MyEnumerator2 5
PS> $mye | % -begin { write-host 'starting' } -Process { write-host 'next is ' $_ }
starting
Moving!
Current!
next is 2081278528
Moving!
Current!
next is 2000135673
Moving!
Current!
next is 692162542
Moving!
Current!
next is 1531746038
Moving!
Current!
next is 1550381634
Moving!
Все как и ожидалось. Но .. сейчас
PS> function iteratemye($o) {
$o | % -begin { write-host 'starting' } -Process { write-host 'next is ' $_ }
}
PS> $mye = New-Object MyEnumerator2 5
PS> iteratemye $mye
Moving!
Current!
Moving!
Current!
Moving!
Current!
Moving!
Current!
Moving!
Current!
Moving!
starting
Moving!
Если вы передадите этот перечислитель в функцию, он прочитается до того, как он достигнет тела . Это очень плохо.
Итак, взгляните на ваш код. Если вы используете какую-то функцию, например, мой iteratemye
, это является причиной ваших проблем.
Обновление: не реализовано IEnumerator
, но IEnumerable
.
Я вижу, что вы просто передаете объект какому-то конструктору, что не является той же проблемой, с которой я столкнулся, но я считаю, что PowerShell все равно попытается получить перечислитель и поработать над магией.