Мне нужно получить размер каталога, рекурсивный. Я должен делать это каждый месяц, поэтому я хочу сделать PowerShell script, чтобы сделать это.
Как я могу это сделать?
Мне нужно получить размер каталога, рекурсивный. Я должен делать это каждый месяц, поэтому я хочу сделать PowerShell script, чтобы сделать это.
Как я могу это сделать?
Попробуйте выполнить
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 для всех файлов в текущем каталоге (рекурсивно) и суммирует значения.
Если вам интересно указать размер скрытых и системных файлов, вы должны использовать параметр -force с помощью Get-ChildItem.
Вот быстрый способ получить размер определенных расширений файлов:
(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum
Спасибо тем, кто разместил здесь. Я принял эти знания, чтобы создать это:
# 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