2013-04-02 69 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 
相關問題