【问题标题】:Is there a faster way to get disk usage starting at a specific directory in powershell?是否有一种更快的方法可以从 powershell 中的特定目录开始使用磁盘?
【发布时间】:2013-03-23 20:12:39
【问题描述】:

我一直在使用以下代码来获取从特定目录开始的磁盘使用情况:

$usage = (Get-ChildItem $webRoot -recurse | Measure-Object -property length -sum)
$diskUsage = $usage.sum

问题在于,与简单地右键单击 Windows 中的目录并查看属性相比,这需要很长时间。

我们是否可以访问资源管理器用来获取磁盘使用情况的功能?或者有其他方法比我一直使用的方法更快吗?

我也不确定如果我的 PS 代码正在搜索的区域中有循环链接会发生什么。我认为它可能会被锁定。

【问题讨论】:

    标签: powershell disk disk-access


    【解决方案1】:

    试试“老办法”:

    $fso = New-Object -ComObject Scripting.FileSystemObject
    $fso.GetFolder($webRoot).Size
    

    【讨论】:

      【解决方案2】:

      即使您右键单击并查看属性资源管理器仍然需要计算大小,这就是我在网络驱动器上发生的情况。这需要一段时间,因为有 1,000,000 多个文件和 500,000 多个目录。

      使用您提供的命令首先获取所有文件和文件夹并将它们存储到内存中。只是做$files = gci $path -r 需要很长时间,因为文件太多。然后,您的命令将大内存块传递给Measure-Object。最后,Measure 进行计算。所以你等待了一段时间没有进展。

      PowerShell processes a ForEachObject cmdlet, it processes each value as it passes through the pipeline, so it uses less memory at any given time.

      您可以做的是使用 Foreach-Object % 循环来处理大小,并让它输出它已经计算的内容。将文本打印到屏幕上总是会减慢速度,但至少您看到了进步。删除cls; "Total: $($total/1GB)GB" 以提高效率。

      gci $path -file -r | % {$total += $_.length; cls; "Total: $($total/1GB)GB"}
      

      在您的命令上运行 Measure-Command 并作为答案给出其他命令,看看哪个是最快的。

      【讨论】:

        【解决方案3】:

        我怀疑它可以做得更快。磁盘空间分析工具(如TreeSize)需要一段时间来翻阅磁盘上的目录。

        【讨论】:

        • 如果操作系统不能将其快速计算提供给 powershell,这很奇怪。
        • 我不认为操作系统的计算速度更快。整个磁盘的可用/已用总空间的单个值会随着文件系统的更改而保持最新。但是想象一下,如果操作系统试图在文件系统的每个级别上密切关注该信息:假设您更改了 5 级深度目录中的单个文件——这将需要 5 次计算。 ...现在将其推断为打开 Visual Studio 之类的东西 - 即使 SSD 也无法处理! :)
        猜你喜欢
        • 2012-12-23
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多