【发布时间】:2015-09-21 20:13:07
【问题描述】:
PowerShell 新手,所以在实践中学习。
我创建的进程有效,但它最终会锁定我的机器直到它完成,占用所有内存。我想我已经通过强制垃圾收集器解决了这个问题,并且还从 for-each 语句转移到使用 %() 循环所有内容。
流程快速概要:需要将多个 SharePoint 日志文件合并为单个文件,以跟踪公司所有不同 SharePoint 网站的使用情况。 PowerShell 遍历 SP 服务器上的所有日志目录,并检查目录中的每个文件是否已存在于我的本地计算机上。如果它确实存在,它会附加文件文本,否则它会直接复制。对 SharePoint 日志服务器上的每个文件和目录重复冲洗。在每个循环之间,我强制执行 GC,因为......好吧,因为我的基本理解是循环变量保存在内存中,我想刷新它们。我可能看错了。所以这是有问题的脚本。
$FinFiles = 'F:\Monthly Logging\Logs'
dir -path '\\SP-Log-Server\Log-Directory' | ?{$_.PSISContainer} | %{
$CurrentDir = $_
dir $CurrentDir.FullName | ?(-not $_.PSISContainer} | %{
if($_.Extension -eq ".log"){
$DestinationFile = $FinFiles + '\' + $_.Name
if((Test-Path $DestinationFile) -eq $false){
New-Item -ItemType file -path $DestinationFile -Force
Copy-Item $_.FullName $DestinationFile
}
else{
$A = Get-Content $_.FullName ; Add-Content $DestinationFile $A
Write-Host "Log File"$_.FullName"merged."
}
[GC]::Collect()
}
[GC]::Collect()
}
已完成/附加的日志文件变得非常非常大(最小 300 MB,最大 1GB)。我不是在关闭我应该做的事情,还是在记忆中保持打开的状态? (目前它占我 8 Gig 内存总数的 7.5。)
提前致谢。
【问题讨论】:
-
您已经有 2 个很好的答案和有用的内容。在这里,我为您提供其他内容,只是对您的代码的评论。虽然真正的解决方案可能允许您删除对 [GC]::Collect() 的任何使用,但我很确定在您提供的代码中,您只需要第一次调用 [GC]::Collect(),在内循环。对 [GC]::Collect() 的外部调用(第二个)仅在第一个之后或没有文件被处理之后才被调用,因此它基本上什么都不做。
-
感谢您的来电。我有两个的原因是每个循环一个。我不知道它是否会从内存中清除每个循环项目。但是感谢@TheMadTechnician,我能够在没有垃圾收集器的情况下获得最终产品。
标签: powershell memory-management memory-leaks concatenation