在 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
}
}
我正在使用以下方法获取 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
}
}