С помощью PowerShell вы можете определить точный размер определенного каталога в Windows (с учетом всех вложенных директорий). Это позволит узнать размер каталог без использования сторонних утилит, таких как TreeSize или WinDirStat. Кроме того, PowerShell позволяет более гибко отфильтровать файлы по типам или размерам, которые нужно учитывать при расчете размера папки.
Для получения размеров файлов в каталогах используются следующие командлеты PowerShell:
- Get-ChildItem (алиас
gci
) — позволяет получить список файлов в директории (включая вложенные объекты). Ранее мы показывали как с помощью Get-ChildItem можно найти ТОП самых больших файлов на диске. - Measure-Object (алиас
measure
) – складывает размеры всех файлов для получения суммарного размера директории
Например, чтобы получить полный размер директории F:\ISO в Гб, выполните команду:
(Get-ChildItem F:\ISO -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb
Рассмотрим используемые параметры:
-
-Force
— учитывать скрытые и системные файлы -
-Recure
— получать список файлов во вложенных директориях -
-ErrorAction SilentlyContinue
– игонрировать объекты, к которым у текущего пользователя нет доступа -
-measure Length -sum
– сложить размеры всех файлов (свойство Length) -
.sum/ 1Gb
– вывести только суммарный размер в Гб
В данном примере размер директории около 37 Гб (без учета NTFS сжатия). Чтобы округлить результаты до двух символов после запятой, выполните команду:
"{0:N2} GB" -f ((Get-ChildItem F:\ISO -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
С помощью PowerShell можно получить суммарный размер всех файлов определенного типа в директории. Например, чтобы узнать сколько места занято ISO файлами, добавьте параметр
*.iso
:
"{0:N2} GB" -f ((Get-ChildItem F:\ISO *.iso -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
Можно использовать другие фильтры для выбора файлов, которые учитываются при расчете размера директории. Например, вы можете получить размер файлов, созданных за 2023 год
(gci -force f:\iso –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt ‘1/1/23’ -AND $_.CreationTime -lt ‘12/31/23’}| measure Length -sum).sum / 1Gb
Указанная выше PowerShell команда при подсчете размера файлов в каталоге будет выводить неверные данные, если в директории есть символические или жесткие ссылки. Например, в каталоге C:\Windows находится много жестких ссылок на файлы в хранилище компонентов WinSxS. В результате такие файлы могут быть посчитаны несколько раз. Чтобы не учитывать в результатах жесткие ссылки, используйте следующую команду (выполняется довольно долго):
"{0:N2} GB" -f ((gci –force C:\windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)
Вывести размер всех вложенных папок первого уровня в директории и количество файлов в каждой из них (в этом примере скрипт выведет размер всех профилей пользователей в C:\Users):
$targetfolder='C:\Users' $dataColl = @() gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % { $len = 0 gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length } $filesCount = (gci -recurse -force $_.fullname -File -ErrorAction SilentlyContinue | Measure-Object).Count $dataObject = New-Object PSObject -Property @{ Folder = $_.fullname SizeGb = ('{0:N3}' -f ($len / 1Gb)) -as [single] filesCount=$filesCount } $dataColl += $dataObject } $dataColl | Out-GridView -Title "Размер вложенных каталогов и количество файлов"
Скрипт выведет графическую таблицу Out-GridView со списком директорий, их размеров и количество файлов в каждой из них. Вы можете отсортировать каталоги в таблице по их размеру. Вы также можете выгрузить результаты в CSV (
|Export-Csv file.csv
) или Excel файл.
Думаю, что правильней и красивее было бы использовать для округления метод класса math.
[math]::Round(($len/1GB),2)
Хотя, конечно, вариант с ‘{0:N2}’ -f () широко распространен в скриптах Powershell.
Спасибо большое! Воспользовался вашим советом, очень помогли.
gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
}
Распишите пожалуйста подробно что тут происходит.
| ? { $_ -is [io.directoryinfo] } | % {$len = 0….
? — это алиас where-object
% — алиас ForEach-Object
? { $_ -is [io.directoryinfo] }
выбрать все объекты типа директория в указаннов каталоге% {
для каждого объекта рекурсивно посчитать размер каталога.$len = 0
— сбросить размер на 0 для следующей папкиБлагодарю.
Всегда бы так разжёвывали для новичков 🙂
Очень много статей и не в одной нет самой частой ЗАДАЧИ: вывести размер всех подпапок в считаемой папке , а не только первый уровень. Подскажите пожалуйста как это сделать ?
Поддерживаю, очень нужен данный функционал для ревизии и анализа файловой помойки!
Это всё не то, что нужно. Нужно просто чтобы когда ты открываешь Проводник сразу слева в поле «Размер» был виден размер папки.
Было бы классно если бы можно было в PowerShell сделать скрипт который сканирует корневой диск или указанную папку на объем созданных файлов за конкретный год.
Например: C:\Users\
узнать в сумме объем всех файлов в КБ или в ГБ созданных за 2020 год. Чтобы перебор был по дате. Не понимаю как это сделать.
Оставлю подсказку 🙂
gci c:\ps| ? {$_.CreationTime -gt ‘1/1/21’ -AND $_.CreationTime -lt ‘12/1/21’}
В свойствах папки 1 размер c:\user .
gci -recurse -force
может быть раз в 10 больше, так пока и не нашел как аналогично вычислять.
я так понимаю при таком подходе вычисляется размер по всем линкам, который из системных папок совершенно не нужен.
В этой статье явно чего-то не хватает.
Огромное спасибо!
Думаю текст
| ? { $_ -is [io.directoryinfo] }
Можно заменить на параметр
-Directory