在数组中创建客户对象和属性

时间:2018-01-29 22:33:47

标签: powershell

提前感谢您的帮助。

我需要做的是在对象数组中添加多个属性和子属性。

具体来说,我使用PowerNSX获取为NSX准备的NSX集群的一些数据,这是通过使用命令Get-NsxClusterStatus来完成的,此命令的返回值将如下所示:

featureId          : com.vmware.vshield.firewall
featureVersion     : 5.5
updateAvailable    : false
status             : GREEN
message            : 
installed          : true
enabled            : true
allowConfiguration : false

featureId          : com.vmware.vshield.vsm.messagingInfra
updateAvailable    : false
status             : GREEN
installed          : true
enabled            : true
allowConfiguration : false

featureId          : com.vmware.vshield.vsm.vdr_mon
featureVersion     : 5.5
updateAvailable    : false
status             : UNKNOWN
installed          : false
enabled            : true
allowConfiguration : false

featureId          : com.vmware.vshield.vsm.vxlan
featureVersion     : 5.5
updateAvailable    : false
status             : GREEN
installed          : true
enabled            : true
allowConfiguration : false

featureId          : com.vmware.vshield.vsm.nwfabric.hostPrep
featureVersion     : 6.3.4.7087695
updateAvailable    : false
status             : GREEN
installed          : true
enabled            : true
allowConfiguration : false

如果我在foreach循环中使用Get-NsxClusterStatus命令获取所有Cluster的所有信息然后将它们添加到数组中,我将从上面输出多个输出,例如:

$AllClusters = Get-Cluster 
$AllNsxClusterInfo = @()
foreach ($Cluster in $AllClusters) {
$NsxClustersInfo = $Cluster | Get-NsxClusterStatus
$AllNsxClusterInfo += $NsxClustersInfo
}

$ AllNsxClusterInfo的输出与上面的示例相同,但每个群集的输出多次。

我需要的是有一个foreach循环并在$ AllNsxClusterInfo数组中添加每个集群的属性,在这个属性中我将有另外4个属性如下(firewall,messagingInfra,vxlan,hostPrep)以及每个属性我将获得4个属性所需的数据

我们的想法是组织返回的值,以便将来在我正在创建的脚本中使用。

目前正在做的事情(哪个失败)如下:

$GetAllClusters = Get-Cluster
$PreparedClusters = @()
$PreparedClusterInfo = @()
$i = 1
$Cluster = Get-Cluster -Name HQ-Prod
$CheckClusterPreparation = $Cluster | Get-NsxClusterStatus | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.nwfabric.hostPrep"}
$ClusterName = $Cluster.name
If ($CheckClusterPreparation.installed -Match "True") {$PreparedClusters += $Cluster.name}
$GetPreparedClusterInfo = $Cluster | Get-NsxClusterStatus

$ClsuterNumber = "ClusterNumber" + $i

$PreparedClusterInfo += New-Object -TypeName PSObject -Property @{ClusterNumber=$ClsuterNumber}
$PreparedClusterInfo.$ClusterName += New-Object -TypeName PSObject -Property @{Feature="hostPrep"}
$PreparedClusterInfo.$ClusterName.hostPrep += New-Object -TypeName PSObject -Property @{Value=($GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.nwfabric.hostPrep"})}
$PreparedClusterInfo.$ClusterName += New-Object -TypeName PSObject -Property @{Feature="vxlan"}
$PreparedClusterInfo.$ClusterName.vxlan += New-Object -TypeName PSObject -Property @{Value=($GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.vxlan"})}
$PreparedClusterInfo.$ClusterName += New-Object -TypeName PSObject -Property @{Feature="firewall"}
$PreparedClusterInfo.$ClusterName.firewall += New-Object -TypeName PSObject -Property @{Value=($GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.firewall"})}
$PreparedClusterInfo.$ClusterName += New-Object -TypeName PSObject -Property @{Feature="messagingInfra"}
$PreparedClusterInfo.$ClusterName.messagingInfra += New-Object -TypeName PSObject -Property @{Value=($GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.messagingInfra"})}

当我想要检索群集号2的VXLAN信息时,我最终需要什么我会使用以下内容:

$ PreparedClusterInfo.ClusterNumber2.vxlan

希望我能够清楚地解释自己并感谢你的帮助

1 个答案:

答案 0 :(得分:1)

我认为你误解了如何构造PSObject,我认为你需要知道什么是哈希表。

使用类型加速器构造PSObject(或[PSCustomObject])。您构造一个对象以具有各种属性(您命名),并可以为这些属性分配值。以您创建的第一个对象为例:

$PreparedClusterInfo += New-Object -TypeName PSObject -Property @{ClusterNumber=$ClsuterNumber}

这将使用哈希表@{ClusterNumber=$ClsuterNumber}创建一个对象来定义属性及其值。该哈希表具有1个键/值组合,因此该对象将具有一个属性。该属性将被命名为“ClusterNumber'”,其值为$ClsuterNumber(我猜测是$ClusterNumber的拼写错误,并将继续使用该属性)

您可以引用该对象并查看:

ClusterNumber: ClusterNumber1

...因为' ClusterNumber1'是创建对象时$ClusterNumber的值。然后,您将继续创建越来越多的对象。

我认为这里更适合你的是哈希表。简单来说,哈希表是一个参考字典。您可以定义键(在左侧)和该键的值(在右侧)。然后,当您稍后引用该键时,它将告诉您该值。如:

$MyHashTable = @{
    'Animal' = 'Dog'
    'Food' = 'Cake'
    'Vehicle' = 'HD Fatboy'
}

我将该哈希表的键定义为Animal,Food和Vehicle。然后我可以引用它们来获取它们的值,例如$MyHashTable.Food将返回Cake。另一种方法是创建一个空的哈希表,然后像这样添加键/值对:

$MyHashTable = @{}
$MyHashTable.Add('Animal','Dog')
$MyHashTable.Add('Food','Cake')
$MyHashTable.Add('Vehicle','HD Fatboy')

或者你甚至可以这样做:

$MyHashTable = @{}
$MyHashTable.'Animal' = 'Dog'
$MyHashTable.'Food' = 'Cake'
$MyHashTable.'Vehicle' = 'HD Fatboy'

出于您的目的,我会创建一个哈希表,其中簇号是键,并且值是嵌套的哈希表,您可以在其中定义各种其他属性,例如' vxlan'。

$PreparedClusterInfo = @{}

<Other code to collect cluster info>

$PreparedClusterInfo.$ClusterNumber = @{
    hostPrep = $GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.nwfabric.hostPrep"}
    vxlan = $GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.vxlan"}
    firewall = $GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.firewall"}
    messagingInfra = $GetPreparedClusterInfo | Where-Object {$_.featureId -Match "com.vmware.vshield.vsm.messagingInfra"}
}

重新定义$ClusterNumber$GetPreparedClusterInfo后,您可以为其他群集重复此操作。

此时您确实可以像您希望的那样引用$PreparedClusterInfo,它将返回您期望的值:

PS C:\WINDOWS\system32> $PreparedClusterInfo.ClusterNumber2.vxlan

featureId          : com.vmware.vshield.vsm.vxlan
featureVersion     : 5.5
updateAvailable    : false
status             : GREEN
installed          : true
enabled            : true
allowConfiguration : false