Заметки о 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

Nonlok, добавьте в корень папки, какие-то файлы

Джонни

А обернуть всё это в командлет и сделать проверку на размер папок не суйба?

Никита

А как еще вывести количество файлов?

Никита

Function DirX($directory)
{
foreach ($file in Get-ChildItem $directory -Recurse -Directory )
{
[pscustomobject] @{
‘Directory’ = $File.FullName
‘Count’ = (GCI $File.FullName -Recurse).Count
}
}
}

#Вводим имя дериктории

$directory = Read-Host ″Enter pathfolder″;
DirX $directory

В коде ошибка $folder.FullName + ″ я заменил на $folder.FullName = ″ и так с $MainFolder +″

Михаил Гачленков

А что означает «-f»?
( ″{0:N2}″ -f $($FolderSize.Sum/1MB) +″MB″;)

Михаил Гачленков

Kirill, спасибо вам! А я неправильно искал , думал это алиас какой-то. Я новичок и редко пользуюсь. Оказывается очень удобный оператор форматирования.
Благодарю !

Михаил Гачленков

Подскажите пожалуйста. Можно ли в выводе результатов не показывать полный путь к папке. Вывести название папок и размер , без путей

Leave a Reply to Nonlok