2015-11-11 66 views
1

我正在运行查询以从AD中提取数据。我有一个2行脚本来获取数据。第一行需要4或5分钟才能完成。它返回大约20万用户。第二行大约需要20个小时才能完成。加速powershell输出

$allEnabled = Get-adUser -f { (userAccountControl -eq 512) -and (Enabled -eq $true) } -properties employeeID, emailaddress, GivenName, SurName 
$allEnabled | ft employeeID, emailaddress, GivenName, SurName | out-file d:\temp\output.txt 

我试着写在同一时间输出一行,我尝试了数组中的馅,但我不能找到一种方法,任何快速写入数据。我已经从充足资源的强大服务器运行它,所以CPU和内存不受限制。

+0

首先,每次使用| (管道),你正在放慢速度,但这可能不是缓慢的真正原因。当PowerShell cmdlet让你失望时,最好的选择是直接使用.NET方法。 –

+1

@AdilHindistan无论你是否明确地输入它,你都使用管道。管道可以简化许多操作。 – Matt

+1

@Matt不是真的,但这不是一个很好的论点。管道有其用途,但一般应避免当你有RAM和需要速度。 –

回答

3

不确定增益在这里,但你可以做一些简单的改变......即避免将结果保存在变量中,而不是使用Format-cmdlet输出(这不是控制台!)。在后者的情况下,我认为它需要枚举整个对象,以便知道如何在控制台上显示它。

由于您使用的是对象,因此您最好利用该对象并使用Export-CSV进行输出。

Get-adUser -f { (userAccountControl -eq 512) -and (Enabled -eq $true) } -properties employeeID, emailaddress, GivenName, SurName | 
    Select employeeID, emailaddress, GivenName, SurName | 
    Export-CSV -NoTypeInformation d:\temp\output.txt 

这应该有效地写入一个对象在一次文件。 Format-Table我认为这是最大的问题。

+0

使用此方法,整个过程在3分钟内完成。我所做的更有效率。 – dft277

1

首先,每次使用| (管道),你正在放慢速度,但这可能不是缓慢的真正原因。当PowerShell cmdlet让你失望时,最好的选择是直接使用.NET方法。您可以尝试使用StreamWriter:

$sw = [System.IO.StreamWriter] "d:\temp\output.txt" 
$allEnabled = Get-adUser -f { (userAccountControl -eq 512) -and (Enabled -eq $true) } -properties employeeID, emailaddress, GivenName, SurName 
$allEnabled | % { $sw.WriteLine("$($_.employeeID), $($_.emailaddress), $($_.GivenName), $($_.SurName)") } 
$sw.close() 
+0

1000个用户看起来比其他2个答案快一点。我很想添加5万个假帐户并重新运行^ _^ – sodawillow

+0

使用这种方法,整个过程在3分钟内完成。我所做的更有效率。 – dft277

+0

@ dft277 Streamwriter将击败大多数本地cmdlet(如果不是全部的话)。 – Matt

0

Format-Table不会执行任何格式的结果格式。它仅用于控制台输出。你想在你的案例中直接输出数据到文件。

另外我建议你使用LDAP过滤器来代替。对于我的系统,它的运行速度比-Filter参数略快。

Get-ADUser -LDAPFilter "(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(userAccountControl=512))" -properties employeeID, emailaddress, GivenName, SurName | Export-Csv -Path c:\adusers.csv -NoTypeInformation