Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance PowerShell脚本性能优化_Performance_Powershell - Fatal编程技术网

Performance PowerShell脚本性能优化

Performance PowerShell脚本性能优化,performance,powershell,Performance,Powershell,我正在运行一个PowerShell脚本,该脚本从csv文件中获取一些信息,将其存储在对象数组中,然后根据文件中的内容执行一些操作。它实际上只做一件事: 如果一列有一个广告组,它会为该组的每个成员复制该行 问题是我对脚本编写非常陌生,一开始文件很小,所以一切正常。现在我有巨大的文件,脚本需要几个小时才能执行 $file = "c:\Report.csv" $fileContent = Import-csv $file | select *, UserName foreach($item in

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

如果一列有一个广告组,它会为该组的每个成员复制该行

问题是我对脚本编写非常陌生,一开始文件很小,所以一切正常。现在我有巨大的文件,脚本需要几个小时才能执行

$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

我正在尝试使用“添加成员”,但出现以下错误:

添加成员:无法添加名为“URL”的成员,因为 具有该名称的已存在。如果您不想覆盖该成员 无论如何,请使用Force参数覆盖它。第1行字符:26
+$fileContent | Add Member我通过几件事将执行时间缩短了30倍

首先,我将数组切换到数组列表,以便使用array.Add()方法。然后,为了停止一直向广告发出请求,我用组名将信息保存在excel表格中,这样每个组只请求广告一次

以下是脚本:

$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 = "\\folder\username$\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" 

好吧,把数据分成几部分,并行处理我已经在做了,但是是的,我可以做更多的分割,但是会让人困惑。这是加快执行时间的唯一方法吗?谢谢你在干什么?至于其他的选择,看看这个,大多数时候它可能是在请求广告,你不能真正加快速度,除非你在我的电脑上并行处理数据。我明白了,我觉得我的循环槽不是很好。我还读到,当我做object+=item时,我会再次创建一个完整的对象,这需要很长时间,只是不知道如何用另一种方式来做不,我的意思是,你在哪里并行地做一些事情?
$fileContent+=$newRow
应该是
$fileContent1+=$newRow