Часть того, что вы видите, - это обработка PowerShell (некоторых) перечислимых элементов.Многие (большинство?) Автоматически развертываются PowerShell, поэтому вызов .GetEnumerator()
не требуется.
Вот что происходит в вашем последнем примере, глядя на $AS.Databases
против $AS.Databases.GetEnumerator()
.Но это только потому, что вы отправили его в конвейер в этом случае;это процесс отображения, который развернул (в обоих случаях).
Если вы сделали gm -i $AS.Databases
против gm -i $AS.Databases.GetEnumerator()
, вы увидите разницу;То же самое, если вы присвоили каждому из них переменную и попытались вызвать для них методы.
Но вернемся к использованию foreach
, это снова должно быть избыточным: foreach ($db in $AS.Databases)
должно работать так жекак foreach ($db in $AS.Databases.GetEnumerator())
, но у меня нет этого типа в моей среде прямо сейчас, чтобы проверить это.
Итак, вернемся к проблеме внутри foreach
, я предлагаю вам снова начать проверять типы.Сравните:
$db = $Analysis_Server.Databases.FindByName("database1")
gm -i $db
с
foreach ($db in $AS.Databases.GetEnumerator())
{
gm -i $db
break
}
Вы можете обнаружить, что типы не соответствуют вашим ожиданиям.
Это особенно верно, потому что вы используете точечную .
нотацию, потому что PowerShell имеет еще один встроенный ярлык массива, начиная с версии 3, благодаря чему вы можете использовать .
в массиветипов, чтобы вернуть массив .Property
каждого элемента.Например:
$p = Get-Process chrome # choose your own adventure
$p.Count
$p[0].Name
$p.Name
Таким образом, свойство, которое, как вы думали, вы открываете для одного объекта, могло относиться к массиву объектов и, возможно, возвращало массив (или один объект) и передавалочто в foreach
могло быть возвращено другое количество или что-то еще, в результате чего ваша попытка индексировать в то, что раньше было массивом, больше не работает.
Но, опять же, это предположение с моей стороны, потому что I не имеет этих объектов.Надеюсь, это поможет вам углубиться в это.