1

Мне нужен сценарий пакетного файла, чтобы переместить все файлы из одной родительской папки в столько подпапок, сколько необходимо, при условии, что каждая подпапка получает максимальное количество файлов, указанное в пакетном файле или в командной строке. Другими словами, сценарий должен распределять все файлы из родительской папки в несколько вложенных папок под ней (которые сценарий должен создавать автоматически), перемещая файлы в большое количество файлов X (где « X » - количество файлов, получаемых каждой подпапкой. ).

Дополнительные требования:

  1. Имена подпапок должны быть созданы в соответствии со следующей номенклатурой: 001, 002, 003 и так далее.

  2. Должны поддерживать файлы со всеми видами имен файлов (с пробелами, со специальными символами или неанглийским акцентуацией и т.д.)

  3. Должен поддерживать перемещение десятков тысяч файлов.

  4. Должен работать в 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

0