我正在运行查询以从AD中提取数据。我有一个2行脚本来获取数据。第一行需要4或5分钟才能完成。它返回大约200,000个用户。第二行大约需要20个小时才能完成。
$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 :(得分: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
我认为这是最大的问题。
答案 1 :(得分:1)
首先,每次使用| (管道),你正在减慢自己的速度,但这可能不是缓慢的真正原因。当PowerShell cmdlet让您失望时,最好的办法是直接使用.NET方法。例如,您可以尝试使用StreamWriter:
public class DataRegistry : Registry
{
public DataRegistry()
{
Scan(x =>
{
x.AssemblyContainingType<RepositoryBase>();
x.IncludeNamespaceContainingType<RepositoryBase>();
//Todo Register EndWith Repository as ImplementedInterface
});
}
}
答案 2 :(得分:0)
Format-Table will not do any form of result formatting. It is only used for console outputs. You want to pipe out data directly to file in your case.
Also I suggest you to use LDAP filter instead. For my system it works slighty faster than -Filter parameter.
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