Подтвердить что ты не робот

PowerShell Script получить общий каталог

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

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

4b9b3361

Ответ 1

Попробуйте выполнить

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

EDIT Почему это работает?

Позвольте сломать его компонентами конвейера. Команда gci -re $root будет рекурсивно возвращать все элементы из начального каталога $root и затем вставить их в конвейер. Поэтому каждый отдельный файл и каталог под $root будет проходить через второе выражение ?{ -not $_.PSIsContainer }. Каждому файлу/каталогу при передаче этого выражения можно получить доступ через переменную $_. Предыдущее? указывает, что это выражение фильтра, означающее сохранение только значений в конвейере, которые удовлетворяют этому условию. Метод PSIsContainer вернет true для каталогов. Таким образом, выражение фильтра сохраняет только значения файлов. Конечный объект измерения cmdlet будет суммировать значение свойства Length для всех значений, оставшихся в конвейере. Поэтому он по существу вызывает Fileinfo.Length для всех файлов в текущем каталоге (рекурсивно) и суммирует значения.

Ответ 2

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

Ответ 3

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

(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum

Ответ 4

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

# 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