gpt4 book ai didi

powershell - 用于查找包含数百万个文件的文件夹的文件大小和文件数的 PowerShell 脚本?

转载 作者:行者123 更新时间:2023-12-03 11:47:38 25 4
gpt4 key购买 nike

该脚本的目的如下:

  • 打印在目录中递归找到的文件数
    (省略文件夹本身)
  • 打印目录的总和文件大小
  • 不会因为大量内存使用而导致计算机崩溃。

  • 到目前为止(3)是困难的部分。

    这是我迄今为止编写和测试的内容。这适用于包含一百甚至一千个文件的文件夹:
    $hostname=hostname
    $directory = "foo"
    $dteCurrentDate = Get-Date –f "yyyy/MM/dd"

    $FolderItems = Get-ChildItem $directory -recurse
    $Measurement = $FolderItems | Measure-Object -property length -sum
    $colitems = $FolderItems | measure-Object -property length -sum
    "$hostname;{0:N2}" -f ($colitems.sum / 1MB) + "MB;" + $Measurement.count + " files;" + "$dteCurrentDate"

    然而,在包含数百万个文件的文件夹中, $colitems变量从数百万个文件的信息收集中变得如此庞大,以至于使系统变得不稳定。有没有更有效的方法来绘制和存储这些信息?

    最佳答案

    如果您使用流式传输和流水线,您应该会减少 (3) 的问题,因为当您流式传输时,每个对象都会在可用时沿管道传递,并且不会占用太多内存,您应该能够处理数百万个文件(尽管这需要时间)。

    Get-ChildItem $directory -recurse | Measure-Object -property length -sum

    我不相信@Stej 的声明, Get-ChildItem probably reads all entries in the directory and then begins pushing them to the pipeline. , 是真的。流水线是 PowerShell 的一个基本概念(提供 cmdlet、脚本等支持它)。它既确保处理的对象在可用时以及仅在需要时才沿管道传递。 Get-ChildItem不会有不同的行为。

    Understanding the Windows PowerShell Pipeline 中给出了一个很好的例子。 .

    引用它:

    The Out-Host -Paging command is a useful pipeline element whenever you have lengthy output that you would like to display slowly. It is especially useful if the operation is very CPU-intensive. Because processing is transferred to the Out-Host cmdlet when it has a complete page ready to display, cmdlets that precede it in the pipeline halt operation until the next page of output is available. You can see this if you use the Windows Task Manager to monitor CPU and memory use by Windows PowerShell.

    Run the following command: Get-ChildItem C:\Windows -Recurse. Compare the CPU and memory usage to this command: Get-ChildItem
    C:\Windows -Recurse | Out-Host -Paging
    .



    使用 Get-ChildItem 的基准在 c:\ (大约179516个文件,不是百万,但足够好):

    运行后的内存使用 $a = gci c:\ -recurse (然后做 $a.count )是 527,332K .

    运行后的内存使用 gci c:\ -recurse | measure-object59,452K并且从未超过 80,000K .

    (内存 - 私有(private)工作集 - 来自 TaskManager,查看 powershell.exe 进程的内存。最初,它大约是 22,000K。)

    我还尝试了两百万个文件(我花了一些时间来创建它们!)

    类似实验:

    运行后的内存使用 $a = gci c:\ -recurse (然后做 $a.count )是 2,808,508K .

    运行时的内存使用 gci c:\ -recurse | measure-object308,060K并且从未超过 400,000K .完成后,它必须做一个 [GC]::Collect()让它返回到 22,000K水平。

    我仍然坚信 Get-ChildItem即使对于数百万个文件,流水线也可以为您带来巨大的内存改进。

    关于powershell - 用于查找包含数百万个文件的文件夹的文件大小和文件数的 PowerShell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080654/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com