Как узнать размер папки в Windows с помощью PowerShell

Почему PowerShell лучше, чем Проводник в некоторых случаях
PowerShell выполняет подсчёт программно и может масштабироваться на несколько машин. Он быстрее при автоматизации, фильтрации по маске или дате и удобен для массовых отчётов. Проводник хорош для одиночных проверок, но медлен при больших объёмах и не позволяет гибко фильтровать результаты.
Важно: для некоторых команд нужны права администратора, чтобы получить доступ к системным и скрытым файлам.
Основные команды и принципы
Определения в одну строку:
- Get-ChildItem (gci) — перечисляет файлы и папки в указанном каталоге.
- Measure-Object (measure) — суммирует выбранное числовое свойство (например, Length).
- Length — свойство, показывающее размер файла в байтах.
Базовый шаблон команды:
Get-ChildItem FolderPath | Measure-Object -Property Length -SumПример: если нужно посчитать размер папки E:\Download, выполните:
Get-ChildItem E:\Download | Measure-Object -Property Length -SumРезультат покажет количество элементов и суммарный размер в байтах. Чтобы получить удобочитаемые единицы, делите на 1024 (КБ), 1024² (МБ) или 1024³ (ГБ). В PowerShell есть сокращения 1KB, 1MB, 1GB и также 1Kb/1Mb/1Gb (учтите регистр и версию PowerShell). Пример вывода в гигабайтах:
(gci E:\Download | measure Length -s).Sum / 1GBЕсли вы хотите точную конвертацию в десятичных единицах (миллионы/миллиарды), делите на 1e6 или 1e9 соответственно.
Подсчёт с учётом подкаталогов и скрытых файлов
Чтобы учесть все уровни вложенности и скрытые файлы, добавьте параметры -Recurse и -Force. Также полезен параметр -ErrorAction SilentlyContinue, чтобы игнорировать ошибки доступа:
((gci -Force C:\Users -Recurse -ErrorAction SilentlyContinue | measure Length -s).Sum / 1GB)Пояснение: команда сначала собирает все файлы из C:\Users, затем измеряет сумму Length и делит на 1GB для удобного отображения.
Примечание: в больших каталогах рекурсивный сбор может занять время и потребовать много памяти. В таких случаях используйте фильтры по маске, по типу файлов или по срокам изменения.
Фильтрация по типу файлов и по шаблону
Чтобы посчитать только файлы с заданным расширением, используйте маску в Get-ChildItem:
(gci E:\Download *.jpg | measure Length -s).Sum / 1MBЭто покажет суммарный объём JPG-файлов в папке E:\Download. Для нескольких расширений применяйте несколько вызовов или фильтруйте через Where-Object.
Отдельный размер каждого подкаталога в таблице
Чтобы получить список подкаталогов с их размерами и отобразить в графическом виде, можно запустить скрипт в PowerShell ISE или PowerShell с окном Out-GridView:
$targetfolder = 'C:\'
$dataColl = Get-ChildItem -Force $targetfolder -Directory -ErrorAction SilentlyContinue | ForEach-Object {
$len = Get-ChildItem -Recurse -Force $_.FullName -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum | Select-Object -ExpandProperty Sum
$foldername = $_.FullName
$foldersize = '{0:N2} GB' -f ($len / 1GB)
[PSCustomObject]@{
foldername = $foldername
foldersizeGb = $foldersize
}
}
$dataColl | Out-GridView -Title "Size of Subdirectories in $targetfolder"Запустите скрипт в PowerShell ISE (Запуск — F5). Вы получите интерактивное окно с таблицей подкаталогов и их размером.

