我试图从一个批处理文件中运行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? 具体来说,我收到的错误是表不存在。 谢谢。
的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%"
通过@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%