我正在批处理文件中运行 SQL 请求,我需要获取错误级别以及它提供的输出。我试过使用:
for /f "tokens=*" %%i in ('%SQLCommand%') do ( ...
在“do”中,如果错误级别为 1,那么我可以做我计划做的任何事情,但我似乎无法找到从命令结果中获取错误级别的方法。我也不确定错误级别是否可以在循环中改变,但我正计划测试它,这样我就可以知道命令是否改变了错误级别。
最佳答案
这里的问题是分配给环境变量SQLCommand
的命令行由 执行对于 在后台单独的命令进程中使用 cmd.exe /C
及其输出处理 标准输出 被 捕获对于 并逐行处理。因此,无法在执行批处理文件的命令进程中评估 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 /?
另请参阅堆栈溢出问题:
关于sql - 如何从命令结果中获取 for/f 循环中的错误级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417398/