我在批处理文件中运行SQL请求,我需要获取errorlevel以及它给出的输出。我尝试过使用:
for /f "tokens=*" %%i in ('%SQLCommand%') do ( ...
并且在'do'中,如果errorlevel为1,那么我可以做任何我打算做的事情,但我似乎找不到从命令结果中获取errorlevel的方法。我也不确定错误级别是否可以在循环中改变,但是我正计划测试它,因此我想知道命令是否改变了错误级别。
答案 0 :(得分:2)
此处的问题是,分配给环境变量SQLCommand
的命令行由 FOR 在后台的单独命令进程中执行cmd.exe /C
并且其输出处理< strong> 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 /?
另请参阅Stack Overflow问题: