
Как перемещать файлы в папку, пока она не достигнет определенного размера в Windows?
решение1
Пакетный скрипт
Вот скрипт, который делает именно это. У него четыре параметра, последний из которых необязательный: исходная папка; папка назначения; целевой размер в байтах; расширения файлов, которые должны совпадать. Все параметры, кроме размера, требуют кавычек.
@echo off
setlocal
setlocal enabledelayedexpansion
if "%~3" == "" exit /b 3
if "%~2" == "" exit /b 2
pushd "%~1" 2>nul || exit /b 4
pushd "%~2" 2>nul && popd || exit /b 5
set target=%~3
set /a target=%target:~0,-3% 2>nul || exit /b 6
set /a min=%target% / 1000
for /r "%~2" %%G in (*) do (
set size=%%~zG
set /a size=!size:~0,-3! 2>nul
if !errorlevel! equ 0 (
if !size! gtr !target! exit /b 7
set /a target -= !size!
))
if %target% leq %min% goto :end
set exts=* & if not "%~4" == "" set exts=%~4
for /f "delims=" %%G in ('dir %exts% /a:-d-h-s /b /o:-s 2^>nul') do (
if !target! leq %min% goto :end
set size=%%~zG
set /a size=!size:~0,-3! 2>nul
if !errorlevel! equ 0 if !size! leq !target! (
echo n 2>nul|move /-y "%%~fG" "%~2" >nul 2>&1 && set /a target -= !size!
))
:end
popd
endlocal & exit /b 0
Как это работает
Первые строки гарантируют, что количество параметров верно. Каждый параметр проверяется, чтобы отклонить несуществующие папки и/или неверные значения размера. Чтобы избежать переполнения целых чисел, последние 3 цифры целевого размера усекаются. Пороговое значение устанавливается равным 1/1000 от целевого значения, чтобы обеспечить некоторую толерантность.
Для учета существующих файлов содержимое папки назначения сканируется и вычисляется ее общий размер. Полученное значение вычитается из целевого размера.
В этот момент начинается фактическая работа: содержимое исходной папки перечисляется и сортируется по размеру файла, от самого большого к самому маленькому. Файлы перемещаются только тогда, когда их размер меньше или равен текущему целевому, который затем обновляется. Этожадный поискпродолжайте до тех пор, пока не останется больше файлов или не будет достигнут минимальный порог, в зависимости от того, что наступит раньше.
Замечания
Интерпретатор команд использует 32-битную версию.целые числа со знакомдля выполнения арифметических операций, поэтому наибольшее положительное значение равно
2^31 - 1 = 2147483647
.Целевой размер может быть любым значением (в байтах) от 1 КБ до 2 ТБ.
Файлы с установленным атрибутом «Скрытый» или «Системный» игнорируются.
Если исходная папка содержит один или несколько файлов, которые уже присутствуют в папке назначения, операция перемещения будет пропущена во избежание возможной потери данных.
Из соображений производительности скрипт использовал кэшированное значение вместо перечисления файлов на каждом шаге для определения размера папки назначения. Файлы, которые пропускаются из-за того, что у них одинаковое имя, все равно будут добавляться в общую сумму, и полученный размер может быть искажен.
Подпапки не обрабатываются. Если нужно, добавьте
/s
параметр вdir
команду. Поскольку исходная структура становится плоской, вы можете получить файлы с идентичными именами, которые не будут перемещены в место назначения.
дальнейшее чтение
решение2
С помощью Powershell.
Делать (перемещение файлов из одной папки в другую) пока (размер папки не тот, который нужен)
Использоватьэта демонстрация того, как использовать цикл do whileи измените сценарий echo с помощью приведенных выше сценариев в соответствии со своими потребностями.