Главная > Powershell > Подсчёт размера каталога с помощью Powershell

Подсчёт размера каталога с помощью Powershell

Даже такая мощная штука как Powershell умеет не всё. Например, по умолчанию он не умеет считать размер каталогов:

Но это не его вина. Дело в том, что у объектов типа “каталог” в отличии от объекта “файл” нет свойства Length, хранящего его размер. В этом можно убедиться посмотрев на свойства файла и свойства каталога, выполнив команду

Get-ChildItem | Where-Object {!$_.PSisContainer} | Get-Member

для файла и

Get-ChildItem | Where-Object {$_.PSisContainer} | Get-Member

для каталога.  (Свойство PSisContainer показывает является-ли объект контейнером, т.е. каталогом.)

Поэтому для того, чтобы подсчитать размер каталога нужно просуммировать свойство Length всех находящиеся в нём файлов, включая и вложенные подкаталоги. Также, как справедливо заметил Kazun нужно учитывать и скрытые файлы, которые по умолчанию не захватываются. Это делается при помощи параметра -Force командлета Get-ChildItem. Проще всего это сделать с помощью командлета Measure-Object:

Get-ChildItem C:\Test-recurse -Force | Measure-Object-Property Length -Sum

Эта команда подсчитает размер каталога C:\Test и покажет его в байтах:

Count : 130
Average :
Sum : 1831032
Maximum :
Minimum :
Property : Length

Для того, чтобы перевести в мегабайты (или гигабайты) нужно это значение разделить на суффикс 1Mb (1Gb):

(Get-ChildItem C:\Test -recurse -Force | Measure-Object-Property Length -Sum).Sum / 1Mb

1,74620819091797

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

$FolderSize =
(Get-ChildItem C:\Test -recurse -Force | Measure-Object -Property Length -Sum).Sum / 1Mb

[math]::round($FolderSize,2)

1,75

Таким нехитрым способом можно “научить” Powershell считать размеры каталогов.

Реклама
Рубрики:Powershell Метки:
  1. 14/05/2011 в 19:22

    Привет.

    Неплохо бы упомянуть про параметр -Force у командлета Get-ChildItem(для учета скрытых и системных файлов).

    • 14/05/2011 в 22:02

      Да, точно! Спасибо за напоминание! Поправил. Совершенно вылетело из головы. Сам на этом попался в своё время — не мог понять почему Powershell считал не так как система.

  2. Andrew
    22/04/2013 в 08:30

    А если файлов в каталоге нет, то такой код выдаст ошибку об отсутствии свойства length. Как с этим бороться?

    • 22/04/2013 в 10:11

      Ошибку об отсутствии свойства length выдаст в случае если в каталоге будет только пустой подкаталог, а если нет файлов, то выдаст 0. Бороться с этим можно, например, добавив проверку на наличие подкалатогов в каталоге с помощью того-же свойства PSisContainer: если у содержимого указанного каталога присутствует свойство PSisContainer ((Get-ChildItem c:\test -Recurse).PSisContainer = $true) ничего не делать, а если нету ((Get-ChildItem c:\test).PSisContainer = $false) — считать размер. Если в каталоге есть и файл, и каталог размер будет считаться.

      if ((Get-ChildItem c:\test -Recurse).PSisContainer)
      {
      «Внутри файлов нету»
      }
      else
      {
      «Внутри, возможно, есть файлы»
      $FolderSize = …
      }

  1. No trackbacks yet.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: