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

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

Большинство пользователей Windows привыкли, что самый простой способ получить размер папки – открыть ее свойства в Проводнике Windows. Более опытные предпочитают использовать такие утилиты, как TreeSize или WinDirStat. Но, если вам нужно получить более детальную статистику по размеру папок в конкретном каталоге, или исключить определенные типы файлы, в этом случае лучше воспользоваться возможностями PowerShell. В этой статье мы покажем, как быстро получить размер определенного каталога на диске (или всех вложенных каталогов) с помощью PowerShell.

Для получения размеров файлов и каталогов в PowerShell можно воспользоваться командами Get-ChildItem (алиас gci) и Measure-Object (алиас measure). Первый командлет позволяет сформировать список файлов в заданном каталоге по указанным критериями, а второй выполняет арифметическое действие.

Например, чтобы получить размер папки c:PS, выполните команду:

Get-ChildItem c:iso | Measure-Object -Property Length -sum

как узнать размер каталога с помощью PowerShell

Как вы видите, общий размер файлов в данном каталоге указан в поле Sum и составляет около 2 Гб (размер указан в байтах).
Чтобы преобразовать размер в более удобные Мб или Гб, используйте такую команду:

(gci c:iso | measure Length -s).sum / 1Gb

Или:

(gci c:iso | measure Length -s).sum / 1Mb

Для округлений результата до двух символов после запятой, выполните команду:

"{0:N2} GB" -f ((gci c:iso | measure Length -s).sum / 1Gb)

получить размер фалой в каталоге

С помощью PowerShell вы можете посчитать суммарный размер всех файлов определенного типа в каталоге. К примеру, мы хотим получить суммарный размер всех ISO файлов в папке:

(gci c:iso *.iso | measure Length -s).sum / 1Mb

посчитать размер всех iso файлов на диске

Рассмотренные выше команды PowerShell позволяют получить общий размер файлов только в указанной директории. Если в папке содержаться вложенные каталоги, то размер файлов в этих каталогах не учитывается. Для получения общего размера всех файлов в каталоге с учетом вложенных директорий нужно использовать параметр –Recurse. Получим суммарный размер всех файлов в папке C:Windows (скрипт возвращает суммарный размер всех файлов без учета NTFS сжатия):

"{0:N2} GB" -f ((gci –force c:Windows –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)

Чтобы учитывать размер скрытых и системных файлов я дополнительно указал аргумент –force.

Итак, размер каталога C:Windows на нашем диске составляет около 40 Гб.

Совет. Чтобы не показывать ошибки доступа к каталогам используйте параметр
-ErrorAction SilentlyContinue
.

узнать размер папки windows с помощью 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)

размер каталога windows без учетка жестких ссылок в winsxs

Как вы видите, реальный размер папки Windows несколько меньше.

Вы можете использовать фильтры для выбора файлов, которые нужно учитывать при расчете размера. Например, вы можете посчитать размер файлов, созданных за 2020 год

(gci -force c:ps –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt ‘1/1/20’ -AND $_.CreationTime -lt ‘12/31/20’}| measure Length -s).sum / 1Gb

Можно получить размер всех вложенных папок первого уровня в указанном каталоге. Например, нам нужно получить размер всех профилей пользователей в папке C:Users.

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)
}

подсчитать размер профилей пользователей

% — это алиас для цикла foreach-object.

Идем дальше. Допустим ваша задача – узнать размер каждого каталога в корне системного жесткого диска и представить информацию в удобной для анализа табличной форме с возможностью сортировки по размеру каталогов.

Для получения информации о размере каталогов на диске C: выполните следующий PowerShell скрипт:

$targetfolder='C:'
$dataColl = @()
gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$foldername = $_.fullname
$foldersize= '{0:N2}' -f ($len / 1Gb)
$dataObject = New-Object PSObject
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldername” -value $foldername
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldersizeGb” -value $foldersize
$dataColl += $dataObject
}
$dataColl | Out-GridView -Title “Размер вложенных каталогов”

получить размер всех папок в корне диска C: с помощью powershell

Перед вами должна появиться графическая форма с таблицей, в которой указаны все папки в корне системного диска C: и их размер (таблица формируется командлетом Out-GridView). Щелкнув по заголовку столбца таблицы, вы можете отсортировать папки по размеру. Также вы можете выгрузить результаты в CSV (
|Export-Csv file.csv
) или Excel файл.

Если вы часто используете проверку размера каталогов в своих скриптах PowerShell, можно сделать отдельную функцию:

function Get-FolderSize {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
$Path
)
if ( (Test-Path $Path) -and (Get-Item $Path).PSIsContainer ) {
$Measure = Get-ChildItem $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
$Sum = '{0:N2}' -f ($Measure.Sum / 1Gb)
[PSCustomObject]@{
"Path" = $Path
"Size($Gb)" = $Sum
}
}
}

Для вызова функции просто выполните команду:

Get-FolderSize ('C:PS')

функция powershell Get-FolderSize

Такую функцию можно использовать для проверки размера каталогов на удаленных компьютерах через командлет Invoke-Command (PowerShell Remoting).

Invoke-Command -ComputerName dc01 -ScriptBlock ${Function:Get-FolderSize} –ArgumentList 'C:PS'

получить размер папки на удаленном компьютере с помощью powershell

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