Я предлагаю следующий пакетный файл для этой задачи:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=E:\Test"
for /F "eol=| delims=" %%I in ('dir "%SourceDir%\meta.xml" /A-D /B /S 2^>nul') do (
set "Country="
set "Year="
for /F "tokens=1,2 delims=< > " %%A in ('%SystemRoot%\System32\findstr.exe /R "<Country>[^<][^<]*</Country> <Year>[^<][^<]*</Year>" "%%I"') do (
if "%%A" == "Country" if not defined Country set "Country=%%B"
if "%%A" == "Year" if not defined Year set "Year=%%B"
)
if defined Country if defined Year (
set "FilePath=%%~dpI"
setlocal EnableDelayedExpansion
echo !FilePath:~0,-1!| %SystemRoot%\System32\findstr.exe /E /I /L /C:" (!Year!) [!Country!]" >nul
for %%J in ("!FilePath:~0,-1!") do if not exist "%%~J (!Year!) [!Country!]" ren "%%~J" "%%~nxJ (!Year!) [!Country!]"
endlocal
)
)
endlocal
ВНИМАНИЕ: Разделителями второго FOR являются левая угловая скобка <
, символ горизонтальной табуляции, правая угловая скобка >
и символ обычного пробела. Поэтому убедитесь, что эти четыре символа находятся в пакетном файле после копирования и вставки кода из окна браузера.
Переменная среды SourceDir
определяется с путем к каталогу без обратной косой черты в конце, поскольку она объединяется с \meta.xml
в следующей строке. Синтаксически было бы неправильно на 100% определять эту переменную с помощью E:\Test
, так как это приводит к строке имени файла E:\Test\\meta.xml
, содержащей два обратного слеша вместо одного между путем к файлу и именем файла.
Для каждого файла meta.xml
, найденного командой DIR в исходном каталоге или любом из его подкаталогов, команда FOR выполняет исполняемый файл FINDSTR , который ищет регистр чувствителен (теги XML чувствительны к регистру) для элементов страны ИЛИ год со строковым значением не менее одного символа. Символ пробела в регулярном выражении поиска интерпретируется FINDSTR как ИЛИ , что не очень хорошо задокументировано.
Если переменные окружения Country
и Year
определены после поиска строк страны и года в meta.xml
, путь к файлу текущего XML-файла назначается переменной окружения FilePath
, которая всегда заканчивается обратной косой чертой .
Теперь пришло время включить отложенное расширение . Его не следует включать до того, как имя папки содержит один или несколько восклицательных знаков, так как в этом случае с отложенным расширением, уже включенным в начале пакетного файла, пакетный файл не будет работать вообще. Пожалуйста, прочитайте этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL , поскольку происходит гораздо больше, чем просто включение отложенного расширения переменной среды.
Полное имя папки с путем выводится с ECHO и перенаправляется для обработки STDIN из FINDSTR , чтобы проверить, заканчивается ли имя папки (( правильный) год в круглых скобках и (правильный) страна в квадратных скобках. Этот дополнительный тест основан на коде, написанном LotPings .
Третий FOR выполняется только в том случае, если имя папки еще не заканчивается (правильным) годом, а страна используется для получения из пути к файлу без обратной косой черты в конце последнего имени папки, на которое ссылается %%~nxJ
, что ссылается на строку после последней обратной косой черты независимо, если эта строка представляет собой имя файла с расширением или именем папки. %%~J
указывает на имя текущей папки с полным путем без обратной косой черты в конце.
Примечание 1: Пакетный файл не предназначен для выполнения с исходным каталогом, являющимся корневым каталогом диска.
Примечание 2: Код не удаляет неправильный год / страну из имени папки, если файл meta.xml
теперь содержит другой год или страну. Таким образом, папка с именем Folder1 (2015) [US]
не переименовывается в Folder1 (2019) [India]
, если meta.xml
в папке Folder1 (2015) [US]
содержит теперь <Country>India</Country>
и <Year>2019</Year>
.
Примечание 3: Разбор строки, выполненный FOR , не работает, если файл XML содержит несколько элементов XML в одной строке. Элементы Country
и Year
должны находиться в отдельных строках без других элементов XML. Поэтому этот пакетный код нельзя использовать, если meta.xml
содержит, например, <Country>India</Country><Year>2019</Year>
в одной строке. Командный процессор Windows не имеет функций для анализа содержимого XML в XML-формате, как это поддерживает PowerShell.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
dir /?
echo /?
endlocal /?
findstr /?
for /?
if /?
ren /?
set /?
setlocal /?