【问题标题】:Get-ChildItem high memory usageGet-ChildItem 高内存使用
【发布时间】:2019-11-13 09:41:44
【问题描述】:

我想扫描一些包含数百万个文件的大型目录,以递归方式使用 2 级目录名称、大小和每个文件中的文件数进行摘要。我让代码运行了几个小时,但由于 PowerShell 消耗 13GB 内存,它卡在了中间的某个地方。知道为什么内存使用率如此之高吗?

$mailboxes = Get-ChildItem E:\data -Directory |
             Get-ChildItem -Directory |
             Select -ExpandProperty FullName

foreach ($line in $mailboxes) {
    $s = $line.split("\\")
    $files = Get-ChildItem $line -File -Recurse -Include *.eml
    $mailbox_path = $line
    $mailbox = $s[-1]
    $size = $files | Measure-Object Length -Sum | select -ExpandProperty Sum
    $count = $files.Count
    "$mailbox_path`t$mailbox`t$size`t$count" |
        Out-File 'D:\scripts\summary.txt' -Append
}

【问题讨论】:

  • 内存使用量是随着脚本的运行而逐渐增加,还是只是在中间才上升?
  • -Include *.eml 替换为-Filter *.eml 和/或仅收集变量$files ($files = Get-ChildItem ... | Select-Object -Expand Length) 中的文件大小是否有帮助?

标签: powershell memory get-childitem


【解决方案1】:

看看会不会好一点

$mailboxes = Get-ChildItem E:\data -Directory | Get-ChildItem -Directory
$OutputPath = 'D:\scripts\summary.csv'

foreach($line in $mailboxes) {

$files = Get-ChildItem $line.FullName -File -Recurse -Filter *.eml
$size = $files | Measure-Object Length -Sum | select -ExpandProperty Sum


[pscustomobject]@{MailBoxPath = $line.FullName;MailBox = $line.BaseName;FileSize = $size;FileCount = $files.count} | Export-Csv -Path $OutputPath -NoTypeInformation -Append
}

【讨论】:

  • 正确使用 PowerShell 管道还应该最大限度地减少内存消耗。要正确使用 PowerShell 管道,您应该避免变量赋值(如 $mailboxes =)和括号,尤其是对于均值流。因此:Get-ChildItem E:\data -Directory | Get-ChildItem -Directory | ForEach-Object {Get-ChildItem $line.FullName -File -Recurse -Filter *.eml ... } | Export-Csv -Path $OutputPath -NoTypeInformation -Append
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2011-02-22
相关资源
最近更新 更多