加速powershell输出

加速powershell输出,powershell,Powershell,我正在运行一个查询以从AD中提取数据。我有一个两行脚本来获取数据。第一行需要4到5分钟才能完成。它返回大约200000个用户。第二条线路大约需要20小时才能完成 $allEnabled = Get-adUser -f { (userAccountControl -eq 512) -and (Enabled -eq $true) } -properties employeeID, emailaddress, GivenName, SurName $allEnabled | ft emplo

我正在运行一个查询以从AD中提取数据。我有一个两行脚本来获取数据。第一行需要4到5分钟才能完成。它返回大约200000个用户。第二条线路大约需要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和内存就不会受到限制

不确定这里的收益,但您可以做一些简单的更改。。。也就是说,避免将结果保存在变量中,并且不对输出使用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-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

这实际上应该是一次将一个对象写入文件<代码>格式表我认为这是最大的问题

首先,每次使用|(管道)时,你都在放慢速度,但这可能不是速度慢的真正原因。当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()

首先,每次使用|(管道)时,你都在放慢自己的速度,但这可能不是缓慢的真正原因。当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()

Format表不会进行任何形式的结果格式化。它仅用于控制台输出。在您的案例中,您希望通过管道将数据直接输出到文件

我还建议您改用LDAP筛选器。对于我的系统来说,它的工作速度略快于-过滤器参数

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

Format表不会进行任何形式的结果格式化。它仅用于控制台输出。在您的案例中,您希望通过管道将数据直接输出到文件

我还建议您改用LDAP筛选器。对于我的系统来说,它的工作速度略快于-过滤器参数

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

首先,每次使用|(管道)时,你都在放慢自己的速度,但这可能不是缓慢的真正原因。当PowerShell cmdlet让您失望时,您最好直接使用.NET方法。@adilhindtan无论是否显式键入,您都在使用管道。管道可以简化许多动作。@Matt不是真的,但这也不是一个争论这一点的好地方。管道有它的用途,但当你有RAM并且需要速度时,通常应该避免使用。首先,每次使用|(管道)时,你都会减慢速度,但这可能不是缓慢的真正原因。当PowerShell cmdlet让您失望时,您最好直接使用.NET方法。@adilhindtan无论是否显式键入,您都在使用管道。管道可以简化许多动作。@Matt不是真的,但这也不是一个争论这一点的好地方。管道有它的用途,但是当你有RAM并且需要速度时,通常应该避免使用。对于1000个用户来说,这一个似乎比其他两个答案要快一些。我很想添加5万个假帐户,然后使用此方法重新运行整个过程,整个过程在3分钟内完成。比我所做的效率要高得多。@dft277 Streamwriter将轻而易举地击败大多数本机cmdlet(如果不是全部的话)。有1000个用户,这一个似乎比其他两个答案快一点。我很想添加5万个假帐户,然后使用此方法重新运行整个过程,整个过程在3分钟内完成。比我所做的效率要高得多。@dft277 Streamwriter将轻而易举地击败大多数本机cmdlet(如果不是全部的话)。使用此方法,整个过程在3分钟内完成。使用这种方法,整个过程在3分钟内完成。比我做的更有效率。