0

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

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

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

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

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

4

3 回答 3

1

尝试“旧方式”:

$fso = New-Object -ComObject Scripting.FileSystemObject
$fso.GetFolder($webRoot).Size
于 2013-04-02T14:01:05.193 回答
0

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

于 2013-04-02T13:49:07.850 回答
0

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

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

PowerShell 处理 ForEachObject cmdlet,它在每个值通过管道时对其进行处理,因此它在任何给定时间使用的内存都更少。

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

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

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

于 2013-04-02T15:59:59.647 回答