在批量For循环PSQL错误级别(PSQL Error Level in Batch For Loo

2019-10-23 08:10发布

我试图从一个批处理文件中运行Postgres的查询。 不过,我迄今无法在命令无法检测。 以下是我迄今为止尝试:

@FOR /F %%A IN ('PSQL -U userName -d dbName -t -c "SELECT * FROM nonExistantTable" 2^>^&1') DO @(
    ECHO !ERRORLEVEL!
)

我也曾尝试以下操作:

1)添加SQL命令“CALL”之前( CALL PSQL -U ...
2)添加“-v ON_ERROR_STOP = 1”到SQL命令,都具有和不具有“CALL”指令( PSQL -U ... -v ON_ERROR_STOP=1

然而,ERRORLEVEL的值总是出来为零。 有谁知道如何在通话中检测到错误使用一批PSQL? 具体来说,我收到的错误是表不存在。 谢谢。

Answer 1:

for /f在一个单独的执行命令cmd实例和errorlevel从这个实例未导出到代码里面do子句。

更好的方法来处理它在纯批次是:

  • 发送程序的输出到一个临时文件
  • 检查错误级别
  • 如果没有错误处理的文件输出
  • 在任何情况下删除年底的临时文件

就像是

set "tempFile=%temp%\%~n0.%random%%random%%random%.tmp"
> "%tempFile%" 2>&1 (
    PSQL -U userName -d dbName -t -c "SELECT * FROM nonExistantTable"
)
if not errorlevel 1 (
    for /f "usebackq delims=" %%g in ("%tempFile%") do (
        echo %%g
    )
) else (
    echo ERRORLEVEL: %errorlevel%
)
del /q "%tempFile%"


Answer 2:

通过@MCND答案可以概括为:

1)通常运行命令,重定向标准输出到一个临时文件
2)基于ERRORLEVEL处理该文件的内容

基于这个答案,我想出了适合我的特殊需要用更少的代码的解决方案。 我的情况有点特殊,在该PSQL命令不正是执行下列操作之一:

1)写入的结果到stdout,并返回零
2)写入一个错误到stderr,并返回非零

在情况#1,我希望我的批处理文件,打印出结果并返回0的情况下,#2,我想执行一些自定义逻辑,打印错误,并返回非零值。 对于这种逻辑,我发现了以下工作得更好:

:: Get a temporary file name
@SETLOCAL
@SET TEMP_OUT="%TEMP%\myScriptError.log"

:: Create the command that will be executed
@SET DB_SELECT=SELECT * FROM nonExistantTable
@SET DB_COMMAND=PSQL -U userName -d dbName -t -c "%DB_SELECT%"

:: Run the command
@FOR /F %%A IN ('%DB_COMMAND% 2^>%TEMP_OUT%') DO @(
    REM This code only runs if there are no errors
    SET EXIT_CODE=0
    GOTO :CLEANUP
)

:: Uh-oh, there was an error.  Print it to stderr, and set the exit code.
@MORE %TEMP_OUT% 1>&2
@SET EXIT_CODE=1
...

:: Clean up the temp file and return the result
:CLEANUP
@DEL /F /Q %TEMP_OUT%
@ENDLOCAL & EXIT /B %EXIT_CODE%


文章来源: PSQL Error Level in Batch For Loop