Итак, у меня есть каталог (D: \ Project \ Archive), содержащий множество файлов .txt с различными шаблонами имен файлов, за исключением последних 9 символов, перед расширением.
Я перечисляю вниз 6 имен файлов в качестве примера:
- 123456_HTQB_1412.txt
- abcd_GGTL_7642.txt
- 1a2b3_HTQB_1412.txt
- pikachu_JTYU_7177.txt
- hsbhsd_GGTL_7642.txt
- yt7777_HTQB_7642.txt
Эти файлы в произвольном порядке.
Что очевидно, так это то, что последние 9 символов имени файла перед расширением следуют шаблону из 4 символов, за которым следует подчеркивание, за которым следуют 4 цифры. Эти 9 символов будут одинаковыми для нескольких файлов.
Моя цель - архивировать файлы, имеющие одинаковые 9 символов, независимо от количества файлов. Имя zip-файла должно содержать 9 символов с шаблоном, а имена файлов должны быть без этих 9 символов. Приведенный выше пример должен создать 3 архивных файла:
- HTQB_1412.zip - содержит 123456_.txt, 1a2b3_.txt, yt7777_.txt.
- GGTL_7642.zip - содержит abcd_.txt, hsbhsd_.txt.
- JTYU_7177.zip - содержит pikachu_.txt.
Подход, который я выбрал для группировки, состоит в том, чтобы извлечь шаблон первого имени файла, переместить файл в каталог _toArchive, а затем перебрать остальные файлы для проверки того же шаблона. Если он совпадает, переместите его в каталог _toArchive и продолжайте, пока он не достигнет конца внутреннего цикла. Затем скрипт перейдет к _toArchive и заархивирует файлы. Затем элемент управления возвращается к первому циклу, чтобы повторить ту же операцию с остальными файлами.
Проблема, с которой я сталкиваюсь, связана главным образом с группировкой. Хотя логика работает нормально, но с включенным отложенным расширением переменные по-прежнему сохраняют значения даже после перемещения файлов в другой каталог. Это приводит к ненужным накладным расходам, приводящим к сообщениям об ошибках «Файл не найден», когда цикл пытается получить доступ к этим файлам. Есть ли способ сбросить переменные с помощью массивов? Или любой другой подход, который может быть проще, чем тот, который я использую?
Я просто публикую код для операций группировки, потому что, как только это выяснится, я смогу реализовать остальное.
set WORKDIR=D:\Project\Archive
setLocal enableDelayedExpansion
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
set firstFile=%%~ng
set firstPattern=!firstFile:~-9!
move /y %WORKDIR%\%%g %WORKDIR%\_toArchive
call :checkPatterns
)
:checkPatterns
for /f "tokens=*" %%i in ('dir /b %WORKDIR%\*.txt') do (
set fileToGroup=%%i
set groupedFile=%%~ni
set groupedPattern=!groupedFile:~-9!
call :groupPatterns
)
:groupPatterns
if "%groupedPattern%" == "%firstPattern%" (
move /y %WORKDIR%\%fileToGroup% %WORKDIR%\_toArchive
)