Как получить уровень ошибки в цикле for / f из результата команды? - PullRequest
0 голосов
/ 18 мая 2018

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

for /f "tokens=*" %%i in ('%SQLCommand%') do ( ...

и в 'do', если уровень ошибки равен 1, тогда я могу делать все, что планирую, но не могу найти способ получитьуровень ошибки от результата команды.Я также не уверен, что уровень ошибки может измениться во время цикла, но я планировал его протестировать, чтобы узнать, изменила ли команда уровень ошибки.

1 Ответ

0 голосов
/ 19 мая 2018

Проблема здесь в том, что командная строка, присвоенная переменной окружения SQLCommand, выполняется FOR в отдельном командном процессе в фоновом режиме с cmd.exe /C и его выводом для обработки STDOUT захватывается FOR и обрабатывается построчно.По этой причине код завершения командной строки SQL не может быть оценен в командном процессе, выполняющем командный файл.

Наиболее вероятным лучшим решением является выполнение командной строки SQL в текущем командном процессе с перенаправлением вывода SQLкомандную строку во временный файл, вычисляя код выхода и обрабатывая вывод в соответствии с кодом выхода.

Пакетный файл ниже демонстрирует это решение.Его можно запустить без аргумента, с допустимым именем файла / папки в качестве первого аргумента или с недопустимым именем файла / папки для наблюдения за обработкой ошибок.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "OutputFile=%TEMP%\%~n0.tmp"

if "%~1" == "" ( set "DirArg=%TEMP%" ) else set "DirArg=%~1"
set "SQLCommand=dir /A /B "%DirArg%""

%SQLCommand% >"%OutputFile%" 2>nul
echo/

if errorlevel 1 (
    echo An error occurred on execution of command:
    echo/
    echo %SQLCommand%
    echo/
    echo Exit code is: %ERRORLEVEL%
    goto EndBatch
)

echo Execution of command was successful. The output is:
echo/

for /F "usebackq delims=" %%I in ("%OutputFile%") do echo %%I

:EndBatch
del "%OutputFile%"
endlocal
echo/
pause

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

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?

См. Также вопросы переполнения стека:

...