组合PowerShell命令

时间:2019-02-27 20:04:36

标签: powershell

我编写了两个脚本,这些脚本可以为我提供所需的独立输出,但是不确定如何将它们组合在一起以提供组合的输出。

返回特定OU中所有活动用户的数量

(Get-ADUser -searchbase "OU=OU, DC=domain, DC=com" -filter * |Where {$_.enabled -eq "True"}).count

返回与上面OU相同且在description属性中具有“字符串”的OU。

Get-ADOrganizationalUnit -searchbase "OU=OU, DC=domain, DC=com" -filter * -Properties description | where {$_.description -eq "string"}

我要完成的工作是让脚本为我提供在description属性中具有“字符串”的OU下所有活动用户的计数。

2 个答案:

答案 0 :(得分:1)

我认为这是实现目标的最简单方法

$OUs = Get-ADOrganizationalUnit -searchbase "OU=OU, DC=domain, DC=com" -filter * -Properties description | where {$_.description -eq "string"}
ForEach ($OU in $OUs) {
    $count = (Get-ADUser -searchbase $OU -filter * | Where {$_.enabled -eq "True"}).count
    Write-Host "OU $OU has $count users"
}

结果将是

OU OU=foo,DC=domain,DC=com has 6 users
OU OU=Computers,OU=foo,DC=domain,DC=com has 0 users
OU OU=Users,OU=foo,DC=domain,DC=com has 6 users
OU OU=Groups,OU=foo,DC=domain,DC=com has 0 users

答案 1 :(得分:1)

Sergio Tanaka's helpful answer运作良好;让我补充一下性能改进

通过在源中过滤 ,并通过将过滤条件作为 -Filter参数传递,可以极大地加快命令的执行速度而不是先检索所有对象,然后使用单独的Where-Object调用对其进行过滤:

Get-ADOrganizationalUnit -SearchBase 'OU=OU, DC=domain, DC=com' `
                        -Filter  'Description -eq "string"' -Properties description |   #`
  ForEach-Object {
    $count = (Get-ADUser -SearchBase $_ -Filter 'Enabled -eq $true').Count
  }

请注意,AD cmdlet的 -Filter字符串语法类似于 PowerShell代码,但是它在许多重要方面有所不同-请参见Get-Help about_ActiveDirectory_Filter


使用-Filter的一般优势:

总的来说,如果其他PowerShell数据提供程序的cmdlet支持Get-ChildItem参数,则它们的性能也可以得到提高,例如文件系统的cmdlet(例如-Filter)。 :

  • -Filter字符串应用于数据源,这意味着PowerShell仅接收过滤的结果

    • 由于提供程序是用编译代码实现的(并且可以访问较低级别的内部组件),因此通常可以提高性能;此外,在远程处理场景中,只需通过网络传输较少的数据即可提高性能。
  • 请注意,-Filter参数始终是具有提供商特定语法字符串,因此您必须查阅相关的provider / cmdlet文档。