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

标签 sql batch-file errorlevel

我正在批处理文件中运行 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 /?

  • 另请参阅堆栈溢出问题:
  • What are the ERRORLEVEL values set by internal cmd.exe commands?
  • Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?
  • 关于sql - 如何从命令结果中获取 for/f 循环中的错误级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417398/

    相关文章:

    php - 如何防止PHP中的SQL注入(inject)?

    mysql - 如何查询多行的平均时差?

    java - 将表从 postgresql 数据库绑定(bind)到 Netbeans GUI 表时出错

    Windows 批处理脚本 : substring calculation

    windows - 在 setenv.bat 中为 tomcat 7 windows 安装(作为服务)编写 set JAVA_OPTS 的位置

    Windows 批处理 - ECHO 正在更改 %ERRORLEVEL%

    c# - 在 EF Code First 中跟踪 SQL 查询

    string - 使用批处理脚本解析字符串

    windows - 使用管道时如何检测 diskpart 中的错误?

    Windows 批处理文件包含所有错误级别