【发布时间】:2019-10-10 08:19:15
【问题描述】:
我从事过一个小项目,该项目是从文件服务器中提取一些信息。为了执行该项目,我创建了一个脚本,将所有信息输出到 .csv 文件中。问题是 Powershell 在此过程中耗尽了我所有计算机的 RAM,因为有数百 Gb 的数据需要解析。
下面是我的脚本。
$folder = Get-ChildItem -Recurse 'Complete_Path' | select FullName, @{Name="Owner";Expression={(Get-Acl $_.FullName).Owner}}, CreationTime, LastWriteTime, LastAccessTime, PSIsContainer | sort FullName
$output = @()
$folder | foreach {
$type =
if ($_.PSIsContainer -eq "True") {
Write-Output "Folder"
}
else {
Write-Output "File"
}
$size =
if ($_.PSIsContainer -eq "True") {
Get-ChildItem -Recurse $_.FullName | measure -Property Length -Sum -ErrorAction SilentlyContinue | select -ExpandProperty Sum
}
else {
Get-Item $_.FullName | measure -Property Length -Sum -ErrorAction SilentlyContinue | select -ExpandProperty Sum
}
$hash = @{
FullName = $_.FullName
Owner = $_.Owner
CreationTime = $_.CreationTime
LastWriteTime = $_.LastWriteTime
LastAccessTime = $_.LastAccessTime
Type = $type
'Size in MB' = [math]::Round($($size/1Mb),2)
}
$output += New-Object PSObject -Property $hash
}
$output | select FullName, Owner, CreationTime, LastWriteTime, LastAccessTime, Type, 'Size in MB' | Export-Csv C:\myDOCS.csv -Delimiter ";" -NoTypeInformation -Encoding UTF8
你们知道我怎样才能更快地完成工作并减少内存消耗吗?提取可能需要几天时间。
提前谢谢你。
【问题讨论】:
-
[1] 在数组上使用
+=复制到一个新的、大一项的数组,添加新项,然后删除旧数组。这将要求您在进行添加时在 RAM 中有两个数组副本。所以......不要那样做。 [grin] 使用具有.Add()方法的集合类型,就像generic.list一样。 ///// 下一条评论中的下一条 ... -
[接上一条评论 ...] ///// [2] 为了节省 RAM,使用管道以便只有当前工作项在 RAM 中。这里的权衡是速度较慢,内存较少。 ///// [3] 如果这不适合您,您将导出行移动到循环中并立即导出每个项目,而不是将其全部保存在 RAM 中。这也会大大减慢速度,但总体上会使用更少的 RAM。
-
感谢您提供所有这些信息@Lee_Dailey。然而,我对这一切有点迷茫。我应该在哪里应用这些更改?
-
我看到其他人已经非常详细地回答了你,所以我只建议你使用他们的代码 - 希望你能回忆起我所说的 why . [咧嘴一笑]
标签: powershell csv scripting extract ram