【问题标题】:PowerShell - How to count objects?PowerShell - 如何计算对象?
【发布时间】:2020-06-12 00:06:14
【问题描述】:

我正在使用 PowerShell 在 Active Directory 环境中构建一些脚本,目前正在努力寻找一种方法来计算对象。我的基本搜索是:

$DClist = (Get-ADForest).Domains | % { Get-ADDomainController –Filter * -Server $_ } | Select Site, Name, Domain

它会生成以下输出:

Site        Name      Domain      
----        ----      ------      
Site-A      DC-123    acme.local
Site-A      DC-ABC    acme.local
Site-B      DC-XYZ    domain.local
Site-C      DC-YPT    domain.local 

现在我想计算“名称”列中的对象数量并显示如下内容:

Site        Count_of_Name        
----        ----       
Site-A      2
Site-B      1
Site-C      1

我已经尝试了很多东西,到目前为止我最接近的是使用:

$DcList | Group-Object Site

但不幸的是,这不是正确的方法,因为它只计算“站点”的数量而“忽略”其余的。也试过这个,但它也没有像我预期的那样工作:

$DcList | Group-Object Site, Name

请帮我弄清楚这其中的逻辑。

********************** 更新 ************************

我终于能够做到这一点,但我想不出一种方法来计算“站点”列中的对象:

$DClist | Group-Object -Property Site | ForEach-Object -Process {
    [PSCustomObject]@{
      Site = $_.Name
      DCs = ($_.Group.Site)
    }
} 

请帮帮我。我觉得我现在非常接近解决方案。 :)

【问题讨论】:

  • 为什么group-object site 不起作用?仅当Name 为空白或在同一site 下重复时,它才会起作用
  • 使用$_.Group.Count$_.Group.Length
  • group-object site 计算“站点”的数量,我想要计算每个“站点”上的“名称”数量。现在关于$_.Group.Count,它确实很有魅力!感谢您帮助我解决这个问题!如您所见,在编写脚本方面,我完全是初学者。

标签: windows powershell object count active-directory


【解决方案1】:

你真的很亲密,答案就是你所期望的 :) 在进行分组时,您会自动获得一个计数属性。就用这个吧。

$DClist = (Get-ADForest).Domains | % { Get-ADDomainController –Filter * -Server $_ } | Select Site, Name, Domain
$dclist|Group-Object site|ForEach-Object{
    [PSCustomObject]@{
        site = $_.name
        DCs = $_.group
        count = $_.count
    }
}

编辑: 如果通过许多对象传播,您也可以这样做甚至更快。进行选择时,您可以为该查询添加自定义查询和标签。 @{name='fieldname';expression={$_.reference.to.object}}@{n='field';e={$_.expression}} 如果你想缩短它。

$dclist|Group-Object site|ForEach-Object{
    $_|select @{n='site';e={$_.name}},count,@{n='DCs';e={$_.group}}
}

【讨论】:

  • 这很有魅力!非常感谢您的帮助!
【解决方案2】:

我不完全明白你真正想要什么,但如果它是某种树,这会显示出来:

ForEach($Site in ($dclist | Group-Object site))
{
  $Site.Count.ToString() + " " + $Site.Name 
  
  ForEach($Server in $Site.Group)
  {
    "  + " + $Server.Name
  }
}

输出:

2 Site-A
  + DC-123
  + DC-ABC
1 Site-B
  + DC-XYZ
1 Site-C
  + DC-YPT

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多