提前感谢您的帮助。
我需要做的是在对象数组中添加多个属性和子属性。
具体来说,我使用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
希望我能够清楚地解释自己并感谢你的帮助
答案 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