@ECHO OFF
SETLOCAL
SET filename=metadata.xml
(
FOR /F %%D in ('dir /b /a:D') DO IF EXIST "%%D\%filename%" (
CALL :process "%%D\%filename%"
)
)>result.txt
GOTO :eof
:process
CALL :filter %1 art artist_name
CALL :filter %1 titl title
CALL :filter %1 trak track_number
ECHO "%art%","%titl%","%trak%"
GOTO :eof
:filter
FOR /f "delims=" %%i IN ('type %1 ^|findstr /c:"<%3>"') DO (SET %2=%%i)
CALL SET "%2=%%%2:*%3=%%"
CALL SET "%2$=%%%2:*/%3=%%xx%3"
CALL SET "%2=%%%2:~1%%"
:lop
CALL SET "%2=%%%2:~0,-1%%"
CALL SET "%2$=%%%2$:~1%%"&IF DEFINED %2$ GOTO lop
GOTO :eof
ПОЛНОСТЬЮ ЗАМЕНИТЬ код 20130423-0805Z
Оказавшись в ловушке замедленного расширения.
Запуск в моей тестовой системе насчитывает более 300 подкаталогов. Упрощение и передача не совсем работа ...
На этот раз наверняка ...
убедитесь, что файл существует в подкаталоге.
фильтр из файла в (арт TITL Трак) содержимое между тегами (ARTIST_NAME название track_number) отображения результатов
- результаты перенаправляются в выходной файл 'result.txt'
Подпрограмма :FILTER
ищет строку, представленную в качестве третьего аргумента («тег»), до :FILTER
, в пределах <
.. >
и присваивает результат переменной, заданной вторым аргументом :filter
(«var»)
- VAR затем присваивается% вар: * тег =%, что полоски все до конца строки тега из ВДПА
- Затем VAR $ присваиваются% вар: */тег% xxtag который все следующие /тег (в случае, если больше данных следует/тег) + тег снова +- символы (хй =/и <)
- Ведущее «>», затем удаляются из ВДПА
- персонажа затем отваливается от конца VAR и VAR $ (который будет инициализирован «anystraydataattheendoftclosetagxxtag»), пока VAR $ не будет пустым, wh ich удаляет тег close и любые дополнительные данные.
Ah- несколько данных трека в файл.
>report.txt
просто отправляет результаты в файл, а не на экран. Целесообразно полностью
@ECHO OFF
SETLOCAL
SET filename=%1&IF NOT DEFINED filename ECHO syntax:%~n0 startingdirname&GOTO :EOF
PUSHD "%~1"
SET filename=metadata.xml
(
FOR /F %%D in ('dir /b /a:D') DO IF EXIST "%%D\%filename%" (
SET skipto=1
CALL :process "%%D\%filename%"
)
)>report.txt
POPD
GOTO :eof
:process
FOR %%i IN (art titl trak) DO SET "%%i="
CALL :filter %1 art artist_name
IF NOT DEFINED art GOTO :eof
CALL :filter %1 titl title
CALL :filter %1 trak track_number
ECHO "%art%","%titl%","%trak%"
GOTO process
:filter
FOR /f "skip=%skipto% delims=" %%i IN (
'type %1^|FINDSTR /n "$"') DO if not defined %2 (
ECHO "%%i"|findstr /c:"<%3>" >nul
IF NOT ERRORLEVEL 1 (
SET "%2=%%i"
FOR /f "delims=:" %%L IN ("%%~i") DO SET skipto=%%L
)
)
)
IF NOT DEFINED %2 GOTO :EOF
CALL SET "%2=%%%2:*%3=%%"
CALL SET "%2$=%%%2:*/%3=%%xx%3"
CALL SET "%2=%%%2:~1%%"
:lop
CALL SET "%2=%%%2:~0,-1%%"
CALL SET "%2$=%%%2$:~1%%"&IF DEFINED %2$ GOTO lop
GOTO :eof
Исправленная версия.
обрабатывает каждый файл найден в :process
после установки - явные переменные, которые будут использоваться - попытаться найти ART
с помощью тега - если найден, повторите с titl
и trak
, выход и повторите попытку. - если не найден, выйдите и перейдите к следующему файлу.
Процедура FILTER
- просматривает каждую строку в источнике, но сначала номера каждой строки с linenumber:
. Первые строки %skipto%
пропускаются. - находит первую строку после пропущенных строк, которая содержит целевой тег - устанавливает переменную в содержимое всей пронумерованной строки и затем захватывает часть пронумерованной строки до, но не включает первый двоеточие, и помещает эту в SKIPTO
- другие совпадающие строки игнорируются, поскольку теперь определена переменная.
Если переменная не была установлена в подпрограмме, то после строки skipto
дополнительных элементов данных нет, иначе, когда мы посмотрим на файл, мы знаем, что мы обработали до строки skipto
, поэтому следующая переменная будет назначена следующему элементу данных, пропуская все ранее найденные элементы.
(редактировать 20130425-1640Z Добавлен PUSHD
/POPD
изменить целевые относительный корень)
Вашего объяснения insuffizient. Не иметь понятия о вашей структуре данных. – Endoro
Вы должны показать гораздо больше своего xml, чтобы мы могли видеть TOKENS. – Endoro