2013-02-27 32 views
1
PS C:\> $array 

ReadWrite(AllHostsSpecified) : 
ReadOnly(AllHostsSpecified) : 
ReadWrite(NegateSpecified) : 
ReadWrite(Negate)   : 
SecFlavor     : sys 
ActualPathname    : 
ReadOnly(AllHosts)   : 
ReadOnly(Name)    : 
ReadWrite(Name)    : 
Anon       : 
Root       : {vin1,vin2,vin3,vin4...} 
ReadOnly(NegateSpecified) : 
ReadWrite(AllHosts)   : 
NosuidSpecified    : False 
Nosuid      : 
ReadOnly(Negate)    : 
Pathname      : /vol/vin_binaries 

嗨,我有屬性根這是一種動態性能和可從(VIN1,VIN2,VIN3,VIN4 .......)其也可以得到即使改變層出不窮。PowerShell中的迭代子屬性的對象

現在,當我做一個出口CSV我需要得到的輸出對象如下

ReadWrite(AllHostsSpecified) : 
ReadOnly(AllHostsSpecified) : 
ReadWrite(NegateSpecified) : 
ReadWrite(Negate)   : 
SecFlavor     : sys 
ActualPathname    : 
ReadOnly(AllHosts)   : 
ReadOnly(Name)    : 
ReadWrite(Name)    : 
Anon       : 
Root (Property 1)       : vin1 
Root (Property 1)       : vin2 
Root (Property 1)       : vin3 
Root (Property 1)       : vin4 
. 
. 
. 
. 

Root (Property n)       : vinn 

ReadOnly(NegateSpecified) : 
ReadWrite(AllHosts)   : 
NosuidSpecified    : False 
Nosuid      : 
ReadOnly(Negate)    : 
Pathname      : /vol/vin_binaries 

是有這個可以實現的方式?像在for循環中遍歷Root的所有屬性?

回答

0

嘗試這樣:

filter ExpandProperties { 
    $obj = $_ 
    $obj | gm -MemberType *property | % { 
     #Find objects with array value 
     if(@($obj.($_.Name)).Count -gt 1) { 
      $count = 1 
      $prop = $_.Name 
      $obj.($prop) | % { 
       #Foreach value in the property 
       $obj | Add-Member NoteProperty -Name "$prop (Property $($count))" -Value $_ 
       $count++ 
      } 
     } 
    } 
    #Output object 
    $obj 
} 

$o1 = New-Object psobject -Property @{ 
    Name = @("Name1", "Name2") 
    Root = @("vin1","vin2") 
} 
$o2 = New-Object psobject -Property @{ 
    Name = "Name2" 
    Root = @("vin1","vin2","vin3") 
} 
$o = $o1, $o2 

$o | ExpandProperties 


Name    : {Name1, Name2} 
Root    : {vin1, vin2} 
Name (Property 1) : Name1 
Name (Property 2) : Name2 
Root (Property 1) : vin1 
Root (Property 2) : vin2 

Name    : Name2 
Root    : {vin1, vin2, vin3} 
Root (Property 1) : vin1 
Root (Property 2) : vin2 
Root (Property 3) : vin3 

這也顯示了原始數組屬性(如 「根」。)。如果你想排除它,你需要在函數內部使用select -exclude ...。但是,這會創建一個新的「pscustomobject」(你失去了原始的對象類型),所以我沒有在上面的解決方案中包含這個。

+0

嗨格雷默,感謝您的回覆,但我想在飛行中做到這一點..輸出$ array – PowerShell 2013-02-27 06:54:43

+0

你不能在飛行中。 PowerShell使用數組來收集多個對象/值。你需要創建一個「過濾器」來完成這項工作。 Mine適合您的情況,但不應該很難將代碼轉換爲檢測並擴展所有分組屬性。我沒有powershell可用atm自己轉換它。 – 2013-02-27 07:35:33

+0

忽略第一行,忘記刪除它們。要使用數組擴展每個屬性,您需要創建一個使用「get-member」來獲取屬性的「過濾器」,然後使用ex。 「計數」只獲得具有數組值的道具,然後使用我的循環來擴展它們全部 – 2013-02-27 07:46:18