performance - 减少PowerShell脚本的运行时间

标签 performance powershell export-to-csv member active-directory-group

我正在运行一个脚本,该脚本首先获取所有组,然后获取这些收集的组的所有成员,然后将其放入.csv中。

我现在已经等了三个多小时,甚至还没到一半...

下面是脚本。

Get-QADGroup -SizeLimit 0 -properties * | 
Select samaccountname| 
Export-CSV D:\Test_PowerShell\group.csv -NoTypeInformation

Get-Content "D:\Test_PowerShell\group.csv" | 
foreach-object {$group = $_ -replace '"', ""# grab current group name get-qadgroupmember $group -sizelimit 0 -indirect | 
`select-object samaccountname,@{n="GroupName";e={$group}}} | 
export-csv D:\Test_PowerShell\groupandmem.csv -notypeinformation

最佳答案

试试这个:

( Get-QADGroup -SizeLimit 0 ) | 
foreach-object {                    
                 $group = $_.samaccountname
                 get-qadgroupmember $_.samaccountname -sizelimit 0 -indirect | 
                 select-object samaccountname, @{n="GroupName";e={$group}}
               }

如果您使用的是Powershell 3.0 / 4.0版,则可以尝试使用Powershell工作流程(我尚未对性能进行任何广泛的测试,但理论上至少可以使速度提高一倍):
workflow get-UserAndGroup 
{
   $a = inlinescript {   add-pssnapin Quest.ActiveRoles.ADManagement
                        Get-QADGroup -SizeLimit 0 | select -expa samaccountname
                    }                           

   foreach -parallel ( $group in $a ) 
   {                    
     inlinescript {
                    add-pssnapin Quest.ActiveRoles.ADManagement
                    Get-qadgroupmember $using:group -sizelimit 0 -indirect | 
                    select-object samaccountname, @{n="GroupName";e={$using:group}}
                  } 
    } 
}

像这样使用:
 get-UserAndGroup | select samaccountname, groupname | export-csv .\myfile.csv -notypeinformation

我的性能测试(包含30组,每组包含5至50个用户):
PS C:\ps> workflow get-UserAndGroup 
{
   $a = inlinescript {   add-pssnapin Quest.ActiveRoles.ADManagement
                        Get-QADGroup  -SizeLimit 0 | select -expa samaccountname
                    }



   foreach -parallel ( $group in $a ) 
   {                    
     inlinescript {
                    add-pssnapin Quest.ActiveRoles.ADManagement
                    Get-qadgroupmember $using:group -sizelimit 0 -indirect | 
                    select-object samaccountname, @{n="GroupName";e={$using:group}}
                  } 
    } 
}

PS C:\ps> Measure-Command { get-UserAndGroup }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 23
Milliseconds      : 512
Ticks             : 235120228
TotalDays         : 0,000272129893518519
TotalHours        : 0,00653111744444444
TotalMinutes      : 0,391867046666667
TotalSeconds      : 23,5120228
TotalMilliseconds : 23512,0228


PS C:\ps> measure-command {
( Get-QADGroup -SizeLimit 0 ) | 
foreach-object {                    
                 $group = $_.samaccountname
                 get-qadgroupmember $_.samaccountname -sizelimit 0 -indirect | 
                 select-object samaccountname, @{n="GroupName";e={$group}}
               }}


Days              : 0
Hours             : 0
Minutes           : 1
Seconds           : 7
Milliseconds      : 16
Ticks             : 670161451
TotalDays         : 0,000775649827546296
TotalHours        : 0,0186155958611111
TotalMinutes      : 1,11693575166667
TotalSeconds      : 67,0161451
TotalMilliseconds : 67016,1451

关于performance - 减少PowerShell脚本的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835982/

相关文章:

json - 使用 jq 将 json 转换为 csv,数组嵌套在数组中

performance - Canvas 多个文本绘制性能

optimization - 优化 PowerShell 模块导入

powershell - 使用 Powershell 和 TaskManager 在 Sharepoint 中设置多用户字段

arrays - Powershell解析帮助-中级排序

f# - 将元组序列写入 csv 文件 f#

python - 在 Python 中写入 CSV 之前存储基于列的数据的最佳实践

performance - 如何保持所需数量的 AWS Lambda 函数容器温暖

javascript - jQuery - 在处理 XML 时提高选择器性能

Mysql慢查询组与子查询连接