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

How to get an errorlevel in a for /f loop from the command result?

我是 运行 批处理文件中的 SQL 请求,我需要获取错误级别及其提供的输出。我试过使用 :

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

并且在 'do' 中,如果错误级别为 1,那么我可以做任何我打算做的事情,但我似乎无法找到从命令结果中获取错误级别的方法.我也不确定错误级别是否可以在循环中更改,但我正计划对其进行测试,这样我就能知道命令是否会更改错误级别。

这里的问题是分配给环境变量 SQLCommand 的命令行由 FOR 在后台单独的命令进程中执行 cmd.exe /C 和它处理 STDOUT 的输出被 FOR 捕获并逐行处理。因此,无法在执行批处理文件的命令进程中评估 SQL 命令行的退出代码。

最可能的最佳解决方案是 运行 当前命令进程中的 SQL 命令行,将 SQL 命令行的输出重定向到临时文件,评估退出代码并根据退出代码处理输出。

下面的批处理文件演示了这个解决方案。它可以在没有参数的情况下启动,使用有效的 file/folder 名称作为第一个参数,或者使用无效的 file/folder 名称来监视错误处理。

@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

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • set /?
  • setlocal /?

另请参阅 Stack Overflow 问题: