2015-11-25 42 views
0

我正在使用以下方式獲取AD站點和子網的列表,但當前它將每個站點的多個子網分組爲一行。我想爲每個子網使用SiteName和AD控制器。在Powershell中取消分組

$Sites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites 

$AllSites = @() 

foreach ($Site in $Sites) { 
    $obj = New-Object -Type PSObject -Property (
    @{ 
     "SiteName" = $site.Name; 
     "SubNets" = $site.Subnets; 
     "Servers" = $Site.Servers 
    } 
) 

    $AllSites += $obj  
} 

$AllSites | Out-GridView 

我知道如何使用Group-Object cmdlet,並天真地認爲有可能是一個非組cmdlet的,但我一直無法找到一個或有關在PowerShell中未分組的任何信息。

回答

1

展開分組對象的Group屬性取消分組:

... | Select-Object -Expand Group 

不過,我懷疑你不是真的要取消組合分組的對象,但展開您的服務器和子網列表,以字符串表示。假設他們是字符串數組你只需加入這些陣列是這樣的:

$AllSites = foreach ($Site in $Sites) { 
    New-Object -Type PSObject -Property @{ 
    'SiteName' = $Site.Name 
    'SubNets' = $Site.Subnets -join ',' 
    'Servers' = $Site.Servers -join ',' 
    } 
} 

爲了讓每個子網你一條線會循環在外部循環內部子網:

$AllSites = foreach ($Site in $Sites) { 
    $Site.Subnets | ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
     'SiteName' = $Site.Name 
     'SubNet' = $_ 
     'Servers' = $Site.Servers -join ',' 
    } 
    } 
} 
+0

第一個選擇「select-object -expand Group」正是我所需要的。非常感謝@Ansgar Wiechers – leinad13

0

您可以使用Select-Object-ExpandProperty來展開一個屬性;儘管如此,每個子網不會給你一行。爲此,您需要構建第二個for循環以遍歷每個子網並構建一個新對象:

foreach ($Site in $Sites) { 
    foreach($subnet in $Site.Subnets) { 
    $obj = New-Object -Type PSObject -Property @{    
     "SiteName" = $site.Name;    
     "SubNets" = $subnet;    
     "Servers" = $Site.Servers    
    }    
    $AllSites += $obj 
    } 
}