Заметки · 03.07.2026

Всё по папкам поровну

И снова про бытовую магию powershell во всех красках. Сегодня тема вечера — распределение кучи файлов по папкам, чтобы размер каждой из папок не превышал установленного порога. За максимальный размер папки возьмём… Мегабайт двадцать.

Пишем достаточно простой скрипт с циклом:

# Путь к исходной папке
$sourceFolder = "C:\path"

# Максимальный размер в мегабайтах
$maxSizeMB = 20

# Переводим размер в байты
$maxSizeBytes = $maxSizeMB * 1MB

# Получаем все файлы в исходной папке
$files = Get-ChildItem -Path $sourceFolder -File
$folderIndex = 1
$currentSize = 0
$currentFolder = "$sourceFolder\$("{0:D2}" -f $folderIndex)"

# Создаём первую папку
New-Item -ItemType Directory -Path $currentFolder

foreach ($file in $files) {
    $fileSize = $file.Length
    
    # Проверяем, нужно ли создать новую папку
    if ($currentSize + $fileSize -gt $maxSizeBytes) {
        $folderIndex++
        $currentFolder = "$sourceFolder\$("{0:D2}" -f $folderIndex)"
        New-Item -ItemType Directory -Path $currentFolder
        $currentSize = 0
    }
    
    # Перемещаем файл в текущую папку и обновляем текущий размер
    Move-Item -Path $file.FullName -Destination $currentFolder
    $currentSize += $fileSize
}

Пара слов о коде. Сначала объявим переменную $sourceFolder, зададим ей в качестве значения путь к папке, где пылятся нужные файлы. Далее нужно задать значение переменной $maxSizeMB (в моём случае 20 МБ) и перевести его в байты.

Для получения списка всех файлов в папке-источнике используется командлет Get-ChildItem. После — задаётся индекс первой папки, объявляется переменная для отслеживания текущего размера файлов и формируется путь к подпапке, в которую будут складываться файлы. Подготовительная операция, кажется, завершена… Ах, да! Ещё нужно создать первую папку для файлов.

Ну, а теперь дело техники цикла. Для каждого файла из сформированного списка определяется его размер с помощью свойства Length. Затем проверяется, нужно ли создавать новую папку или можно обойтись той, что уже создана.

Самое интересное здесь — это условие. Если сумма текущего размера и размера нового файла превышает заданный предел (переменная $maxSizeBytes), создаётся новая папка. Индекс папки увеличивается на единицу. Размер, соответственно, сбрасывается.

Таким образом, в результате выполнения этого простого скрипта все файлы из исходной папки будут распределены по новосозданным папкам так, что ни одна папка не будет превышать указанные 20 МБ.