有没有更快的方法从PowerShell中的特定目录开始获取磁盘使用?

时间:2013-04-02 13:42:49

标签: powershell disk diskusage

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

尝试“老路”:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

即使您右键单击并查看属性资源管理器仍需要计算大小,这就是我的网络驱动器上发生的情况。这需要一段时间,因为有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,并将其他命令作为答案给出,看看哪一个是最快的。