2013-04-02 3 views
0

Я использую следующий фрагмент кода, чтобы получить использование диска, начиная с определенного каталога:Есть ли более быстрый способ получить использование диска, начиная с определенного каталога в powershell?

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

Проблема заключается в том, что это занимает очень много времени по сравнению с просто щелкнув правой кнопкой мыши папку в окнах и глядя на свойства.

Есть ли у нас доступ к функциям, которые использует исследователь для использования диска? Или есть другой способ, который будет быстрее, чем метод, который я использовал?

Я также не уверен, что произойдет, если есть круговые ссылки в области, которую выполняет мой 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-Object % цикл для обработки размера, и он выходной, что он уже вычислил. Печать текста на экран всегда замедляет работу, но по крайней мере вы видите прогресс. Для большей эффективности снимите 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