Я постоянно ищу это. И видел немало страниц SO по этому поводу, но ни одна из них, похоже, не работает для меня. У многих из них есть токены, которые я не могу использовать, поскольку мой атрибут «имя файла» может находиться где угодно в теге.
<?xml version = "1.0" encoding = "UTF-8" ?>
<thisprog>
<sessions>
<main>
<File fvl = "0" offst = "0" filename = "c:\here\there.txt" backupFilePath = "" />
<File filename = "c:\here\there2.txt" mapWrapIndentMode = "-1" wrappie = "no" />
<File wrapCount = "1" filename = "c:\here\folder1\oops.txt" wrappie = "no" />
<File lang = "None" encd = "-1" ro = "no" filename = "c:\here\folder 2\foop.txt" />
</main>
</sessions>
</thisprog>
Я пытаюсь получить пакет, чтобы получить атрибуты «имя файла» и объединить их вместе. В итоге получите (и кавычки, поскольку они являются каталогами и могут содержать пробелы):
"c:\here\there.txt" "c:\here\there2.txt" "c:\here\folder1\oops.txt" "c:\here\folder 2\foop.txt"
Я попробовал код здесь Копирование атрибутов, но мне не удалось объединить строки имен файлов. Должно быть, я что-то упускаю.
@echo off&setlocal
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "XML=%~1"
set "TAG=%~2"
set "PAR=%~3"
set "ALLFILES = "
rem // Define defaults here:
if not defined XML set "XML=presentation.xml"
if not defined TAG set "TAG=slideshow"
if not defined PAR set "PAR=date"
set "FLAG = "
for /F usebackq^ delims^=^ eol^= %%L in ("%XML%") do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
set "REST=!LINE:*<%TAG%=!"
if not defined REST (
set "FLAG=#"
) else (
set "REST=!LINE:*<%TAG% =!"
if not "!REST!"= = "!LINE!" (
set "FLAG=#"
) else (
set "REST=!LINE:*<%TAG% =!"
if not "!REST!"= = "!LINE!" (
set "FLAG=#"
)
)
)
for /F "tokens=1,2 delims=>" %%E in ("!REST!/") do (
if defined FLAG (
endlocal
set "FLAG=#"
) else (
endlocal
)
set "REST=%%E"
if defined FLAG (
call :GET_ATTR "REST:~,-1" "%PAR%"
)
if not "%%F"= = "" (
set "FLAG = "
)
setlocal EnableDelayedExpansion
)
endlocal
)
echo "the end"
echo %ALLFILES%
endlocal
exit /B
:GET_ATTR var_string param_name
setlocal DisableDelayedExpansion
set "PAR=%~2"
setlocal EnableDelayedExpansion
set "STR=!%~1!"
set "ALLFILESFUNC=%%~S "
set "NEXT = "
for %%S in (!STR!) do (
if defined NEXT (
endlocal
echo the filename - "%%~S"
rem //This is the filename attribute but I can't get it to concatenate to an accumulative string
rem echo(%%~S
set "NEXT = "
rem //It's not collecting the strings.
set "ALLFILESFUNC=!ALLFILESFUNC! "^%%~S"^ "
echo Accumulative - %ALLFILESFUNC%
setlocal EnableDelayedExpansion
)
set "STR=!STR:*%%S=!"
if "%%S"= = "%PAR%" (
if defined STR (
if "!STR:~,1!"= = " = " (
if "!STR:~1,1!"= = " " (
echo(
) else if "!STR:~1,1!"= = " " (
echo(
) else (
set "NEXT=#"
)
)
)
)
)
if defined NEXT echo(
endlocal
endlocal
exit /B
Любая помощь будет оценена по достоинству.
Обновлено: у меня есть имя файла, но я не буду собирать все имена файлов в одну переменную ALLFILESFUNC.
@YitzhakKhabinsky, ограничения.
Мои симпатии. Попытка проанализировать XML в Windows Batch подобна попытке сделать прекрасную мебель с помощью примитивных каменных инструментов.
Microsoft также создала инструмент для анализа XML-файлов. MSXSL. Раньше использовал его в нескольких пакетных файлах.
Почему вокруг переменной FOR стоят восклицания? set "ALLFILES=!ALLFILES! !%%S! "
@Squashman, я все еще новичок в этом. Поэтому я пробовал разные вещи. Что я должен делать?
Может быть, убрать восклицания!
Сделанный. Я обновил его выше. Я чувствую, что оно почти у цели. Он просто не собирает все имена файлов.
Переменные в пакете имеют ограничение на размер. В него можно втиснуть только определенное количество имен файлов (символов).
@Squashman, я просмотрел msxsl, но сценарий должен быть файлом wbt. Как ты ими управляешь?!
Понятия не имею, о чем вы говорите. Все, что мне когда-либо было нужно, это Input.xml, файл XSL, чтобы сообщить программе, что вы хотите от файла XML и msxsl.exe.
@Squashman, судя по всему, msxsl или xslt не входят в Windows 10. Learn.microsoft.com/en-us/answers/questions/1182035/…
Если вы будете искать достаточно усердно, вы все равно сможете найти исполняемый файл для загрузки. Microsoft удалила прямую загрузку exe-файла со своего сайта. Он запускает find в Windows 10.





Боюсь, я не понимаю ваш код...
Вот как бы я это сделал:
@echo off
setlocal EnableDelayedExpansion
set "AllFiles = "
(for /F "tokens=1*" %%a in ('findstr "filename = " test.txt') do (
set "line=%%b"
for /F "delims = " %%c in (^"!line:" = "^
!^") do set %%c
set "AllFiles=!AllFiles! !filename!"
)) 2> NUL
echo AllFiles=%AllFiles%
Выход:
AllFiles= "c:\here\there.txt" "c:\here\there2.txt" "c:\here\folder1\oops.txt" "c:\here\folder 2\foop.txt"
Почему бы не использовать Powershell для этой задачи?