Проблема здесь в том, что командная строка, присвоенная переменной окружения 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 /?
См. Также вопросы переполнения стека: