Пакетная обработка - синтаксический анализ вывода многострочной команды в переменной

У меня есть пакет, который я использую для запуска нескольких сценариев SQL и записи их вывода в один текстовый файл (SQL_results.txt). Это блок, который запускает скрипт и проверяет результаты на наличие ошибок в начале вывода (ошибки всегда будут в одной строке, начиная с «Msg»):

SQLCMD command_to_run_a_script > error.txt
set /p result=<error.txt
set result=%result:~0,3%
if ""%result%""==""Msg"" exit
type error.txt >> SQL_results.txt
del error.txt

Стоит отметить, что вывод имеет динамическое количество строк и может превышать предел переменной char, и что строка «Msg ...» не всегда может быть первой.

Я пробовал это для проверки выполнения проверки переменной, но он будет записывать только последнюю строку вывода для каждой строки:

for /f "delims=" %%i in ('SQLCMD command_to_run_a_script') do (set VAR=%%i & ECHO %VAR%>> SQL_results.txt)

Можно ли сделать что-то подобное, построчно анализируя результаты, пытаясь найти в переменной тот, который начинается с «Msg», вместо того, чтобы создавать и удалять текстовый файл для каждого сценария?


person VladP    schedule 02.08.2017    source источник
comment
Вы знаете, я уверен, что sqlcmd выйдет из нуля в случае успеха и ненулевое значение в случае ошибки. Чтобы убедиться, проверьте документацию. Но если это правда, вы можете просто sqlcmd command_to_run_a_script || echo There was an error. или что-то подобное. Если код выхода ненадежен, вы также можете sqlcmd command_to_run_a_script | findstr /i "^Msg" >NUL && echo Output contained an error. Something went wrong.   -  person rojo    schedule 03.08.2017
comment
Спасибо, что указали на это, SQLCMD действительно выйдет из-за ошибки, если используется переключатель -b, поэтому я могу работать с этим.   -  person VladP    schedule 03.08.2017


Ответы (1)


Поскольку переменная будет содержать только одну строку, мне не совсем понятно, что вы намереваетесь.

Чтобы отфильтровать в файл только строки с ошибками:

SQLCMD command_to_run_a_script|Findstr "^MSG" > error.txt

Хранить строки MSG в массиве и выводить в конце

@Echo off&Setlocal EnableDelayedExpansion
Set cnt=0
For /f "delims=" %%A in (
  'SQLCMD command_to_run_a_script ^|Findstr "^MSG" '
) Do (
  Set /A cnt+=1
  Set "MSG[!Cnt!]=%%A"
)
Echo had %cnt% MSG lines
For /l %%C in (1,1,%cnt%) Do Set MSG[%%C]
person Community    schedule 03.08.2017
comment
Идея состоит в том, чтобы записать все результаты для всех скриптов в файл SQL_results.txt. Когда возникает ошибка, это также должно быть записано, но затем пакет должен перестать работать. Комментарий rojo изменил способ запуска скриптов и привел к желаемому результату, но спасибо за вашу помощь - person VladP; 03.08.2017