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