减少PowerShell脚本的运行时间

时间:2014-04-03 11:19:27

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

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

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

以下是剧本。

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

1 个答案:

答案 0 :(得分:0)

试试这个:

( 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

我的效果测试(包含5到50个用户的30个小组):

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