2016-01-13 35 views
0

我正在查詢我的存儲陣列以收集啓動器的屬性。下面是代碼:從數組中選擇數組中的特定值

$global:Xtrem_HBA_list = @() 
$global:Xtrem_HBA_list += Get-XtremInitiators -Properties name,port-address,ig-id 
$Write-Host $global:Xtrem_HBA_list 

這將返回

name     port-address    ig-id 
----     ------------    ----- 
comp-esxi-01_vmhba2 10:00:00:90:fa:53:f4:60 {c832425d03f84644be37ae3d4e49186c, comp-esxi-01, 1} 
comp-esxi-01_vmhba3 10:00:00:90:fa:53:f4:61 {c832425d03f84644be37ae3d4e49186c, comp-esxi-01, 2} 

我的問題是,我需要$全球:Xtrem_HBA_list包含從名稱,端口地址的值,並從IG-ID的第二個值( COMP-的ESXi-01)。我很難從數組中提取數組的值。

感謝馬特!我更新了我的代碼並獲得了我正在尋找的確切輸出。

$global:Xtrem_HBA_list = @() 
$global:arr_HBAs = @() 
$global:Xtrem_HBA_list += (Get-XtremInitiators).name 
foreach ($i in $global:Xtrem_HBA_list){ 
    $global:arr_HBAs += Get-XtremInitiator -InitiatorName $i | Select name,port-address,@{Name="ig-id";Expression={($_."ig-id")[1]}} 
} 
+0

它會_always_是第二個值嗎? – Matt

回答

2

幾個基本的方法來得到這個。

  • 一個循環,每次都從數組中提取值。
  • 使用Add-Member創建另一個「提取」信息並使用Select來提取該列的屬性的循環。
  • 使用calculated property將輸出ig-id列,但只有第二個值來自陣列。這一個也更容易,因爲它會讓我們使用相同的名稱。

我正在選擇後者的建議。我不是故意的使用write-host在這裏,因爲它會只是去到輸出流默認而write-host只會去安慰

$global:Xtrem_HBA_list | Select name,port-address,@{Name="ig-id";Expression={($_."ig-id")[1]}} 

注意,如果有不到兩個元素,將返回null。在這種情況下,它可能會根據嚴格模式生成錯誤。你的里程會有所不同,但如果需要的話,你可以用一些if語句輕鬆加強。

+0

我不能測試這個,但理論上它應該工作。 – Matt

+0

使用計算屬性的好主意!我忘了那些。 '$ global:Xtrem_HBA_list | %{[PSCustomObject] @ {Name = $ _。Name; PortAddress = $ _。「port-address」; IGID = $ _。「ig-id」[1]}}' –

+0

@MadTomVane我只能說關於這一點,當你只需要改變/添加一個屬性時,創建一個全新的對象似乎很奇怪。不知道在某個時候是否有性能交易。 – Matt