Определить размер директории в Windows достаточно просто. Однако, если требуется сделать это с помощью PowerShell, то с этим могут возникнуть некоторые трудности.
Для примера выведем свойства директории с помощью командлета Get-Item:
Get-Item C:\Files
Команда Get-Item возвращает основные свойства объекта, такие как его тип, имя, время последнего изменения и размер. Однако в случае с директорией размер (length) всегда остается пустым.
Это не ошибка, просто 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 Комментарии