Джеб поставил диагноз и решил вашу проблему в своих комментариях (пока вы меняете >result.xml
на >>result.xml
). Ответ Алекса К. хорош, но он будет работать, только если вы можете гарантировать, что имена файлов не содержат пробелов.
Но есть гораздо более простое и быстрое решение: используйте FINDSTR для фильтрации результатов "xml.exe", сохраняя только те строки, которые заканчиваются на "недопустимый". Я думаю, что не стоит называть ваш выходной файл result.xml, потому что его содержимое не в формате xml. Я переименовал выходной файл в «invalidXML.txt».
xml val *.xml | findstr /e "invalid" >invalidXML.txt
В приведенном выше примере предполагается, что "xml.exe" создает допустимые строки в стиле Windows, оканчивающиеся на <CR><LF>
. Если это не так и "xml.exe" создает строки в стиле Unix, оканчивающиеся на <Lf>
, используйте MORE для преобразования в стиль Windows.
xml val *.xml | more | findstr /e "invalid" >invalidXML.txt
Чтобы получить список допустимых файлов, которые вы можете использовать (при необходимости добавьте БОЛЬШЕ)
xml val *.xml | findstr /e "- valid" >validXML.txt
Приведенное выше сохраняет индикатор «- неверный» или «- действительный» в конце каждой строки, как и исходный код (после отладки). И это работает без необходимости пакетного файла:)
Если вы хотите получить вывод, подобный тому, который предложил Алекс К. (только имена файлов), тогда вы вернетесь к использованию цикла FOR, лучше всего в пакетном файле. Я перенес проверку xml.exe в цикл FOR. Вы можете вернуться к передаче результатов в пакет, если хотите. Это решение будет работать, даже если в имени файла есть пробелы. Я использовал EOL=:
на всякий случай, если имя файла начинается с ;
, что маловероятно, но возможно.
@echo off
setlocal enableDelayedExpansion
for /f "eol=: delims=" %%A in ('xml val *.xml') do (
set "ln=%%A"
if "!ln:~-7!" == "invalid" (>>invalidXML.txt echo !ln:0,~-10!) else echo !ln:0,~-8! is valid
)
Если имя файла содержит !
, то имя будет повреждено на set "ln=%%A"
из-за задержки расширения. Исправление состоит в том, чтобы включать и выключать отложенное расширение в цикле
@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%A in ('xml val *.xml') do (
set "ln=%%A"
setlocal enableDelayedExpansion
if "!ln:~-7!" == "invalid" (>>invalidXML.txt echo !ln:0,~-10!) else echo !ln:0,~-8! is valid
end local
)