加速PowerShell输出

时间:2015-11-11 21:58:17

标签: powershell

我正在运行查询以从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和内存不受约束。

3 个答案:

答案 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