В данной статье рассмотрим несколько способов определения размера файлов, а так же механизм автоопределения единиц измерения, для приведения к удобному для восприятия виду
Measure-Object
Measure-Object это аналог линуксовой утилиты wc.
Как понятно из названия командлета, Measure-Object используется для измерения:
- Количества байт, строк, слов, символов текстового объекта
- Количества указанных нами параметров объекта, с возможностью суммирования их значений(если указать параметр -Sum )
Выполним суммирование байт в параметре Length для пользовательского профиля:
$SizeDir = ( Get-ChildItem $env:USERPROFILE -Recurse | Measure-Object -Property Length -Sum ).Sum
Получение целочисленного значения
Для округления числа до целочисленного используется метод класса Math — Truncate
[Math]::Truncate( $SizeDir / 1GB )
Так же имеется альтернативный способ для округления чисел с помощью оператора AS:
($SizeDir / 1GB) -as [int]
Округление результата до нужного числа знаков после запятой
В отличии от метода Truncate, метод Round требует ввода второго атрибута, задающего количество знаков после запятой:
[Math]::Round( $SizeDir / 1GB, 2 )
Альтернативный метод форматирования
{0} — это обозначение группы в скобках. Т.к. группу нужно указывать в кавычках, то можно указать и дополнительное текстовое значение или переменную:
"{0} GB" -f ($SizeDir / 1GB)
Альтернативный способ сразу округлить до нужного количества знаков:
"{0:n2} GB" -f ($SizeDir / 1GB)
Функция для автоопределения единиц измерения
Function Format-FileSize() { Param ([int64]$size) If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)} ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)} ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)} ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)} ElseIf ($size -gt 0) {[string]::Format("{0:0.00} B", $size)} Else {""} } $file = Get-ChildItem $env:USERPROFILE -Recurse -File # Показать вес всех файлов в массиве Format-FileSize ($file | Measure-Object -Property Length -Sum).sum
Формируем вывод с помощью Expression
Вариант с .NET методом:
$file | sort Length -Descending | Select-Object Name, @{Name="MegaBytes";Expression={"{0:F2} MB" -f ($_.length/1MB)}}
Вариант с вышеприведенной функцией определения единиц:
$file | sort Length | Select-Object Name, @{Name="Weight";Expression={ Format-FileSize $_.length }}