Как найти и удалить в именах файлов и папок все ключевые слова из определенного списка?

Всем привет!

Задача такая. Есть архивы в которых имена папок и файлов содержат определенные ключевые слова, например:


[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

Почитав мануалы и поискав инфу в интернете, я смог набросать вот такой скрипт:
spoiler
chcp 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 Но, тут получается уже и так цикл в цикле, поэтому я немного запутался)

Все что смог, реализовал, а дальше уже никак... Поэтому буду очень благодарен за помощь. Если потребуется, оплачу)

Для удобства выложил на яндекс диск исходники
  • Вопрос задан
  • 884 просмотра
Пригласить эксперта
Ответы на вопрос 1
KJhas
@KJhas
Хм. Очень неудобный язык для этой задачи... Это критично вообще?
У меня подобные вещи легко решаются бейсиком от word'а... ('97).
Set she=CreateObject("Scripting.fileSystemObject")...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы