如何从命令结果中获取for / f循环中的错误级别?

时间:2018-05-18 18:37:21

标签: sql batch-file errorlevel

我在批处理文件中运行SQL请求,我需要获取errorlevel以及它给出的输出。我尝试过使用:

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

并且在'do'中,如果errorlevel为1,那么我可以做任何我打算做的事情,但我似乎找不到从命令结果中获取errorlevel的方法。我也不确定错误级别是否可以在循环中改变,但是我正计划测试它,因此我想知道命令是否改变了错误级别。

1 个答案:

答案 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问题: