@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
SET "oldc1=*"
SET "oldsd=*"
SET "dircnt=4"
FOR /f "delims=" %%a IN (
'dir /b /a-d /on "%sourcedir%\*.zip" '
) DO (
SET "c1=%%a"
SET "c1=!c1:~0,1!"
IF /i "!c1!" neq "!oldc1!" (
REM we changed initial character
SET "oldc1=!c1!"
SET "destsd=!c1!"
FOR %%b IN (0 1 2 3 4 5 6 7 8 9) DO IF "%%b"=="!c1!" SET "destsd=0"
IF /i "!oldsd!" neq "!destsd!" (
SET /a fcount=dircnt-1
SET /a olddestsd2=9
SET "oldsd=!destsd!"
)
)
SET /a fcount +=1
SET /a destsd2=fcount / dircnt
IF !destsd2! neq !olddestsd2! (
SET /a olddestsd2=destsd2
ECHO MD "%destdir%\!destsd!!destsd2!" 2>nul
)
ECHO MOVE "%sourcedir%\%%a" "%destdir%\!destsd!!destsd2!\"
)
GOTO :EOF
Вам потребуется изменить настройку sourcedir
в соответствии с вашими обстоятельствами.
Вам потребуется изменить настройки sourcedir
и destdir
в соответствии с вашими обстоятельствами.
Требуемые MD-команды просто ECHO
отредактированы для целей тестирования. После того как вы убедились, что команды верны , измените ECHO MD
на MD
, чтобы фактически создать каталоги.
Необходимые команды MOVE просто ECHO
ed для целей тестирования, После того как вы убедились, что команды верны , измените ECHO MOVE
на MOVE
, чтобы фактически переместить файлы.Добавьте >nul
для подавления сообщений отчета (например, 1 file moved
)
Вырежьте и вставьте сообщение в файл .BAT.Не пытайтесь переформатировать по эстетическим причинам - пакет может быть очень чувствителен к макету.
Для тестирования я установил значение dircnt
в 4. Для вашего приложения требуется 1000.
Я быПредлагаем вам использовать несколько фиктивных каталогов для тестирования.
Эта подпрограмма использует delayed expansion
, где %var%
представляет значение переменной, когда code block
(группа операторов в скобках) анализируется, а !var!
значение какэто может измениться в цикле.
Первая проблема заключается в создании списка каталогов в памяти. Этот список отсортирован в алфавитном порядке (/on
) и в основном формате (/b
) [только имена] без имен каталогов (/a-d
).Каждая строка строк затем читается командой for
и присваивается %%a
.
c1
используется для хранения первого символа имени файла, который сравнивается с oldc1
- предыдущимзначение, чтобы имя каталога назначения пересчитывалось только при изменении первого символа имени файла.
Если первый символ имени файла числовой, тогда подкаталог назначения будет 0?
, в противном случае это первый символимя файла теперь в c1
.Мы инициализируем количество файлов в этом каталоге максимально - 1, а второй символ подкаталога - 9
.
Это установило новое назначение , если назначение изменилось.
Затем мы увеличиваем количество перемещаемых файлов и вычисляем второй символ места назначения, просто разделив число файлов на файлы на каталог.Так как пакет выполняет целочисленную математику, результатом является int (общее количество файлов с этим первым символом / файлов на каталог), поэтому он начинается с 1
.
Затем мы определяем, изменился ли каталог назначения, и создаемновый каталог, если требуется.
Затем переместите файл.