Мне нужен сценарий пакетного файла, чтобы переместить все файлы из одной родительской папки в столько подпапок, сколько необходимо, при условии, что каждая подпапка получает максимальное количество файлов, указанное в пакетном файле или в командной строке. Другими словами, сценарий должен распределять все файлы из родительской папки в несколько вложенных папок под ней (которые сценарий должен создавать автоматически), перемещая файлы в большое количество файлов X (где « X » - количество файлов, получаемых каждой подпапкой. ).
Дополнительные требования:
Имена подпапок должны быть созданы в соответствии со следующей номенклатурой: 001, 002, 003 и так далее.
Должны поддерживать файлы со всеми видами имен файлов (с пробелами, со специальными символами или неанглийским акцентуацией и т.д.)
Должен поддерживать перемещение десятков тысяч файлов.
Должен работать в Windows 10 Professional под правами локального администратора.
Например, допустим, что в папке «D:\Downloads» содержится 2400 файлов, и вы хотите распределить их в подпапках, содержащих до 1000 файлов в каждой. После запуска скрипта будет создана следующая структура:
D:\Downloads
|__001
|__002
|__003
Куда:
D:\Downloads --> Will have no files inside it anymore
|__001 --> Will have 1000 files inside it
|__002 --> Will have 1000 files inside it
|__003 --> Will have the last 400 files inside it
Порядок файлов (какой файл идет в какую подпапку) не важен, то есть при перемещении не нужно принимать во внимание какие-либо конкретные критерии (такие как имя файла, размер, тип файла и т.д.). Тем не менее, любые улучшения в этом аспекте будут приветствоваться (например, возможность сначала переместить последние созданные файлы в первые подпапки).
Есть идеи?
ОБНОВИТЬ
Вот решение, которое сработало для меня:
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
if not %3.==. goto syntax
if %2.==. goto syntax
:: Checks if %2 is a number:
SET "var="&for /f "delims=0123456789" %%i in ("%2") do set var=%%i
if defined var (goto syntax)
if /i %1.==. goto syntax
if /i not exist %1 echo. & echo The folder %1 does not exist... && echo Folder paths must be typed between "quotes" if there's any empty space. && echo. && goto end
setlocal enableextensions
setlocal enabledelayedexpansion
:: Maximum amount of files per subfolder:
SET limit=%2
:: Initial counter (everytime counter is 1, a new subfolder is created):
SET n=1
:: Subfolder counter:
SET nf=0
::Retrieves the amount of files in the specified folder:
set count=0
for %%A in (%1%\*.*) do set /a count+=1
echo.
echo Distributing %count% files in subfolders of up to %2 files...
FOR %%f IN (%1%\*.*) DO (
:: If counter is 1, create a new subfolder with name starting with "00...":
IF !n!==1 (
SET /A nf+=1
MD %1%\00!nf!
)
:: Move files into subfolders with names starting with "00...":
MOVE /-Y "%%f" %1%\00!nf! > NUL
:: Reset counter when a subfolder reaches the maximum file limit:
IF !n!==!limit! (
SET n=1
) ELSE (
SET /A n+=1
)
)
SET limit=
SET n=
SET nf=
SET count=
echo Move finished successfully.
goto end
:syntax
echo.
echo YOU TYPED: movedown %*
echo SYNTAX: movedown ["full path"] (between quotes if there's any space) [n] (maximum number of files per subfolder)
echo.
:end
ENDLOCAL