2017-02-21 132 views
0

我在Powershell中有一個由對象內的對象組成的信息數組。它深入4個物體。有沒有辦法從最底層的對象中選擇一個屬性,同時保持在頂層?這是否有道理我在問什麼?從對象中選擇對象

$result 
active     : active 
security     : @{waf=; acls=} 
sealloaction    : 
siteDualFactorSettings : @{enabled=False; version=0} 
login_protect    : @{enabled=False; url_patterns=System.Object[]} 
performance_configuration : @{advanced_caching_rules=; acceleration_level=standard; cache300x=False; cache_headers=System.Object[]} 

$result.security 

waf      acls      
---      ----      
@{rules=System.Object[]} @{rules=System.Object[]} 

$result.security.waf 

rules                                                                
-----                                                                
{@{action=api.threats.action.block_request; action_text=Block; id=api.threats.sql_injection; name=SQL Injection}, @{action=api.threats.action.alert; action_text=Alert Only;} 
+0

@wOxxOm作出這樣的一個答案。添加一些關於發生了什麼的解釋。我猜'Where {...}'只是'%{if(...){$ _}}'的語法糖嗎? – Patrick87

+0

@wOxxOm我們變暖了!我不得不將它更改爲'$ results |選擇域,@ {N ='規則'; E = {($ _。security.waf.rules)}}' 這給了我一些東西: 'domain:domain.name.com rules:{@action=api.threats.action.block .....以及更多} 基本上,我仍然需要擴展該屬性,但是如果不擴展其他屬性並且域不可擴展,則無法擴展它。 – T4RH33L

+0

'$ result | %{$ domain = $ _。domain; $ _。security.waf.rules |選擇*,@ {N ='域'; E = {$ domain}}}' – wOxxOm

回答

0

以產生混合主要/嵌套級別的選擇:主陣列

  • 的嵌套東西select +計算屬性來引用迭代主陣列元件
    1. foreach

      $results | ForEach { 
          $r = $_ 
          $r.security.waf.rules | select *, @{N='domain'; E={$r.domain}} 
      } 
      

      或者作爲一個班輪:

      $results | %{ $r = $_; $r.security.waf.rules | select *, @{N='domain'; E={$r.domain}} } 
      
    0
    $myArray | where { $_.x.y.z -eq 'something' } 
    

    其在功能上等同於

    foreach ($object in $myArray) 
    { 
        if ($object.x.y.z -eq 'something') 
        { 
         $object # Writes $object to the output stream 
        } 
    } 
    
    0

    大多數這個答案的設置代碼,但當然可以。就像wOxxOm所說的那樣。

    $obj4 = New-Object -TypeName PsObject 
    $obj4 | Add-Member -MemberType NoteProperty -Name Foo -Value "Foo4" 
    
    $obj3 = New-Object -TypeName PsObject 
    $obj3 | Add-Member -MemberType NoteProperty -Name L3 -Value $obj4 
    $obj3 | Add-Member -MemberType NoteProperty -Name Foo -Value "Foo3" 
    
    $obj2 = New-Object -TypeName PsObject 
    $obj2 | Add-Member -MemberType NoteProperty -Name L2 -Value $obj3 
    $obj2 | Add-Member -MemberType NoteProperty -Name Foo -Value "Foo2" 
    
    $obj1 = New-Object -TypeName PsObject 
    $obj1 | Add-Member -MemberType NoteProperty -Name L1 -Value $obj2 
    $obj1 | Add-Member -MemberType NoteProperty -Name Foo -Value "Foo1" 
    

    這是您如何訪問對象圖中的屬性。

    $obj1.L1.L2.L3.Foo