在 Powershell 中取消分组

Un-grouping in Powershell

我正在使用以下方法获取 AD 站点和子网的列表,但它目前正在将每个站点的多个子网分组为一行。我想要每个子网的一行,以及 SiteName 和 AD Controller。

$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 中找到与取消分组相关的一个或任何信息。

展开 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 ','
    }
  }
}

您可以使用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
  }
}