首页 > 解决方案 > 通过数组枚举失败

问题描述

我正在枚举我们的 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; 已用空间=929}
@{name=datastore2; 已用空间=300}
@{name=datastore3; 已用空间=400}

$list可变输出:

名称已用空间
数据存储3 400
数据存储3 400
数据存储3 400

所以它正在枚举。获取所有正确的数据。但由于某种原因,该行$list += $row一直等到数组中的最后一个对象,只获取该数据,但知道数组中有 3 个对象,并用该对象数据填充每个索引。

我为排除故障所做的唯一一件事就是退回了我的 PowerShell 控制台。

标签: powershell

解决方案


这样做的原因是这$row是一个单一的对象。您创建了一次,然后不断更改其属性的值。当您将它添加到数组时,您添加的是对它的引用,而不是副本。因此,看到的值将始终是最近设置的值。

$row在循环的每次迭代中重新创建您的。


推荐阅读