И снова про бытовую магию 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 МБ.