2016-08-29 1 views
-2

У меня есть звуковые файлы с именем ID. Единственный способ найти звуки - перебирать через референтный банк, в котором есть имена файлов.Пакетный сценарий с использованием имен файлов из файла XML для организации звуковых файлов

Что я хочу достичь - это сценарий, который находит идентификатор, и «Путь», чтобы переименовать файл и организовать указанный файл.

Вот данные из XML, который содержит информацию о звуках:

<File Id="14518742" Language="SFX"> 
     <ShortName>Creatures\Fish_Large_Swim_03.wav</ShortName> 
     <Path>SFX\Creatures\Fish_Large_Swim_03_9344E057.wem</Path> 
</File> 

Требования к задаче: Найти <file ..., который имеет идентификатор 14518742, который является имя файла, например, 14518742.ogg. Я хочу, чтобы переместить файл в каталог, хранящегося в <Path>:

SFX\Creatures\Fish_Large_Swim_03_9344E057 

Из-за некомпетентности я не могу даже получить ID:

@FOR /F "delims= " %%i IN ('find "<File Id=" Bankinfo.xml') DO @(
    @for /f "delims= " %%a in ("%%i") do @(
     set %%i=%%a 
     set %id%=%%i 
     Rem This was an attempt to trim the string, thing is that I can't find out why this doesn't work, because percentage signs. 
     set %id%=%id:~-7,7% 
     ) 
    ) 
pause 

я не мог решить эту проблему, пытаясь урезать строки , Мне удалось использовать разделители. Даже тогда я, вероятно, не смог бы это завершить.

Редактировать # 2: Пересмотрено из-за того, что «удерживается как слишком широкий» и сгустил его, потому что он был слишком длинным. Я извинюсь, потому что я мало знаю о сценариях (по крайней мере, с CMD) или любом правильном этикете относительно того, как задавать вопросы на этом сайте.

+0

Хотя это может быть сделано в пакетном режиме, обработка xml лучше подходит для других языков программирования. – DavidPostill

+3

Обратите внимание: https://stackoverflow.com не является бесплатной службой написания сценариев/кодов. Если вы сообщите нам, что вы пробовали до сих пор (включая скрипты/код, который вы уже используете), и где вы застряли, мы можем попытаться помочь с конкретными проблемами. Вы также должны прочитать [Как задать хороший вопрос?] (Https://stackoverflow.com/help/how-to-ask). – DavidPostill

ответ

1

Вы можете использовать следующий пакетный код выполняется в директории со всеми * .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 и расщепляет каждый непустой строки на две строки:

  1. Имя элемента присваивается переменной цикла A из-за tokens=1 который составляет File, ShortName, Path, а также /File, в результате чего следует игнорировать последнее, из-за чего / не указан в списке разделителей.

  2. Оставшиеся линии после того, как пространства или > после имени элемента присваиваются переменной 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 /?
Смежные вопросы