Быстрая функция для повторного использования
Ниже — компактная функция, которую можно положить в ваш profile.ps1 и вызывать из любой сессии PowerShell:
function Get-FolderSize {
param(
[Parameter(Mandatory=$true)][string]$Path,
[switch]$Recurse,
[string]$Unit = 'GB'
)
$gciParams = @{Path=$Path; ErrorAction='SilentlyContinue'}
if ($Recurse) { $gciParams.Add('Recurse',$true) }
$files = Get-ChildItem @gciParams -File -Force
$sum = ($files | Measure-Object -Property Length -Sum).Sum
switch ($Unit.ToUpper()) {
'KB' { $sum / 1KB }
'MB' { $sum / 1MB }
default { $sum / 1GB }
}
}
# Пример вызова:
Get-FolderSize -Path 'E:\Download' -Recurse -Unit GBЭта функция возвращает число в указанной единице и игнорирует ошибки доступа.
Чек-лист для разных ролей
Администратор:
- Запустить PowerShell от имени администратора.
- Использовать -Force и -ErrorAction SilentlyContinue.
- Для массовых отчётов применять Invoke-Command или PowerShell Remoting с экспортом в CSV.
- Проверять использование памяти при рекурсивных обходах.
Обычный пользователь:
- Запустить PowerShell без админа для своих папок.
- Использовать фильтры (.mp4, .pst и т.д.) чтобы быстро найти крупные файлы.
- При сомнениях сделайте резервную копию перед удалением.
Операционный аналитик:
- Собрать результаты в CSV: $dataColl | Export-Csv -Path sizes.csv -NoTypeInformation.
- Визуализировать в Excel или в графическом инструменте.
Сравнение подходов (когда PowerShell не лучший выбор)
Когда PowerShell хорош:
- Автоматизация сканирования множества компьютеров.
- Фильтрация по типам/датам, массовая обработка.
Когда лучше GUI-утилиты:
- Требуется визуализация дерева диска (treemap), быстрая интерактивная фильтрация.
- Пользователь предпочитает готовые отчёты и графики.
Популярные GUI-утилиты: WinDirStat, TreeSize, SpaceSniffer. Они дают визуальный обзор и удобны для одиночного ПК.
Диагностика и отладка
Если команда возвращает меньше ожидаемого:
- Убедитесь, что запускаете команду с достаточными правами.
- Проверьте, не игнорируются ли файлы системой (снимок, открытые файлы). Для VSS/бэкап-файлов может потребоваться особый доступ.
- Проверьте совпадает ли формат дат, если вы фильтруете по CreationTime или LastWriteTime.
Если команда долго выполняется:
- Фильтруйте по маске (например, *.mp4) и запускайте по частям.
- Используйте параллельную обработку (Start-Job, ForEach-Object -Parallel в PowerShell 7+) для больших каталогов.
Масс-сканирование на несколько хостов (мини-методология)
- Подготовьте список хостов в файле hosts.txt.
- Включите PowerShell Remoting на целевых машинах (Enable-PSRemoting) и настройте доверие/межсетевые правила.
- Запустите Invoke-Command с блоком скрипта, собирающего размеры, и сохраняйте результаты в CSV:
$hosts = Get-Content .\hosts.txt
Invoke-Command -ComputerName $hosts -ScriptBlock {
(gci C:\Users -Recurse -Force -ErrorAction SilentlyContinue | measure Length -s).Sum / 1GB
} | Export-Csv sizes-by-host.csv -NoTypeInformation- Анализируйте CSV в централизованном инструменте.
Справочник команд — Чит‑шит
- Сумма байт в текущей папке: (gci | measure Length -s).Sum
- В ГБ: (gci | measure Length -s).Sum / 1GB
- Только по маске (.pst): (gci -Recurse .pst | measure Length -s).Sum / 1GB
- Подкаталоги с размером (таблица): смотрите функцию Get-FolderSize или предыдущий пример с ForEach-Object.
Потенциальные подводные камни и когда это может не сработать
- Системные файлы и открытые файлы: доступ может быть ограничен, и вы увидите неполные данные.
- Сетевые диски: производительность зависит от сети; при плохом соединении сканирование займёт много времени.
- Версии PowerShell: синтаксис и сокращения единиц (1MB/1Mb) могут не совпадать между Windows PowerShell и PowerShell 7+. Тестируйте на целевой версии.
Диаграмма принятия решения
flowchart TD
A[Нужен быстрый подсчёт] --> B{Один ПК или много}
B -->|Один ПК| C[Использовать PowerShell локально]
B -->|Много ПК| D[Использовать PowerShell Remoting]
C --> E{Требуется графика}
E -->|Да| F[Использовать GUI-утилиту 'WinDirStat']
E -->|Нет| G[Get-ChildItem + Measure-Object]
D --> H{Нужна периодичность}
H -->|Да| I[Автоматизировать через task scheduler/CI]
H -->|Нет| J[Одноразовый скрипт Invoke-Command]Часто задаваемые вопросы
Как перевести байты в мегабайты и гигабайты?
Разделите байты на 1024 для КБ, на 1024^2 для МБ и на 1024^3 для ГБ. В PowerShell можно использовать 1KB, 1MB, 1GB: (Sum / 1GB).
Нужно ли запускать PowerShell от имени администратора?
Не обязательно для личных папок. Для системных директорий и доступа к другим пользователям обычно требуются повышенные права.
Можно ли автоматически удалять большие файлы после поиска?
Да, но делать это нужно осторожно. Сначала экспортируйте список в CSV, проверьте его, затем примените Remove-Item с явной проверкой.
Как учитывать только файлы, созданные в определённый период?
Фильтруйте через Where-Object по свойствам CreationTime или LastWriteTime. Пример:
(gci -Force E:\Download -Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt '06/01/2023' -and $_.CreationTime -lt '07/01/2023'} | measure Length -s).Sum / 1GBОбратите внимание на формат даты — он должен соответствовать локали системы.
Заключение
PowerShell — надёжный инструмент для подсчёта размеров папок, фильтрации по типам файлов и автоматизации отчётов. Для разовых визуальных проверок подойдут GUI-утилиты. Администраторам удобно масштабировать решение с помощью Remoting и экспорта в CSV. Храните полезные функции в profile.ps1 и используйте чек-листы выше для безопасной и быстрой работы.
Важно: перед удалением больших файлов всегда делайте резервную копию и проверяйте список файлов вручную.
Краткая выжимка
- PowerShell быстрее и гибче Проводника для автоматизации и массовых проверок.
- Используйте Get-ChildItem + Measure-Object; добавляйте -Recurse и -Force для полного охвата.
- Храните повторно используемые функции и экспортируйте результаты в CSV для анализа.
Часто используемые ресурсы и команды
- Enable-PSRemoting — включить удалённое выполнение команд.
- Invoke-Command — запуск команд на удалённых хостах.
- Export-Csv — сохранить результаты для дальнейшего анализа.





FAQ для администраторов
Q: Есть ли риск повлиять на систему при рекурсивном обходе больших каталогов? A: Риск минимален, если вы не изменяете файлы. Главное — следить за потреблением памяти и временем выполнения. При необходимости разбивайте задачу на части.
Q: Как быстро найти «тяжёлые» папки для очистки? A: Сканируйте верхний уровень диска, получите размеры подкаталогов и сортируйте по убыванию. Затем спускайтесь в самые крупные ветви.
Конец статьи.