ветвление на выходе программы в командном файле - PullRequest
1 голос
/ 20 февраля 2012

Я застрял на этом некоторое время, и поиск на сайтах справки о том, как программировать в пакетном режиме, только смущает меня.

Контекст заключается в том, что я хочу определить, какие файлы в папкеявляются допустимыми для xml и добавляют все недопустимые файлы в определенный файл для дальнейшей обработки.

При этом я использовал xmlstarlet и с помощью команды ниже, я смог определить, какие из них являются действительными, и направить вывод вмой пакетный файл.

xml val *.xml | myscript.bat

Теперь, что я хочу сделать, это определить, какие из них являются действительными, для этого мне нужно проанализировать вывод xml.exe, который выглядит следующим образом:

20100319.xml - valid
20090915.xml - valid
20090915.xml - valid
20090915.xml - valid
20090915.xml - invalid

Итак, что мне действительно нужно, так это разветвляться в каждой строке, чтобы увидеть, являются ли последние 7 символов «недействительными» или нет, если да, добавьте XML-файл в мой файл результатов.

ПопыткаСделайте так, чтобы я создал скрипт, который вы найдете ниже.

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /F "tokens=*" %%a in ('more') do (
 set full=%%a
 set /p prefix=!full:~-7!
 if %prefix% == "invalid" (type %%a result.xml) else (echo "valid file")
)

Теперь, прежде всего, по конкретному вопросу, я получаю сообщение об ошибке

(type was unexpected at this time.

Затем, если я удаляю ветвь if и заменяю ее на echo %prefix%, я получаю следующий вывод:

- validECHO is off.
- validECHO is off.
- validECHO is off.
- validECHO is off.
invalidECHO is off.

Не могли бы вы помочь мне создать ветку, которая добавит XML-файл в мой файл результатов и избавится от отключения ECHO?Включение @ECHO off приводит к выводу самого кода на экран.

Спасибо за помощь!

Alex

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Джеб поставил диагноз и решил вашу проблему в своих комментариях (пока вы меняете >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
)
0 голосов
/ 20 февраля 2012

Поскольку шаблонами является "FILENAME - RESULT", вы можете использовать цикл FOR, чтобы разделить пробел таким образом, чтобы %%a=FILENAME, %%B=- и %%C=RESULT

for /F "tokens=1,2,3 delims= " %%a in ('more') do (
    if "%%c" neq "valid" (
        echo %%a is invalid [%%c]
        echo %%a >> result.xml
    ) else (
        echo %%a is valid
    )
)

Не уверен насчет type %%a result.xml, я не думаю, что это допустимая команда.

echo %%a >> result.xml добавит имя файла в result.xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...