Powershell. Определить размер файлов

В данной статье рассмотрим несколько способов определения размера файлов, а так же механизм автоопределения единиц измерения, для приведения к удобному для восприятия виду

Measure-Object

Measure-Object это аналог линуксовой утилиты wc.
Как понятно из названия командлета, Measure-Object используется для измерения:

  • Количества байт, строк, слов, символов текстового объекта
  • Количества указанных нами параметров объекта, с возможностью суммирования их значений(если указать параметр -Sum )

Выполним суммирование байт в параметре Length для пользовательского профиля:

$SizeDir = ( Get-ChildItem $env:USERPROFILE -Recurse | Measure-Object -Property Length -Sum ).Sum
Считается только размер файлов, т.к. у папок параметр Length не имеет значений
Получение целочисленного значения

Для округления числа до целочисленного используется метод  класса Math — Truncate

[Math]::Truncate( $SizeDir / 1GB )

Так же имеется альтернативный способ для округления чисел с помощью оператора AS:

($SizeDir / 1GB) -as [int]
Оператор AS производит попытку преобразования объекта к желаемому типу
Округление результата до нужного числа знаков после запятой

В отличии от метода 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 }}
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 # Показать вес всех файлов в массиве

 

Добавить комментарий

Ваш адрес email не будет опубликован.