Скрипт PowerShell для получения общего размера каталога - PullRequest
17 голосов
/ 01 мая 2009

Мне нужно получить размер каталога, рекурсивно. Я должен делать это каждый месяц, поэтому я хочу создать PowerShell скрипт для этого.

Как я могу это сделать?

Ответы [ 4 ]

23 голосов
/ 01 мая 2009

Попробуйте следующее

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 для всех файлов в текущем каталоге (рекурсивно) и суммирует значения.

3 голосов
/ 14 мая 2012

Вот быстрый способ получить размер определенных расширений файлов:

(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum
3 голосов
/ 01 мая 2009

Если вас интересует включение размера скрытых и системных файлов, вам следует использовать параметр -force с Get-ChildItem.

1 голос
/ 28 ноября 2012

Спасибо тем, кто разместил здесь. Я принял знания, чтобы создать это:

# Loops through each directory recursively in the current directory and lists its size.
# Children nodes of parents are tabbed

function getSizeOfFolders($Parent, $TabIndex) {
    $Folders = (Get-ChildItem $Parent);     # Get the nodes in the current directory
    ForEach($Folder in $Folders)            # For each of the nodes found above
    {
        # If the node is a directory
        if ($folder.getType().name -eq "DirectoryInfo")
        {
            # Gets the size of the folder
            $FolderSize = Get-ChildItem "$Parent\$Folder" -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue;
            # The amount of tabbing at the start of a string
            $Tab = "    " * $TabIndex;
            # String to write to stdout
            $Tab + " " + $Folder.Name + "   " + ("{0:N2}" -f ($FolderSize.Sum / 1mb));
            # Check that this node doesn't have children (Call this function recursively)
            getSizeOfFolders $Folder.FullName ($TabIndex + 1);
        }
    }
}

# First call of the function (starts in the current directory)
getSizeOfFolders "." 0
...