Почему свойство Enumeration Name не работает? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть скрипт, который я хочу отобразить строки подключения базы данных

Import-Module SqlServer
$AS = New-Object Microsoft.AnalysisServices.Server
$AS.connect("server1")

Теперь, если я использую свойство FindByName()

$db = $AS.Databases.FindByName("database1")
$db.DataSources[0].ConnectionString

, я получаю соединениестрока успешно

однако, если я использую Enumerator

foreach ($db in $AS.Databases.GetEnumerator())
{ $dbName = $db.Name
  $dbName
  $dbName.DataSources[0].ConnectionString
}

, я получаю имя базы данных вместе с ошибкой / исключением (потому что по какой-то причине не удалось получить строку подключения):

database1

Невозможно проиндексировать в нулевой массив.

database2

Невозможно проиндексировать в нулевой массив.

Я пыталсяследующие также:

$database1 = "database1"
$database1.DataSources[0].ConnectionString

и я также получаю то же исключение

Так почему же работает только FindByName?

для дополнительной информации, это то, что перечисляет GetEnumerator:

$AS.Databases.GetEnumerator()

enumerator output

, но также $AS.Databases

выводит одно и то же ... так что же это за точкаперечислитель?

gm -i $AS.Databases

gmdb

gm -i $AS.Databases..GetEnumerator()

gmenu

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

PowerShell выполняет собственное перечисление.

Вот и все!

foreach ($db in $AS.Databases){
  Write-Hst $db.Name -Fore green
  $db.DataSources | ForEach-Object{$_.ConnectionString}
}
0 голосов
/ 27 февраля 2019

Часть того, что вы видите, - это обработка 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 не имеет этих объектов.Надеюсь, это поможет вам углубиться в это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...