Попробуйте следующее
function Get-DirectorySize() {
param ([string]$root = $(resolve-path .))
gci -re $root |
?{ -not $_.PSIsContainer } |
measure-object -sum -property Length
}
Это на самом деле создает немного итогового объекта, который будет включать в себя количество элементов. Вы можете просто получить свойство Sum, и это будет сумма длин
$sum = (Get-DirectorySize "Some\File\Path").Sum
РЕДАКТИРОВАТЬ Почему это работает?
Давайте разберем его по компонентам конвейера. Команда gci -re $root
рекурсивно получит все элементы из начального каталога $root
и затем отправит их в конвейер. Таким образом, каждый отдельный файл и каталог под $root
будет проходить через второе выражение ?{ -not $_.PSIsContainer }
. Каждый файл / каталог при передаче в это выражение может быть доступен через переменную $_
. Предыдущий? указывает, что это выражение фильтра, означающее сохранение в конвейере только тех значений, которые удовлетворяют этому условию. Метод PSIsContainer вернет true для каталогов. Таким образом, выражение фильтра сохраняет только значения файлов. Конечный объект-мера командлета будет суммировать значение свойства Length для всех значений, оставшихся в конвейере. По сути, он вызывает Fileinfo.Length для всех файлов в текущем каталоге (рекурсивно) и суммирует значения.