Заметки о Windows и других программных продуктах Microsoft...

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

Определяем размер директории с помощью 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″;
}

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

 

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

 
 
Комментарии

Появляется ошибка
measure : Не удается найти свойство «length» в каком-либо из объектов ввода.
строка:13 знак:51
+ … ize = Get-ChildItem $folder.FullName | measure -property length -sum;
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException
+ FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand