Всем привет!
Задача такая. Есть архивы в которых имена папок и файлов содержат определенные ключевые слова, например:
[KEYWORD] Папка №1
--[KEYWORD] Подпапка №1
--[KEYWORD] Подпапка №2
[KEYWORD] Папка №2
[KEYWORD] Файл №1.txt
[KEYWORD] Файл №2.txt
Файл №3.txt
Файл на удаление.docx
Нужно во всех папках и файлах найти
[KEYWORD] и удалить, а также добавить в конце имени новый ключ
[DOMAIN.RU]. Кроме этого, нужно удалить из архива определенные файлы из списка, прописаного в txt.
Пример результата:
Папка №1 [DOMAIN.RU]
--Подпапка №1 [DOMAIN.RU]
--Подпапка №2 [DOMAIN.RU]
Папка №2 [DOMAIN.RU]
Файл №1 [DOMAIN.RU].txt
Файл №2 [DOMAIN.RU].txt
Файл №3.txt
Почитав мануалы и поискав инфу в интернете, я смог набросать вот такой скрипт:
spoilerchcp 1251
@ECHO ON
:: Удаляемое ключевое слово
SET SearchKeyword=[SITE]
:: Добавляемое ключевое слово
SET ReplaceKeyword=[NEWSITE.RU]
:: Рабочая папка
SET SaveDir=RESULT
:: Папка с файлами
SET FilesDir=FILES
:: Список ключей для замены
SET ListNames=LIST_NAMES.txt
:: Списком удаляемых файлов
SET ListFiles=LIST_FILES.txt
:: Допустимые типы архивов
SET Mask="*.zip" "*.rar"
:: Путь к архиватору
SET Archiver="C:\Program Files\WinRAR\WinRAR.exe"
:: Определение пути
SET WorkPath=%CD%
:: Удаление папки
RD /S /Q "%WorkPath%\%SaveDir%\"
:: Создание папки
MD %SaveDir%
FOR %%f IN (%Mask%) DO (
:: Распаковка архива
%Archiver% X "%%f" "%SaveDir%\"
:: Удаление исключенных файлов
Call :deleteFiles "%WorkPath%\%FilesDir%\%ListFiles%"
:: Переименовывание файлов
Call :funcRename "%WorkPath%\%SaveDir%\*%SearchKeyword%*" %SearchKeyword%
:: Добавление файлов в архив
%Archiver% A -M5 -Y -EP1 -R "%WorkPath%\%SaveDir%\%%~nf %ReplaceKeyword%.zip" "%WorkPath%\%SaveDir%\"
)
pause
Exit
::Переименовывание файлов
:funcRename
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /S /B /A:D ^|Sort /R`) DO (
Set "N=%%~nd" &Call Ren "%%d" "%%N:%SearchKeyword%=%%%%~xd %ReplaceKeyword%"
)
Exit /B
::Удаление файлов
:deleteFiles
FOR /F "usebackq delims=" %%a IN (%WorkPath%\%FilesDir%\%ListFiles%) DO (
DEL /F /Q "%WorkPath%\%SaveDir%\%%a"
)
Возможно получился говно-код, но это в силу моего "никакого" опыта в работе с BAT. В целом кстати скрипт работает, но криво. Закидываю в папку со скриптом архив, запускаю батник, архив распаковывается, удаляются ненужные файлы, потом идет переименование и снова упаковка в архив. Проблемы следующие:
1) Обход производится только по папкам, файлы не затрагиваются. Сделать обход и по файлам тоже у меня не получилось.
2) Если в ключевом слове для поиска есть точка, то замена не работает. Например с ключом
[SITE] все отработает нормально, а с
[SITE.RU] уже проблемы. Как это исправить я не разобрался.
3) После удаления из имени ключа, вначале могут оставаться пробелы. Допустим было имя
"[SITE] Папка №1"
стало
" Папка №1 [NEWSITE.RU]"
Для решения проблемы я пробовал добавлять в сам ключ для поиска, пробел в конце и в целом это проблему решает, но есть вероятность того, что исходное имя может быть
[SITE]Папка №1 и тогда ключ не будет найден. Короче нужно как-то удалять пробел вначале имени.
4) Учитывая, что в папке архив ищется автоматически, возможно ли реализовать вывод предупреждения и останавливать работу скрипта, если в папке будет лежать более одного архива?
5) Сейчас скрипт работает на поиск только одного ключа указанного в
SearchKeyword. Как можно реализовать поиск по нескольким ключам? Например также как это реализовано с удалением файлов. Все файлы которые нужно удалить, хранятся в
LIST_FILES.txt Но, тут получается уже и так цикл в цикле, поэтому я немного запутался)
Все что смог, реализовал, а дальше уже никак... Поэтому буду очень благодарен за помощь. Если потребуется, оплачу)
Для удобства выложил на яндекс диск
исходники