2013-04-02 27 views
0

我一直在使用下面的一段代码来获取磁盘使用率开始在一个特定的目录:是否有更快速的方式从PowerShell中的特定目录开始使用磁盘?

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

的问题是,这需要很长的时间,只需右键单击Windows中的目录比较,看着物业。

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

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

回答

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 - 对象%循环来处理的大小,并有它已经计算出它的输出是什么。将文字打印到屏幕上总是会减慢速度,但至少你看到了进步。删除cls; "Total: $($total/1GB)GB"以提高效率。

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

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

0

我怀疑它可以做得更快。磁盘空间分析工具(如TreeSize)需要一段时间才能通过磁盘上的目录进行浏览。

+0

如果操作系统无法将其快速计算提供给PowerShell,那很奇怪。 – FrodoFraggins

+0

我不认为操作系统有更快的计算。对整个磁盘使用/释放总空间的单个值将随文件系统的更改而保持最新。但想象一下,如果操作系统试图在文件系统的每个级别上都保留这些信息:假设您将一个文件更改为5级目录 - 这需要5次计算。 ...现在推断出来的东西就像打开Visual Studio - 即使SSD无法处理! :) – northben

1

尝试的“老办法”:

$fso = New-Object -ComObject Scripting.FileSystemObject 
$fso.GetFolder($webRoot).Size 
相关问题