组合 PowerShell 命令



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

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

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

返回在说明属性中包含"字符串"的上述相同 OU 下的 OU。

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

我试图完成的是让脚本为我提供 OU 下在描述属性中有"字符串"的所有活动用户的计数。

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

$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

Sergio Tanaka的有用答案效果很好;让我用性能改进来补充它:

您可以通过在源进行筛选来大大加快命令速度,方法是将筛选条件作为-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),如果其他 PowerShell 数据提供程序支持-Filter参数,则可以获得相同的性能改进:

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

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

最新更新