Как мне разорвать мой цикл For, если возвращается ошибка - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно прервать пакетную команду sqlcmd, если в сценариях .sql в папке с одним или несколькими файлами сценариев .sql возникает какая-либо ошибка.

for %%G in (*.sql) do sqlcmd -b /S "ServerInstance" /d "DBName" -U "Username" -P "Password" -i "%%G"
IF %ERRORLEVEL% ==1 EXIT /b

Эта команда выполняет все файлы в папке по одномуодин (по порядку) у меня в папке два .sql файла скрипта;Ошибка возврата первого скрипта при выполнении - вот где я хочу прервать выполнение, но это не прерывает и продолжает выполнение второго скрипта в папке.

1 Ответ

0 голосов
/ 01 марта 2019

Поскольку у вас есть запрос if %ErrorLevel%==1 после цикла, он, конечно, не завершен.

Перемещение его в цикл решит вашу проблему, хотя я бы не проверял ErrorLevel для 1Я бы лучше проверил, чтобы он не был 0:

for %%G in (*.sql) do (
    sqlcmd -b /S "ServerInstance" /d "DBName" -U "Username" -P "Password" -i "%%~G"
    if not ErrorLevel 1 exit /B
)

. Это приведет к выходу из цикла, если встретится значение ErrorLevel 1 или выше, поэтому ожидается, что ваша команда выполнитне производить отрицательное значение.(Приятным побочным эффектом этого синтаксиса является то, что он не требует расширение переменной с задержкой , которое потребуется для условия типа if !ErrorLevel! neq 0.)


Еще лучше иБолее простой подход - использовать оператор условного выполнения ||, который проверяет код завершения предыдущей команды (который в большинстве случаев совпадает с ErrorLevel) и выполняет следующий только в случаененулевое значение:

for %%G in (*.sql) do (
    sqlcmd -b /S "ServerInstance" /d "DBName" -U "Username" -P "Password" -i "%%~G" || exit /B
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...