Определяем размер директории с помощью PowerShell

Определить размер директории в Windows достаточно просто. Однако, если требуется сделать это с помощью PowerShell, то с этим могут возникнуть некоторые трудности.

Для примера выведем свойства директории с помощью командлета Get-Item:

Get-Item C:\Files

Команда Get-Item возвращает основные свойства объекта, такие как его тип, имя, время последнего изменения и размер. Однако в случае с директорией размер (length) всегда остается пустым.


свойства папки в PowerShell

Это не ошибка, просто PowerShell не умеет напрямую определять размер директории. Однако он умеет определять размер отдельных файлов, поэтому мы можем вычислить размер директории, просуммировав все находящиеся в ней файлы. Для этого можно воспользоваться такой командой:

Get-Item C:\Files\* | measure -Property length -Sum;

либо такой (что одно и то же):

Get-ChildItem C:\Files | measure -Property length -Sum;

В поле Sum мы видим общий размер всех файлов в папке, что по идее и является ее размером.


вывод размер папки без форматирования

Для красоты переведем размер из байт в мегабайты и отформатируем вывод с помощью оператора форматирования (-f):

$FolderSize = Get-ChildItem C:\Files | measure -Property length -Sum;
″{0:N2}″ -f $($FolderSize.Sum/1MB) +″MB″;


вывод размер папки с форматированием

В итоге получаем размер директории 9.32MB. Для проверки откроем свойства папки в проводнике и сравним полученный результат с ее реальным размером. Как видите, данные  не совпадают, реальный размер директории составляет 120MB.


свойства папки в проводнике

Причина ошибки проста — мы посчитали только размер файлов, находящихся непосредственно в корне, но не учли поддиректории. Чтобы посчитать размер файлов во всех поддиректориях, необходимо запускать командлет Get-ChildItem с ключом -Recurse:

$FolderSize = Get-ChildItem C:\Files -Recurse | measure -Property length -Sum;
″{0:N2}″ -f $($FolderSize.Sum/1MB) +″MB″;

Вот теперь мы получаем правильный размер директории.


размер папки с учетом подпапок

Ну и если требуется вывести подробные данные по размеру директории и всех поддиректорий, то можно воспользоваться следующим скриптом:

#Вводим имя директории
$MainFolder = Read-Host ″Enter folder name″;

#Определяем общий размер директории
$MainFolderFullSize = (Get-ChildItem $MainFolder -Recurse | Measure-Object -property length -sum);
$MainFolder +″ (total)″ +″ — ″ + ″{0:N2}″ -f ($MainFolderFullSize.sum/1MB) + ″ MB″;

#Определяем размер файлов в корневой директории
$MainFolderFileSize = (Get-ChildItem $MainFolder | Measure-Object -property length -sum);
$MainFolder  +″ — ″ + ″{0:N2}″ -f ($MainFolderFileSize.sum/1MB) + ″ MB″;

#Определяем размер всех поддиректорий
$SubFolders = Get-ChildItem $MainFolder -Recurse | where {$_.PSIsContainer -eq $true} | Sort-Object;
foreach ($folder in $subfolders) {
$SubFolderSize = Get-ChildItem $folder.FullName | measure -Property length -Sum;
$folder.FullName + ″ — ″ +″{0:N2}″ -f ($SubFolderSize.Sum/1MB) +″MB″;
}


вывод данных по размерам всех папок и подпапок

Таким вот нехитрым 🙂 способом можно получить размер любой директории.

Отправить комментарий

0 Комментарии