Вы можете использовать следующий пакетный код выполняется в директории со всеми * .ogg файлов и содержащий также файл XmlFile.xml
с данными XML:
Примечание: Характер между <
и >
после delims=
на Третья строка должна быть горизонтальным символом табуляции. Браузер отображает и копирует символ табуляции в соответствии со стандартом HTML как символ одиночного пробела.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq tokens=1* delims=< > " %%A in ("XmlFile.xml") do (
if "%%A" == "File" (
for /F "tokens=2 delims== " %%C in ("%%B") do set "OggFileName=%%~C.ogg"
) else if "%%A" == "Path" (
set "TargetPath=%%B"
set "TargetPath=!TargetPath:~0,-11!"
for /F "delims=" %%F in ("!TargetPath!") do set "NewFileName=%%~nxF.ogg"
if not exist "!TargetPath!" md "!TargetPath!"
if exist "!OggFileName!" (
move /-Y "!OggFileName!" "!TargetPath!\!NewFileName!"
) else (
echo There is no file !OggFileName! in folder %CD%.
)
)
)
endlocal
Самые внешние ДЛЯ процессов Каждая строка из файла XML и расщепляет каждый непустой строки на две строки:
Имя элемента присваивается переменной цикла A
из-за tokens=1
который составляет File
, ShortName
, Path
, а также /File
, в результате чего следует игнорировать последнее, из-за чего /
не указан в списке разделителей.
Оставшиеся линии после того, как пространства или >
после имени элемента присваиваются переменной B
следующего контура является следующим символом в ASCII-таблице после того, как A
из-за *
приложенные после tokens=1
, которые являются для этого примера:
Id="14518742" Language="SFX">
Creatures\Fish_Large_Swim_03.wav</ShortName>
SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path>
Проверяемые по регистру сравнения значения переменной цикла A
производятся рядом с идентификацией тех строк, которые необходимо обработать.
Линия с именем элемента File
содержит имя файла *.ogg в значении атрибута Id
. Другой FOR используется для разделения строки, назначенной переменной цикла B
с использованием символов равенства и пробела в качестве разделителя.
Из строки Id="14518742" Language="SFX">
только вторая подстрока "14518742"
после знака равенства представляет интерес, что является причиной использования tokens=2
. Эта строка без двойных кавычек и с добавлением .ogg
присваивается переменной окружения OggFileName
для последующего использования.
Еще один интересный объект: Path
, содержащий путь к папке, а также имя файла * .ogg.
Так из строки SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path>
, присвоенной переменной цикла B
сначала удаляются последние 11 символов, чтобы получить путь к целевой папке пути SFX\Creatures\Fish_Large_Swim_03_9344E057
.
еще раз команда FOR используется, чтобы получить присваивается переменной окружения NewFileName
строку после последней обратной косой черты, которые должны быть новое имя файла для * .ogg файла. Поскольку расширение чтения .wem
было уже удалено до того, как %%~nxF
используется вместо %%~nF
, если имя файла содержит еще одну точку, которая интерпретируется на уже усеченном имени файла в качестве разделителя расширений файла.
Далее каталог создается, если он еще не существует, и файл * .ogg перемещается в этот каталог с новым именем файла, если он вообще существует в текущем каталоге.
Для перемещения файла с сохранением идентификатора в качестве имени файла, используй пакетный код, приведенный ниже, на котором только линию определения имени файла для переменной среды NewFileName
и отсроченной расширенной ссылки на эти переменные среды на линии с командой MOVE был удален в сравнение с вышеуказанным пакетным кодом.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq tokens=1* delims=< > " %%A in ("XmlFile.xml") do (
if "%%A" == "File" (
for /F "tokens=2 delims== " %%C in ("%%B") do set "OggFileName=%%~C.ogg"
) else if "%%A" == "Path" (
set "TargetPath=%%B"
set "TargetPath=!TargetPath:~0,-11!"
if not exist "!TargetPath!" md "!TargetPath!"
if exist "!OggFileName!" (
move /-Y "!OggFileName!" "!TargetPath!\"
) else (
echo There is no file !OggFileName! in folder %CD%.
)
)
)
endlocal
Для понимания используемых команд и как они работают, откройте окно командной строки, выполните там следующие команды, и читать полностью все справочные страницы отображаются для каждой команды очень тщательно.
echo /?
endlocal /?
for /?
if /?
move /?
set /?
setlocal /?
Хотя это может быть сделано в пакетном режиме, обработка xml лучше подходит для других языков программирования. – DavidPostill
Обратите внимание: https://stackoverflow.com не является бесплатной службой написания сценариев/кодов. Если вы сообщите нам, что вы пробовали до сих пор (включая скрипты/код, который вы уже используете), и где вы застряли, мы можем попытаться помочь с конкретными проблемами. Вы также должны прочитать [Как задать хороший вопрос?] (Https://stackoverflow.com/help/how-to-ask). – DavidPostill