Перечислять через массив не удается - PullRequest
0 голосов
/ 14 января 2019

Я перечисляю все хранилища данных в нашей среде VMware, чтобы получить имена и используемое пространство.

Когда я запускаю цикл foreach, он и перечисляет через массив, и не перечисляет через массив.

Вот мой сценарий:

$list = @()
$row = '' | select Name, UsedSpace
$datastores = Get-Datastore

foreach ($store in $datastores) {
    $row.name = $store.name;
    $row.usedspace = [math]::Round(($store.extensiondata.summary.capacity - $store.extensiondata.summary.freespace)/1gb)
    Write-Host $row; #To Verify that each row is different, and that enumeration is working#
    $list += $row;
}

Выход на консоль:

@{name=datastore1; usedspace=929}
@{name=datastore2; usedspace=300}
@{name=datastore3; usedspace=400}

$list переменная мощность:

Name        Usedspace
Datastore3  400
Datastore3  400
Datastore3  400

Так что перечисление до конца. получать все правильные данные. но по какой-то причине строка $list += $row ожидает до последнего объекта в массиве, захватывает только эти данные, но знает, что в массиве есть 3 объекта, и заполняет каждый индекс данными этих объектов.

Единственное, что я сделал для устранения неполадок, - это отскок моей консоли PowerShell.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

В качестве альтернативы вы можете создать PSCustomObject

$list = foreach ($store in Get-Datastore) {
    [PSCustomObject]@{
        Name      = $store.name
        UsedSpace = [math]::Round(($store.extensiondata.summary.capacity - 
                                   $store.extensiondata.summary.freespace)/1gb)
    }
}
$list 

Как уже упоминалось в комментариях, с:

$row = '' | select Name, UsedSpace; $row.GetType()

вы также неявно создаете (пустой) PSCustomObject,
но так как это необходимо создавать на каждой итерации foreach, а затем (неэффективно) добавлять к списку $ путем перестройки массива - непосредственное построение PSCustomObject является IMO более понятным / прямым.

0 голосов
/ 14 января 2019

Причина этого в том, что $row является единственным объектом. Вы создали его один раз, а затем продолжаете изменять значения его свойств. Когда вы добавляете его в массив, вы добавляете к нему ссылку , а не копию. Таким образом, видимые значения всегда будут теми, которые были установлены недавно.

Повторно создавайте $row на каждой итерации цикла.

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