2017-03-01 104 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"