2017-03-01 152 views
0

我正在运行PowerShell脚本,它从csv文件获取一些信息,将其存储在对象数组中,然后根据文件上的内容执行一些操作。它实际上只做一件事:PowerShell脚本性能优化

如果一列有一个AD组,它将为该组的每个成员复制该行。

事情是我在脚本编程方面真的很新,开始时文件很小,所以一切都很顺利。现在我有大量文件,脚本需要数小时才能执行。

$file = "c:\Report.csv" 
$fileContent = Import-csv $file | select *, UserName 

foreach($item in $fileContent) 
{ 
    $LoginName = $item.LoginName 
    $LoginNameClean = $LoginName.split("\") 
    $LoginNameClean = $LoginNameClean[1].trimstart("_") 
    $ObjectClass = (Get-ADObject -filter {SamAccountName -eq $LoginNameClean}).ObjectClass 
    $UserName = $null 

    if($ObjectClass -eq "user") 
    { 
     $UserName = Get-ADUser -identity $LoginNameClean -properties DisplayName 

     if($UserName) 
     { 
      $item.UserName = $UserName.DisplayName 
     } 
    } 

    elseif($ObjectClass -eq "group") 
    { 
     $GroupUsers = Get-ADGroupMember -identity $LoginNameClean -Recursive 

     foreach($user in $GroupUsers) 
     { 
      $UserInsideGroup = Get-ADUser -identity $user -properties DisplayName 
      $UserInsideGroupName = $UserInsideGroup.DisplayName 
      $newRow = New-Object PsObject -Property @{"URL" = $item.URL; "SiteListFolderItem" = $item.SiteListFolderItem; "TitleName" = $item.TitleName; "PermissionType" = $item.PermissionType; "LoginName" = $item.LoginName; "Permissions" = $Item.Permissions; "UserName" = $UserInsideGroup.DisplayName;} 
      $fileContent += $newRow 
     } 
    } 
} 


$fileContent | Export-Csv -NoTypeInformation -Path "c:\ReportUpgraded.csv" 

,关于如何提高这种性能的任何提示,非常感谢提前

感谢。

编辑:我使用PS 2.0

正如评论所说,我试图取代fileContent + = NEWROW。

我试图使用添加成员,但它给我这个错误:

Add-Member : Cannot add a member with the name "URL" because a member with that name already exists. If you wan t to overwrite the member anyway, use the Force parameter to overwrite it. At line:1 char:26 + $fileContent | Add-Member <<<< -MemberType NoteProperty -Name "URL"-Value "teste" + CategoryInfo : InvalidOperation: (@{SiteListFolde...me=; URL=teste}:PSObject) [Add-Member], Inv
alidOperationException + FullyQualifiedErrorId : MemberAlreadyExists,Microsoft.PowerShell.Commands.AddMemberCommand

我如何我用这个正常吗?添加成员不添加,但替换成员

+0

很好,在片分割数据和并行 – 4c74356b41

+0

我已经这样做处理它们,但没错,我可以做更多的分裂,但它会得到令人困惑。这是加快执行时间的唯一途径吗?谢谢 – ranbo

+0

你在哪里做?至于其他选项,看看这个,大多数时候它可能会对AD做出请求,但除非您并行处理数据,否则无法真正加速AD。 – 4c74356b41

回答

0

我设法减少30倍的执行时间与几件事情。

首先,我将数组切换到数组列表,以便我可以使用theArray.Add()方法。然后,为了不停地向AD发送请求,我将这些信息保存在带有组名称的Excel表中,以便每组只请求AD一次。

下面是脚本:

$file = "ReportBefore.csv" 
$fileContent = Import-csv $file | select *, UserName 
[System.Collections.ArrayList]$ArrayList = $fileContent 


foreach($item in $fileContent) 
{ 
    $LoginName = $item.LoginName 
    $LoginNameClean = $LoginName.split("\") 
    $LoginNameClean = $LoginNameClean[1].trimstart("_") 
    $ObjectClass = (Get-ADObject -filter {SamAccountName -eq $LoginNameClean}).ObjectClass 
    $UserName = $null 

    if($ObjectClass -eq "user") 
    { 
     $UserName = Get-ADUser -identity $LoginNameClean -properties DisplayName 

     if($UserName) 
      { 
      $item.UserName = $UserName.DisplayName 
      } 
    } 

    elseif($ObjectClass -eq "group") 
    { 
     $exportString = "\\csao11p20023a\rbonamet$\Desktop\ADGroups\" + $LoginNameClean + ".csv" 

     if([System.IO.File]::Exists($exportString)) 
     { 
      $GroupUsers = Import-csv $exportString | select *    
     } 
     else 
     { 
     $GroupUsers = Get-ADGroupMember -identity $LoginNameClean -Recursive | Select samAccountName,Name, @{Name="DisplayName";Expression={(Get-ADUser $_.distinguishedName -Properties Displayname).Displayname}} 
     $GroupUsers | Export-Csv -NoTypeInformation -Path $exportString 
     } 
     foreach($user in $GroupUsers) 
     { 

      $UserInsideGroupName = $user.DisplayName 
      $newRow = New-Object PsObject -Property @{"URL" = $item.URL; "SiteListFolderItem" = $item.SiteListFolderItem; "TitleName" = $item.TitleName; "PermissionType" = $item.PermissionType; "LoginName" = $item.LoginName; "Permissions" = $Item.Permissions; "UserName" = $UserInsideGroupName;} 
      #$filecontent += $newRow 
      $ArrayList.Add($newRow) 
     } 
    } 
} 
$ArrayList | Export-Csv -NoTypeInformation -Path "\ReportAfter.csv"